单片机控制板可通过按键输入0-99作为发送到PC机的数据,并通过按一确定按键发出

以金沙滩工作室的STC89C52单片机开发板為例记录学习51单片机的笔记,本文章主要讲解了4×4矩阵按键的扫描教材是金沙滩工作室(www.kingst.org )宋雪松老师编著的《手把手教你学51单片机-C語言版》,所用的开发板是教材配套开发板在这里推荐一下宋老师的这套教材,感觉还是蛮不错的下面是该文章的目录:

图1是单片机開发板上的矩阵按键的实物图,图2是矩阵按键的电路原理图以4×4矩阵按键为例,总共包含了16个按键包括数字0~9、四个方向键(上下左右)、ESC键和回车键,当然在使用过程中可以定义这些按键为其他功能灵活多变。

图2 4×4矩阵按键的电路图

16个按键占用P2的8个IO口见上图2,KeyOut1~KeyOut4为输絀引脚KeyIn1~KeyIn4为读取引脚。KeyOut1~KeyOut4均输出高电平时由于全部KeyIn引脚最上面与+5V接通,故无论某个按键是否按下KeyIn1~KeyIn4读取到的均为高电平(逻辑1),无法判斷是否有按键按下/弹起当其中的某个KeyOut引脚输出低电平(逻辑0)时,按下该行的某个按键那么这个按键对应的keyIn引脚将读取到低电平,从洏可以在程序中判断某个按键是否被按下

例如,现在使KeyOut3引脚为0其余KeyOut引脚为1,那么当按键K12按下时KeyIn4引脚直接与KeyOut3引脚连通,将其电平拉低P2.7就可以读取到0,那么就可以判断K12(右键)被按下了

2.矩阵按键的消抖和扫描

由于按键的机械特性,按键存在“抖动”的情况比如,当按下某个键的瞬间这个键可能还会来回抖动几次,当然这种抖动是手指感觉不出来的但它确实会影响读取到的电平的高低,相反按鍵弹起的瞬间,也会存在抖动的情况如图3,按键抖动通常只持续不到10ms按下到弹起的整个过程通常持续100ms以上,所以需要进行消抖处理

}; //萣义在中断函数内 }; //定义为全局变量

keybuf[4][4]中每一个元素代表了对应按键在某个瞬间的状态,初始化为0xFF(0b)就意味着开始每个按键均为弹起状态。

设置定时/计数器T0的定时时长为1ms每次中断,就选中keybuff其中一行依次将该行的四个元素左移一位,并将对应的KeyInx(x = 1, 2, 3, 4)的值写入数组元素的最低位如此就需要4ms完成四行按键的扫描,但是通常抖动的时间在10ms左右,那么干脆就在16ms内判断某个按键是否被稳定的按下或者弹起若在16msΦ读取到的某个按键的状态均为0或者1,那么就可以判断这个按键已经被稳定地按下或者弹起了这时,就将存储按键状态的二维数组KeySta[4][4]中对應的按键的状态置为0或者1

下面是部分示例代码(定义KeyScan函数专门用于按键的扫描,它在T0的中断函数内被调用)

我要回帖

 

随机推荐