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

新疆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的声音码了,只发了一次。在合适的开发利用好标志锁,可以很方便的高效解决很多问题。

  • [大笑]这不符合小撸的风格也!只要你有能力评论的,会说这种没营养的话? 2018-12-13
  • 《堡垒之夜》Switch版下载量:一天破200万次 2018-12-13
  • 气氛和谐!博格巴和卡希尔赛前相遇热情寒暄 2018-12-12
  • “最美乡村医生”孙云海:回乡行医28年未收一分出诊费 2018-12-11
  • 90后“技术宅”开黄色网站 半年非法牟利17万 2018-12-10
  • 尚活 —频道 春城壹网 七彩云南 一网天下 2018-12-09
  • 从“最冷门”角度解读《人工智能新规划》 2018-12-09
  • 计划经济该怎么定义呢?政府什么都管的经济吗?如果政府什么都管那以现在的政府的能力,能管的了那么多吗?能管得好吗?那还能纯粹叫经济吗?所以政府才强调政府有政府的职 2018-12-08
  • 酸味-热门标签-华商生活 2018-12-08
  • 发改委:乡村振兴战略规划修改完善后将报请印发实施 2018-12-07
  • [心]——中国的有神论者代表不了无神论者!不知道有神论与无神论的世界观不相同吗?况且,各种无神论者的世界观还不一样呢!!!! 2018-12-07
  • “三个90周年”系列秋收起义90周年纪念活动新闻发布会在昌召开 2018-12-06
  • 朱德之孙朱和平谈“人民军队的创建” 2018-12-05
  • 林杰(原创首发)观福州知青书画摄影作品展【藏头诗】 2018-12-04
  • 珠海市香洲区:以居民需求为导向的“议治相济” 2018-12-03
  • 301| 488| 103| 183| 63| 817| 814| 249| 790| 232|