购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.9 数码管显示4×4键盘矩阵按键

当按键较多时,如果将按键全部直接连接到端口引脚,这会占用较多的控制器端口资源。为减少端口占用,键盘接口电路常采用4×4键盘矩阵,16只按键仅占用8位端口,但检测按键的代码比独立按键的代码要复杂很多。图3-9所示的仿真电路运行时,数码管上将显示出当前按键键值。

图3-9 数码管显示4×4键盘矩阵按键(含排阻引脚)

1.程序设计与调试

(一)键盘矩阵电路

本例键盘矩阵电路中,各行按键左端并联,抽出4条行线,对应连接RD4~RD7;矩阵电路中各列按键右端并联,抽出4条列线,对应连接RD0~RD3。PD端口外接上位电阻(A103,10KΩ)。注意这并非唯一接法,例如还可以将行线连接RD0~RD3,列线连接RD4~RD7,而且还可以将4 条行列、4 条列线分别连接在不同端口。矩阵键盘连线不同,所使用的扫描代码也有差别。

(二)本例矩阵键盘扫描算法

针对本例仿真电路中的矩阵接法,源程序通过下述算法实现键盘扫描,具体步骤如下。

(1)首先判断16个按键中是否有键按下:函数KeyMatrix_Down首先设置PD端口方向寄存器TRISD=0x0F,将行线连接的端口高4位(RD4~RD7)设为输出,将列线连接的端口低4位(RD0~RD3)设为输入,PORTD=0x0F在行线上先放置4个0,如果键盘矩阵中有任一按键按下,则四条列线上必有一条出现0,此时从PORTD读取的值将不再是0x0F(00001111),因为1111中必定有一位变成了0。由此,如果判断出PORTD!=0x0F,即可知当前有键按下。

(2)判断当前按键所在列序号:在检测到有键按下后,从PORTD读取的值有4种可能,它由原来的(0x0F)00001111变为00001110、00001101、00001011、00000111这四者之一,通过这4个值即可分别判断出按键发生在0~3列。

(3)判断当前按键所在行序号:得出当前按键所在的列以后,还需要进一步判断出按键处于哪一行。代码中第50行重新设置PD端口方向寄存器TRISD=0xF0,将PD端口高4位设为输入,低4位设为输出,并通过PORTD=0xF0(11110000)在低4位(也就是4条列线)上先输出4个0,此时PD端口的数据线上出现11110000,所合上的按键将使高4位的某一位(也就是4条行线中的某一条)上出现一个0,它所出现的位置有4种,即:01110000、10110000、11010000、11100000,通过这4个值即分别得出当前按键所在行为0~3行。

(4)得出键值:由于0~3行按键的起始键值分别是:0、4、8、12,将“起始值+列号”即可得到最终键值。另外:假设扫描得出的行号为r,列号为c,还可以通过r×4+c得到键值。

2.实训要求

① 修改键盘矩阵连线,将高4位连接列线,低4位连接行线,重新编程实现键盘扫描。

② 设计4×5矩阵键盘,编程实现按键扫描与显示。 /EHWWpeUSyQou3m1Z/7NRAQUDXNaXjkTQjlX00ZZji7J678LyuCzLyUEU9ULeA3g

3.源程序代码
点击中间区域
呼出菜单
上一章
目录
下一章
×