4×4的键盘,在单片机系统中,是很常见的。一般都是占用一个单片机的8位接口。
对于这种输入设备,通常是由单片机来识别某行某列的按键是否按下,还需要延时消抖等等。
为了节省单片机的IO接口,也可以使用外接芯片来驱动4×4的键盘。
MM74C922,就是一块较好的4×4的键盘编码芯片。
它能够自己独立地进行键盘检测、消抖,以8421码给出键值。
它还能给出按键是否按下的标志,其数据线还具有三态输出的功能,便于进行总线连接。
总之,这块芯片功能很全面。
美中不足的是:它是以输出1来代表有键按下。如果用来向51单片机申请中断,还需要加上一个反相器。
下图就是利用MM74C922驱动的4×4键盘的电路图。
图中使用了六位共阳数码管,位选的驱动,加了反相器7404,制作实际的电路时,应该使用8550。
百度知道上面有一个问题,要求把每次的按键,依次的显示在各个数码管上,并不是以前常见的移位显示。
题目链接:http://www.ippipp.com/group/topic/id/1915。
仿照题目的要求,编写了如下的程序:
;--------------------------------------
D_BUFEQU30H;30H~35H为显示缓冲区
;
ORG0000H
MOVR1,#D_BUF
M_LOOP:
CALLDISP
JNBP2.6,M_LOOP;没有按键就转移
CALLREADKEY
MOV@R1,A;存入键值
INCR1
CJNER1,#D_BUF+6,M_LOOP
SJMP0000H
;--------------------------------------
READKEY:
MOVP0,#255;关闭显示,准备读键
CLRP2.7;/OE=0
NOP
MOVA,P0
SETBP2.7
ANLA,#15
PUSHACC
R_LOOP:
CALLDISP
JBP2.6,R_LOOP;等待释放
POPACC
RET
;--------------------------------------
DISP:;共阳数码管,P0:段,P2:位(有反相)
MOVR2,#254;位选,低电平有效
MOVR0,#D_BUF
MOVA,@R0
ADDA,#(TAB-$-3)
MOVCA,@A+PC
MOVP2,#255
MOVP0,A
MOVP2,R2
DJNZR7,$;显示1024T
DJNZR7,$
MOVA,R2
RLA
MOVR2,A
INCR0
CJNER0,#D_BUF+6,$-19;显示6位
MOVP2,#255
RET;占用时间约为6.1ms
;-----------------------
TAB:;共阳段码
DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H;0~7
DB080H,090H,088H,083H,0C6H,0A1H,086H,08EH;8~F
END
;--------------------------------------
本程序,可以驱动MM74C922,正确读出键值,依次显示在数码管上。
按照我设计的电路,这块芯片仅仅单独占用了单片机的两条IO口线,就实现了16个按键的驱动,确实是非常节省资源。
本电路、程序,用PROTEUS仿真成功了,暂时还没有进行硬件实验。