一个基于STC89C51设计的带两个LED,两个独立按键的系统。
设计要求
按键K0为LED0的开关,按键K1为系统自锁状态切换按键;LED0为系统控制对象,LED1为自锁状态指示。系统处于非自锁状态时,按下K0,则LED0亮,松手即灭。当系统处于自锁状态时,每按下一次K0,LED0的亮灭状态发生一次改变。
按键去抖动
按键消去抖动原理
按键去抖动主要有硬件去抖与软件去抖,这里采用低采样率去抖的方式。实际操作是使用定时中断的方式实现,设定定时时长在20ms-200ms即可。实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| KEY0 EQU P1.0 KEY1 EQU P1.1 LED0 EQU P2.0 LED1 EQU P2.1 ORG 0000H AJMP MAIN ORG 000BH AJMP TIMERO ORG 0030H MAIN: CLR F0 SETB LED0 SETB LED1 MOV TMOD,#01H MOV TH0,#03CH MOV TL0,#0B0H MOV IE,#82H SETB TR0 SJMP $ TIMERO: MOV TH0,#03CH MOV TL0,#0B0H ACALL KEYPRESS RETI KEYPRESS: . . . RET
|
按键延迟处理
为防止一次按键按下时被多次读键,因而要加入按键延时。由于在该设计方案中涉及到长按的操作为防止闪烁,因此要在按键按下时加入死循环。实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| KEYPRESS: JNB KEY0,K0 JNB KEY1,K1 AJMP OUT K0: JNB F0,T001 CPL LED0 JNB KEY0,$ AJMP OUT T001: CLR LED0 JNB KEY0,$ SETB LED0 AJMP OUT K1: CPL F0 CPL LED1 JNB KEY1,$ OUT:RET
|
最终完成代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| KEY0 EQU P1.0 KEY1 EQU P1.1 LED0 EQU P2.0 LED1 EQU P2.1 ORG 0000H AJMP MAIN ORG 000BH AJMP TIMERO ORG 0030H MAIN: CLR F0 SETB LED0 SETB LED1 MOV TMOD,#01H MOV TH0,#03CH MOV TL0,#0B0H MOV IE,#82H SETB TR0 SJMP $ TIMERO: MOV TH0,#03CH MOV TL0,#0B0H ACALL KEYPRESS RETI KEYPRESS: JNB KEY0,K0 JNB KEY1,K1 AJMP OUT K0: JNB F0,T001 CPL LED0 JNB KEY0,$ AJMP OUT T001: CLR LED0 JNB KEY0,$ SETB LED0 AJMP OUT K1: CPL F0 CPL LED1 JNB KEY1,$ OUT:RET
|
返回