Proteus中以中断方式实现矩阵键盘的扫描
前言
最近做单片机的课程设计用到矩阵键盘,在此做个记录。
1 矩阵键盘的扫描方式
使用矩阵键盘时,首先要判断是否有按键按下,这个过程称为矩阵键盘的全局扫描。单片机对于键盘按下的响应方式一般有三种:(1)定时扫描:利用定时器每间隔一段时间扫描一次键盘(2)程序扫描:在程序运行的过程中,当有必要了解是否有按键按下时,调用键盘扫描函数进行扫描(3)中断扫描:当有按键按下时,触发外部中断。
网络上关于矩阵键盘的扫描方式的介绍多局限于(1)和(2)两种方式,这两种方式在单一的矩阵键盘的实验中是可行的,但对于一个复杂的系统来说,单片机要处理的任务较多,宜采用中断扫描的方式,仅在有按键按下时触发中断,以节约CPU资源,本文介绍第(3)种方式
2 获取按下的按键的键值的方法
上面提到的全局扫描只能了解是否有按键按下,具体是哪一个按键按下,需要进一步扫描确定,在这个过程中完成按键的键值(编号)的获取。获取键值主要有线反转法和逐行逐列扫描法,本文介绍逐行逐列扫描法,线反转法的效率更高,但本文不作介绍。
3 逐行逐列扫描法
对于上图所示的矩阵键盘,键盘全局扫描(判断是否有按键按下)的一般原理如下:首先使列线所连接的I/O引脚P14至P16输出低电平,行线所连接的I/O引脚P10-P13输出高电平。当没有按键按下时,四条行线R1-R4所连接的I/O引脚读取到的将全部是高电平;而当有按键按下时,由于该行线与列线接通,将被下拉到低电平。此时读取行线所连接的引脚,将不再全是高电平,由此可以判断出有按键按下。
获取按下的按键键值的方法与之类似,逐条拉低每一条列线(其他列线为高电平),读取行线的状态,如果某一条行线被拉至低电平,则该行线就是被按下的按键所在行,而此时我们所拉低的那条列线,就是按下的按键所在的列,由此唯一确定按下的按键。
4 中断的触发电路
根据上面的逐行逐列扫描法,如果将行线置为高电平,而列线置为低电平,一旦有按键按下,将会有行线被下拉至低电平。因此只要有一条行线为低电平,就应该输出一个低电平,向单片机请求中断。可以用一个四输入与门(74LS21)来实现这种逻辑功能。这就是基于中断的全局扫描法
有了这个中断触发电路,我们就只需要通过中断就能了解到是否有按键按下
可以将外部中断0设置为下降沿触发方式。有按键按下时将触发中断。但是要注意上面的逐行逐列扫描方式可能会误触发中断,为避免误触发,在扫描键值的函数退出前应该把中断标志位EX0清除,这样就不会因为逐行逐列的扫描方式而误触发中断。
程序以后更新…