![]() |
|
||||||||||||||
| | 网站首页 | 综合电子 | 51单片机 | AVR单片机 | ARM专栏 | MSP430 | 网上商城 | PSOC | 下载中心 | 公司事项 | DSP专栏 | | ||
|
||
|
|||||
| 键盘扫描改进方法详解 | |||||
| 键盘扫描改进方法详解 | |||||
作者:未知 51单片机来源:本站原创 点击数: 更新时间:2008-8-14 ![]() |
|||||
|
按键扫描是每个搞单片机的都会遇到的问题,也是一个开发人员必须具备的基本功。先从最基本的说起。在此声明,没有代码,也不要向我要代码,也不想穿裤子,如果你看了帖子还写不出代码,那么我只能说你太笨了。。。。。。。。还是那句话,搞开发重要的是思想,而不是代码,代码只是工具 我的按键是这样处理的
1.读健状态,与上次健状态比较,不同,更新健状态和当前时间,相同则时间不变(或者加一) 2.当前时间与最后一次更新按键时间比较,超出规定时间,则可以判断健已经稳定。 3.与以前比较,就可以进行健处理了。 缺点,用的RAM多,优点,不等待 #include<reg52.h> #include<keydefine.h> void ReadKey(void) { byte i,Temp0; bit KeyFlag; static byte Q0; P1 = 0xff; Temp0 = ~P1; if(Temp0 != Qsw0) { Qsw0 = Temp0; KeyTime = Time20ms; } else { if(Time20ms - KeyTime > 3) {KeyFlag = 1;} } if(KeyFlag) { KeyFlag = 0; i = Qsw0 &~Q0 & 0xbb; //健按下 if(i) { if(i & 0x80) {KeyValue = BryRightKey;} if(i & 0x20) {KeyValue = AddRightKey;} if(i & 0x10) {KeyValue = SubbRightKey;} if(i & 0x08) {KeyValue = ReadPhotoRightKey;} if(i & 0x02) {KeyValue = LgyRightKey;} if(i & 0x01) {KeyValue = LightRightKey;} } i = Q0 &~Qsw0 & 0xbb; //健松开 if(i) { //健松开,处理代码; } Q0 = Qsw0; } } 这是我的一个项目中的键盘扫描函数,基于UCOSII的,功能有按下处理一次,连续按住一段时间能连续处理,函数返回键值,键盘扫描是单独一个任务,定时扫描的,在时间上没有大的等待,这样说可以帮助理解
INT8U KeyScan(void) { static INT8U keyrepeat,keyprevalue,times,fastad; INT8U KeyOut=0xfb; INT8U keyvalue; INT8U keyfirst; for(;KeyOut!=0x1f;KeyOut=KeyOut>>1) { KeyOutPort &= 0xf8; KeyOutPort |= (KeyOut&0x07); __delay_cycles(5); keyvalue = KeyInputPort&0x38; if(keyvalue!=0x38) { keyvalue |= (KeyOut&0x07); if(keyprevalue==keyvalue) { if(keyrepeat!=0xff) keyrepeat=0xff; else if((keyvalue==KeyLeft)||(keyvalue==KeyRight)||(keyvalue==KeyUp)||(keyvalue==KeyDown)) { if(fastad==0xff) //针对调整按键 进行快速按键处理 { if(times>=(100/KeyScanDelay)) times=0; else { times++; keyvalue=0xff; } } else if(times>=(1000/KeyScanDelay)) { fastad=0xff; times=0; } else { times++; keyvalue=0xff; } } else keyvalue=0xff; } else { keyprevalue = keyvalue; keyfirst = 0xff; } break; } else keyvalue = 0; } if(keyvalue==0) { keyrepeat = 0; keyprevalue = 0; times = 0; fastad = 0; } else if((keyvalue==0xff)||(keyfirst==0xff)) keyvalue = 0; return keyvalue; } |
|||||
| 51单片机录入:dycxin 责任编辑:dycxin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| DS18B20温度传感器C51程序,… 基于频谱分析的机电设备状态… AT89s8252单片机在3G基站控制… 单片机实现智能荧光鉴伪 智能盲人导行仪的设计与实现 基于AT89C51型单片机的CAN总… STC单片机IO管脚毁坏动态自检… 具备跳号跳频和跳址的nrf905… 51单片机边沿触发中断响应时… 8051单片机在线升级软件的方… |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | | 设为首页 | 购买方法 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 联系我们 | 网络答疑| | | |||
|