实战开发细节:如何为单片机的按键加一个锁防止多次触发
来源:互联网 发布:新网域名管理后台 编辑:程序博客网 时间:2024/05/14 00:35
最近一直在做凌阳的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的声音码了,只发了一次。在合适的开发利用好标志锁,可以很方便的高效解决很多问题。
0 0
- 实战开发细节:如何为单片机的按键加一个锁防止多次触发
- UIButton事件防止多次触发的写法
- 防止多次触发
- 如何防止一个程序运行多次
- 防止一个用户登录多次的方法
- FileSystemWatcher是软件程序开发常用到的一个监控组件,但是这个控件的Changed 时间方法老是触发2次或者多次,触发多次的情况
- 投票系统如何防止一个用户多次投票
- iOS开发~防止navigation多次push一个页面
- [C# 开发技巧]如何防止程序多次运行
- C# 开发技巧]如何防止程序多次运行 线程 进程
- [C# 开发技巧]如何防止程序多次运行
- [C# 开发技巧]如何防止程序多次运行
- 单片机开发之按键
- 如何防止程序多次运行
- asp.net防止一个用户登录多次的方法
- C#如何防止程序多次运行的技巧
- 单片机硬件中断如何触发
- FireBlue QN9020 QN9021 QN902x 例程 按键 多次触发
- C/C++头文件一览
- CSS中将行内元素设置成行内块元素的几种方法
- 生日礼物
- 欢迎使用CSDN-markdown编辑器
- iOS自定义NavigationBar
- 实战开发细节:如何为单片机的按键加一个锁防止多次触发
- link to markdown tutorial
- 【中山市选2008】矩阵
- io加强
- PhoneGap android开发:PhoneGap基本介绍
- 在(1)的基础上,实现分数类中的对象和整型数的四则运算。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。
- iOS常用技术 —获取验证码 倒计时 实现
- svn UserInterfaceState.xcuserstate问题
- Android隐藏状态栏