最近帖子已经有人在此提到充分利用CPU中断的重要性,,再次我就不要说了。此按键demo支持短按,长按,多个按键同时按下,由于是用扫描的方式,各个按键的按下和松独立处理,不互相干扰,避免要按键死等的情况。对于特殊的按键消抖时间可单独一条线扫描检测。。由于是各个按键,一位位检测,检测到一位就进行处理,之后再进行处理下一位,所以有先后顺序。废话不多说,下面讲思路,有错误的地方大家可以一起学习,探讨,,,,,,,,
按键的最终状态无非就两种,按下或者松开。我用的是STC8单片机,现在的一些增强型或许新型号应该内部都有上拉电阻,,所以我们是按键低电平触发。
对于只作为输入口用于按键检测,,我们可以默认他的IO口状态,不要去操作IO寄存器,,,(如果是即作为输入又作为输出的话,,在读取状态的时候记得先写1,延时2个NOP,再去读,保证读取的准确性),,假设按键没按下去默认就是1了,按键按下去就是0,也就是1->0的过程,,松开的话就是0->1,恢复到最初状态。这里就有两个变化1->0,和0->1,,理解这个之后我们就定义两个变量 value 变化值 buf 最终状态值 我们两个变化1->0,和0->1进行异或就是1,,说明了按键有按下或松开的动作,我们就去执行对应的函数,,执行完后按键的最终只buf也跟着更新,也就是0(按下) 1(松开),,(一直按下的过程)此时端口值0 和buf0 异或就是0 ,咱就不再去执行按键按下的程序,,(松开后的过程)此时端口值1 和buf1 异或就是0 ,咱就不再去执行按键松开的程序,,这样就保证了按下 或者松开 只执行一次动作,,因此加入一些标志位。,结合中断就可以做一些长按功能了。提供的demo里有做了一个实例是长按2秒开关蜂鸣器,,其他的按键按下或者松开的子函数用户自己增加自己需要的功能,,里面只是写了一些简单的点灯功能用于调试,,自己验证了一下程序是可行,,所以提供出来,,大部分都有注释,看看有什么不足之处,在进行修改,,后面会在此基础加入矩阵扫描,原理一样,接着进一步完善demo,做成一个能实现操作常见的外设demo出来,,程序不足之处多多见谅,大家多多批评,一起学习,,,,,下面按键的流程图,也不知道这个画得不到,老感觉自己的表达能力有待提高,,或者也会多发贴,把自己的一些表达能力加强,,
按键流程图
1 file文件夹为项目的硬件端口表 功能书 原理图等资料
2 inc文件 为系统配置文件
3 lib文件 各个外设文件
4 program文件 为项目文件
单片机源程序如下:
所有程序51hei打包下载:
STC8 实验3 -按键.rar
(92.31 KB, 下载次数: 19)
|