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

新疆18选7历史记录:单片机实战开发细节:如何为单片机的按键加一个锁防止多次触发

来源: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-02-20
  • 首届“芯火杯”智能硬件创新创业大赛在京启动 2019-02-19
  • 自私的小萌们眼看着自己的队友挨踹也不出来帮一把? 2019-02-18
  • 一以贯之推进党的建设新的伟大工程 2019-02-17
  • 定格——西部网图片频道 2019-02-17
  • 欧阳卫民:冀粤港深化合作 打造国际一流湾区 2019-02-16
  • 2018年河北省直机关第一期党支部书记示范培训班圆满结束 2019-02-15
  • 跷二郎腿诱发心脑血管疾病?心脑血管高危因素有哪些 2019-02-14
  • 高中语文中的230个错别字,你能对几个? 2019-02-13
  • 沪离婚数连涨两年后首次回落 主要是买房假离婚减少[图] 2019-02-12
  • 人民网春季糖酒会专访泸州老窖集团有限责任公司总裁、副董事长 孙跃 2019-02-12
  • 谈具体的吧,别装模作样了。客观事实与观察事实、科学事实有什么不同? 2019-02-11
  • 国务院关税税则委员会关于对原产于美国500亿美元进口商品加征关税的公告 2019-02-11
  • 中国将实施最严格机动车环境监管制度 2019-02-10
  • 高清:C罗帽子戏法科斯塔梅开二度 葡萄牙3 2019-02-10
  • 421| 958| 722| 763| 994| 886| 445| 940| 36| 673|