您当前的位置:首页 > 基础知识 > 单片机  > 单片机常见问题

大乐透开奖直播:单片机实战开发细节:如何为单片机的按键加一个锁防止多次触发

来源:21ic整理 关键字:单片机   单片机开发   

粤11选五开奖直播 www.ptp5c.cn  最近一直在做凌阳的GPL32001的单片机开发,主打产品是一架钢琴。

在这架钢琴上,我们可以看到遍布着很多按键,有琴键,也有功能选择的按键,面对如此多的按键,对于一个刚出来工作的小伙伴肯定压力比较大,琴键的特征和普通按键不太一样,琴键的一个按键由两个按键组成,一个按键储存着两样信息,力度和键值。

那么在我写的程序的项目要求是这样的,要求每个按键一次只能触发一次,并且触发的时候要发出不同的键码,通过音频解码盒将该键码值读出来,比如第一个白色琴键是key01--->对应的键值就是0000 0001 也就是0x01,而功能按键的编排和琴键有所不同,功能按键的编排从序号key55开始,键值也和琴键的不一样。鉴于这样的特征,即可以鉴别机器是否出现短路,断路等硬件是否损坏的情况。

那么,今天我提出的一个问题也是在单片机开发中常见的,也就是按键,学过单片机的同学都玩过按键,一开始都是这样的代码:

if(key == 0)

bell = 0 ;

else

bell = 1 ;

但是如果这样的话,假设是在一个死循环里面,按键如果检测到低电平为按下,按键就会一直触发,bell=0的分支就会被不断的执行。

于是我想到一个好的办法,我项目里是这么写的。

定义一个 static int lock ;然后做以下的操作,当然这个操作是在一个死循环内操作的:

//获取按键状态 data = *P_IOE_Data; if((data&0x0080)) { IOE_lock = 0 ; } if((data&0x0080) == 0) { if(IOE_lock == 0) { play_sound_hightolow(0x33,Vol_value); } IOE_lock = 1 ; }

if((data & 0x0080))表示按键没有被按下,此时按键锁标志为0,staic类型将记录这个标志变量的值,当if((data & 0x0080) == 0)时,按键此时被按下了,我要判断按键锁标志是否为0,如果为1,那么程序肯定不会运行play_sound_hightolow();这个函数,所以当按下按键的时候,锁的初始化值为0,喇叭发出声音码,音频解码器读出对应的键值为0x33。读完之后立马的将锁标志置1,如果此时一直按住按键不放,因为锁标志等于1,所以无效,程序不进入发码的状态。当松开后,按键的状态由1变成0,此时再按下按键,又有效,然后锁住。

这样做的好处就是使按键按下的时候,发码的状态只触发一次,就不会连着发出0x33的声音码了,只发了一次。在合适的开发利用好标志锁,可以很方便的高效解决很多问题。

  • 分手后前女友发来短信求教火锅蘸料配方 网友炸了 2019-04-22
  • 河北省实施中医药强省建设人才支撑计划 2019-04-21
  • 真正聪明之人,能在寻常岁月里悟透贞亲人世的惊喜 2019-04-21
  • 洗手还能用空气?高科技让脑洞变为现实 2019-04-20
  • 夏天喝饮料越喝越渴吗 三款饮料不利于健康-美食资讯 2019-04-20
  • 驾照记满12分无证驾驶4年多 司机被罚1500元拘留15天 2019-04-19
  • 奥运冠军寄语Running Together国际迷你马拉松—在线播放—《奥运冠军寄语Running Together国际迷你马拉松》—体育—优酷网,视频高清在线观看 2019-04-18
  • 清明祭英烈:90后抗洪英烈曹志宇、王岩松生前影像曝光 2019-04-17
  • 2018安徽秸秆综合利用产业博览会举办 2019-04-17
  • 大国担当!中国引领全球气候治理(在习近平新时代中国特色社会主义思想指引下——新时代新作为新篇章) 2019-04-16
  • 麦味地黄丸 老人的长寿丸 2019-04-15
  • 新华时评:磋商,不等于反复折腾 2019-04-14
  • 【专访】专访周抗——面向心灵谈摄影 2019-04-14
  • 小说文体审视、研究唐蕃关系的新突破 2019-04-13
  • 紫光阁中共中央国家机关工作委员会 2019-04-12
  • 673| 978| 411| 48| 721| 282| 42| 354| 761| 265|