经典按键处理函数-新.pdf

经典按键处理函数-新.pdf

ID:50221899

大小:102.84 KB

页数:7页

时间:2020-03-12

经典按键处理函数-新.pdf_第1页
经典按键处理函数-新.pdf_第2页
经典按键处理函数-新.pdf_第3页
经典按键处理函数-新.pdf_第4页
经典按键处理函数-新.pdf_第5页
资源描述:

《经典按键处理函数-新.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、思路清晰的按键处理方式偶然在21IC上看到的博客,感谢楼主分享,全部代码我已测试过,确实是方便,而且思路清晰,功能强大。该算法很经典,可以再各种平台上运行,以下是我的代码Cont初始值为0.2010-12-28更新#defineKEY_ADD(1<<0)#defineKEY_SUB(1<<1)read_data=(((FIO0PIN>>27))&3)^0x3;/*两个中的至少一个按键按下或没按下*/trg=read_data&(read_data^cont);//2得到按下触发值rlease=((read_data^t

2、rg)^cont);//3得到释放触发值cont=read_data;//4得到所有未释放的键值这个是用2.7,2.8口作为按键接口,平常为高电平。分述如下:/*按下就动作*/if(trg==KEY_ADD)//当然用if(trg&KEY_ADD)也行,就是不好理解{g_kvalue+=100;}if(trg==KEY_SUB){SHOUT;g_kvalue-=100;}trg的值从来都是那个按键的口的值,只是触发,下次在进中断后就没有了如2.3按下,那么trg的值就是(1<<3)-------------------

3、----------------------------------------------------------------------/*双按键按下才动作,一个类似电脑的CTRL,另一个是普通按键*//*if(trg&KEY_ADD)flag=1;/*rememberCTRLkeyispressed*/if(flag==1){if(trg&KEY_SUB){flag=0;g_kvalue++;}------------------------------------------------------------

4、-------------------/*按键抬起才动作*//*if(rlease==KEY_ADD)g_kvalue+=100;*/当2.x键按下时,release是为0,一直为0,当2.x抬起时Release变为2.x的值,如P2.6,那release就是值(1<<6)其他也类似---------------------------------------------------------------------------------/*长按键情况*//*if(cont&KEY_ADD)//或者if(cont=

5、=KEY_ADD){H_sum++;if(H_sum>100){g_kvalue+=2000;SHOUT;H_sum=0;}}*/Cont只要键还按着,就会保持该值记得在ARM中是下载完需要复位一下才能运行的。以下是原文和详细解释:以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。当然,我自己也是在多个项目用过,效果非常好的。好了,工程人员的习惯,废话就应该少说,开始吧。核心算法:unsignedcharTrg;unsignedc

6、harCont;voidKeyRead(void){unsignedcharReadData=PINB^0xff;//1Trg=ReadData&(ReadData^Cont);//2Cont=ReadData;//3}完了。有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。1:读PORTB的端口数据,取反,然后送到ReadData临时变量里面保存起来。2:算法1,用来计算触发变量的。一

7、个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。3:算法2,用来计算连续变量。看到这里,有种“知其然,不知其所以然”的感觉吧?代码很简单,但是它到底是怎么样实现我们的目的的呢?好,下面就让我们绕开云雾看青天吧。我们最常用的按键接法如下:AVR是有内部上拉功能的,但是为了说明问题,我是特意用外部上拉电阻。那么,按键没有按下的时候,读端口数据为1,如果按键按下,那么端口读到0。下面就看看具体几种情况之下,这算法是怎么一回事。(1)没有按键的时候端口为0xff,ReadData读端

8、口并且取反,很显然,就是0x00了。Trg=ReadData&(ReadData^Cont);(初始状态下,Cont也是为0的)很简单的数学计算,因为ReadData为0,则它和任何数“相与”,结果也是为0的。Cont=ReadData;保存Cont其实就是等于ReadData,为0;结果就是:ReadData=0;Trg=0;C

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。