在一些需要按键比较少的场合,不需要设计复杂的键盘,只要有几个按键,同时系统功能比较简单,51单片机可以实现正确识别即可。此时就可以采取最简单的一个端口外接一个按键的方法,实现所需功能。
电路图
按下某个按键时,被按键的**总会有轻微抖动,这种拉动会持续10ms左右,因此,CPU在按键抖动期间扫描键盘必然会得到错误的按键位置信号,消除按键抖动通常用的硬件消抖一般采用双稳态消抖电路
程序如下
;简单按键键盘子程序
KEY: MOV P0 ,#0FFH ;预读P0口的准备
MOV P1 ,#0FFH ;关闭LED灯
MOV A , P0 ;读P0口的值
MOV R2 ,A ;保存P0口的值到P2
LCALL DELAY20MS ;延时消除抖动
MOV P0 ,#0FFH
MOV A, P1 ;再读P0口的值
CJNE A, R2,KEY ;与上次保存的值比较
CJNE A ,#01H,KEY2 ;判断是否键1
LJMP PKEY1 ;是键1,转到键1服务程序
KEY2: CJNE A ,#02H,KEY3 ;判断是否键2
LJMP PKEY2 是键2,转到键2服务程序
KEY3: CJNE A ,#03H,KEY4 ;以下说明类似
LJMP PKEY3
KEY4: CJNE A ,#04H,KEY5
LJMP PKEY4
KEY5: CJNE A ,#05H,KEY6
LJMP PKEY5
KEY6: CJNE A ,#06H,KEY7
LJMP PKEY6
KEY7: CJNE A ,#07H,KEY8
LJMP PKEY7
KEY8: CJNE A ,#08H,RETURN ;如果都不是,则重新读健值
LJMP PKEY8
RETURN:LJMPKEYEND
PKEY1:MOV P1 ,#0FFH ;键1的服务程序
CLR P1.0 ;P1.0口接的LED灯亮
LCALL DELAY1S
LJMP RETURN
PKEY2:MOV P1 ,#0FFH ;以下子程序类似
CLR P1.1
LCALL DELAY1S
LJMP RETURN
PKEY3:MOV P1 ,#0FFH
CLR P1.2
LCALL DELAY1S
LJMP RETURN
PKEY4:MOV P1 ,#0FFH
CLR P1.3
LCALL DELAY1S
LJMP RETURN
PKEY5:MOV P1 ,#0FFH
CLR P1.4
LCALL DELAY1S
LJMP RETURN
PKEY6:MOV P1 ,#0FFH
CLR P1.5
LCALL DELAY1S
LJMP RETURN
PKEY7:MOV P1 ,#0FFH
CLR P1.6
LCALL DELAY1S
LJMP RETURN
PKEY8:MOV P1 ,#0FFH
CLR P1.7
LCALL DELAY1S
LJMP RETURN
KEYEND: RET
DELAY20MS:MOV R7 ,100 ;延时20MS
MOV R6 ,100 ;100*(100*2+1+2)微妙
DELAY01:DJNZ R6,DELAY01
MOV R6,100
DJNZ R7,DELAY01
RET
DELAY1S:MOV R5 ,50 ;延时1S
LCALL DELAY20MS
DJNZ R5, DELAY1S
RET |