目录

1.独立按键控制LED灯亮灭

2.独立按键控制LED灯状态

3.独立按键控制LED灯显示二进制

4.独立按键控制LED灯位移

5.附录


1.独立按键控制LED灯亮灭

独立按键控制LED灯状态,在独立按键按下时,LED灯点亮,松手后LED灯熄灭。独立按键按下为0,松开为1,在STC89C52RC芯片上,P2为LED灯IO口,P2_0表示第一个LED灯,其他LED灯以此类推,可以通过查看芯片原理图知道。

#include void main(){while(1){if(P3_1==0){P2_0=0;}else{P2_0=1;}}}

2.独立按键控制LED灯状态

机械式按钮按下或释放时,由于机械弹性作用的影响,总是伴随有一定时间的触点机械抖动,之后触点才稳定下来。在抖动期间,触点的连接状态、导电特性不稳定,接口信号的电平也不稳定,其抖动过程如图 所示,图中 t1和 t3为抖动时间,其时长与按钮开关的机械特性有关,一般20ms;t2为按键闭合的稳定期,其时间由使用者按键的动作确定,一般为几百毫秒以上, t0和t1为按键释放期。
与处理速度为微秒级的单片机相比而言,这种机械抖动是不可忽略的。如果在触点抖动期间进行按键的通断状态检测,那么可能会导致判断出错,即按键一次操作(按下或释放)被错误地认为是多次操作,从而使单片机产生错误的动作,这是不允许出现的。因此,为了避免按键触点机械抖动所导致的检测误判,必须采取相应的去抖动措施。消除按键抖动可以采用硬件方法,如在按键电路中增加 RS 触发器电路或 RC 积分电路进行消抖;也可采用软件方法,在按键扫描程序中增加相应的代码进行消抖。前者需要增加电路成本,且设备体积也随之增大;后者仅占用少量的 CPU 时间,单片机应用系统多采用软件方法消抖。
软件实现键信号去抖动处理的基本思想是:延时法,即当 CPU 检测到有按键按下时,执行一个20ms左右(时长可按键类型适当调整)的延时程序后再进行按键检测,如果检测到按键仍处于被按下状态,则确认按键被按下;反之,则认为是机械抖动引起的状态变化。对按键释放识别也是采用相同的办法处理。需要注意的是,如果单片机软件系统采用按键定时扫描方式,且扫描周期比软件去抖动的延时时间短,则需要对去抖动的延时程序做特殊的处理,否则可能会引起键盘误读错误。

#include void Delay(unsigned int xms)//@12.000MHz{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}void main(){while(1){if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);P2_0=~P2_0;}}}

3.独立按键控制LED灯显示二进制

unsigned char 表示0~255的八位二进制数,与LED灯IO口位数正好相同。

#include void Delay(unsigned int xms)//@12.000MHz{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}void main(){unsigned char LEDNum=0;while(1){if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);LEDNum++;P2=~LEDNum;}}}

4.独立按键控制LED灯位移

通过独立按键控制LED灯向左或者向右位移

#include unsigned char LEDNum;void Delay(unsigned int xms)//@12.000MHz{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}void main(){P2=~(0x01);while(1){if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);LEDNum++;if(LEDNum>=8)LEDNum=0;P2=~(0x01<<LEDNum);}if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);if(LEDNum==0){LEDNum=7;}else{LEDNum--;}P2=~(0x01<<LEDNum);}}}

5.附录

<<位运算,0x01<

例如:0000 0001<<1表示0000 0010

~是取反运算符~(0x01)表示1111 1110