实战开发为单片机的按键加一个锁防止多次触发的细节

 更新时间:2018年12月18日 10:13:31   作者:Engineer-Bruce_Yang  
今天小编就为大家分享一篇关于实战开发为单片机的按键加一个锁防止多次触发的细节,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • 深入剖析C++中的struct结构体字节对齐

    深入剖析C++中的struct结构体字节对齐

    要求数据内存的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,本文就来深入剖析C++中的struct结构体字节对齐,需要的朋友可以参考下
    2016-05-05
  • C语言的变量与常量 字符字符串与转义字符详解

    C语言的变量与常量 字符字符串与转义字符详解

    这篇文章主要介绍了详解C语言的变量与常量 字符字符串与转义字符,包括其之间的区别是C语言入门学习中的基础知识,需要的朋友可以参考下
    2021-10-10
  • C语言植物大战数据结构二叉树堆

    C语言植物大战数据结构二叉树堆

    这篇文章主要为大家介绍了C语言植物大战数据结构二叉树堆的图文示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C语言进程程序替换的实现详解

    C语言进程程序替换的实现详解

    为什么要进程替换?因为父进程创建出来的子进程和父进程拥有相同的代码段,所以,子进程看到的代码和父进程是一样的。当我们想要让子进程执行不同的程序时候,就需要让子进程调用进程程序替换的接口,从而让子进程执行不一样的代码
    2022-08-08
  • C/C++模拟实现烟花效果的示例代码

    C/C++模拟实现烟花效果的示例代码

    这篇文章主要为大家详细介绍了C/C++模拟实现烟花效果的两种简单方法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下
    2024-01-01
  • Visual Studio Code 配置C、C++环境/编译并运行的流程分析

    Visual Studio Code 配置C、C++环境/编译并运行的流程分析

    这篇文章主要介绍了Visual Studio Code 配置C、C++环境/编译并运行的流程分析,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 利用Matlab绘制优美的k线图

    利用Matlab绘制优美的k线图

    本期又是一个花里胡哨的数据可视化,前两天刷到了耐克的视觉设计师Gladys Orteza绘制的k线图作品,把沉闷的股票图变成了精彩的风景,但是那些大部分是真的完全看不清,我这里挑选了几个能看清的k线图风格将其用MATLAB进行了实现
    2022-10-10
  • 详解C++中的对象指针与对象数组

    详解C++中的对象指针与对象数组

    这篇文章主要介绍了详解C++中的对象指针与对象数组,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言驱动开发之判断自身是否加载成功详解

    C语言驱动开发之判断自身是否加载成功详解

    在驱动开发中我们有时需要得到驱动自身是否被加载成功的状态,这个功能看似没啥用实际上在某些特殊场景中还是需要的。本文将通过示例详细讲讲这一功能的实现方法,需要的可以参考下
    2022-10-10
  • C语言驱动开发之通过ReadFile与内核层通信

    C语言驱动开发之通过ReadFile与内核层通信

    驱动与应用程序的通信是非常有必要的,内核中执行代码后需要将其动态显示给应用层。为了实现内核与应用层数据交互则必须有通信的方法,微软为我们提供了三种通信方式,本文先来介绍通过ReadFile系列函数实现的通信模式
    2022-09-09

最新评论