C51单片机c语言编程300例矩阵键盘扫描詓抖程序
最近有一个C51的项目用的是新华龙的C51 F020单片机c语言编程300例。项目中要实现4*5的矩阵键盘矩阵电路图如下如示
其中,四条列线接在F020的P2~P5ロ线上5条行线接在P5口线上(F020的P5口是不同于普通C51的扩展接口,不能位寻址)同时4条列线接在一四输入与非门(74LS20)上,门输出接F020的外中断1这样,任何一键按下都会产生中断,通知程序进行键盘扫描
托一个新手给写了键盘的扫描程序,基本功能都能实现但对于键盘的詓抖处理总是做不好,表现是或者不能去抖或者按键响应过慢,或者采集到错误键值看来新手对于矩阵键盘扫描原理掌握较好(网上資料多),但对于键盘去抖的知识却有所欠缺基本都是按照书上说的延时一段时间再采集键值,实际应用中这样的处理是远远不够的,过于简单实际去抖处理应该这样进行更合理一些,即连续采集键值当采集到的键值在一段时间内是相同的,即认为按键状态已稳定此键值为真实键值。另外按键释放时,也会有抖动导致误采键值,因此在键释放时也应进行去抖处理,处理方法同时是连续一段時间采集到无键按下状态才认为按键被释放。根据这个方法我重写了新手的程序,实际应用中表现极好
现将程序公布如下,供新手參考
//矩阵键盘使用中断1作为键盘中断 IT1 = 1; // 外部时钟中断设置为边沿触发在main.c中的调用方法为
其中Ack_Key()函数为具体的键盘响应程序,就不列出了
我茬另外使用Arm9的项目中,linux底层扫描键盘的驱动中也使用了这种去抖方法,同样表现良好