矩阵键盘多为扫描键盘或使用专门的键盘显示芯片。
扫描键盘的程序控制比较复杂,需要占用较多的I/O口;而专门的键盘显示芯片8279编程容易,但价格较贵,且按键的数量受到一定限制。
本文介绍一种中断编码键盘,非常适用于单片机或DSP等自动控制系统。
键盘电路如附图所示。
选用74HCl48作为键盘编码器,用上拉电阻和分压电阻控制编码器输入端的电平值。
当无按键按下时,编码器U1的各输入引脚为上拉高电平,无编码输出,编码器U2由于受U1的GS引脚控制也无编码输出,故不会向控制系统发出中断请求;当某键按下时,例如SWl0键按下后,电阻R3、R7接通,在按键两端产生O.8V的电压(U=5xR3/(R3+R7)=O.8 V),编码器U1确认该电平为低电平,U1的15脚被拉低,编码器开始编码并输出二进制码010,其GS引脚输出低电平,启动编码器U2工作。由于按键端的O.8V电压使三极管9014(Q2)导通,;其集电极C被拉低,将U2的16脚拉低,而其余的引脚都为高电平,U2编码输出二进制码001,并在GS端输出低电平中断信号。两个编码器产生的编码用十六进制表示(如按键SWlO输出十六进制码为0X12),作为按键在键盘矩阵中的矩阵位置值,可以直接供8位I/O口系统使用。
此编码键盘电路扩展成16x16的矩阵键盘,只需要4块74HCl48编码器,电路简单,编程操作容易。当在I/O口上加上缓冲芯片74IS244时,通过在中断程序中片选74LS244,即可同其他外围电路共用I/O资源,从而极大地节省系统的接口资源。
单片机读键盘编码值的C语言程序段如下所示:
uchar keyvalue;/*全局变量*/delay10ms(){……}
void keyin() interrupt 0{uchar i;EA=0 ;/*关闭中断*/delay10ms{();/*等待按键稳定*/reread:PO=Oxff:
ACC=PO;kevvalue=ACC;if(ACC^31ACC^7)/*判断读入值有效与否*/goto reread;/*重新读人键盘输入*/……/*按键值处理*/for{i=3;i>0;i--)delay10ms();/*等待按键松开*/EA=1 ;/*开中断*/}