1、硬件连接。
下载器连接;
LED连接;
按键已经PCB里面连接好;
2、按键原理
为什么识别按键按下之后还需要再识别一次呢。实际上为了消抖,那到底什么是消抖。根据硬件按键原理图可以知道,开发板上的按键是直接连接到IO口上的,那么如果在按键按下的时候,会发生多次循环响应。51单片机的处理速度足够整个while循环里面的程序在一瞬间来回运行若干次了,那么如果直接检测按键的话,会出现很不稳定的情况。比如说按键控制数码管上的数字依次加一,按一次就加一次。如果不进行消抖处理的话,那么在你按下去的一瞬间,数字已经加了很多次了。所以在这里用了软件延时的消抖,避免重复检测的情况。有人可能心想,为什么不弄一个硬件消抖的电路呢,那当然可以,加一个电容就可以了,也称之为电容按键,一般来说,stm32的开发板上都采用的电容按键,也就是硬件消抖,那样根本无需再用软件延时消抖了。
3、程序:
先定义引脚。
然后进行编程。注意去抖动。
编程的时候,可以给每个按键设定一个变量作为旗帜,当安下去的时候,旗帜=1进行翻转,后面可以查询到哪一个按键按下去。
4、例程。
4个按键,实现不同的LED闪烁模式。
#include<stc8a8k.h>
sbit key0=P3^4;
sbit key1=P3^5;
sbit key2=P3^6;
sbit key3=P3^7;
sbit LED0=P0^0;
sbit LED1=P0^1;
void delay1ms(unsigned int tms)
{
unsigned int ix=0,iy=0;
for(ix=tms;ix>0;ix--)
for(iy=0;iy<1350;iy++);
}
void main()
{
unsigned char key0flag=0,key1flag=0,key2flag=0,key3flag=0;
while(1)
{
//判断按键按下,去抖动,然后让对应的按键的旗帜举起来切换
if(key0==0)
{
delay1ms(15);
if(key0==0)
{
key0flag=1;
key1flag=0;
key2flag=0;
key3flag=0;
}
}
else if(key1==0)
{
delay1ms(15);
if(key1==0)
{
key0flag=0;
key1flag=1;
key2flag=0;
key3flag=0;
}
}
else if(key2==0)
{
delay1ms(15);
if(key2==0)
{
key0flag=0;
key1flag=0;
key2flag=1;
key3flag=0;
}
}
else if(key3==0)
{
delay1ms(15);
if(key3==0)
{
key0flag=0;
key1flag=0;
key2flag=0;
key3flag=1;
}
}
//根据旗帜进行判断执行不同的LED工作模式
if(key0flag==1)
{
LED0=0;LED1=0;
}
else if(key1flag==1)
{
LED0=0;LED1=1;
}
else if(key2flag==1)
{
LED0=1;LED1=0;
}
else if(key3flag==1)
{
LED0=1;LED1=1;
}
}
}