历史上的今天
返回首页

历史上的今天

今天是:2025年03月25日(星期二)

正在发生

2021年03月25日 | 单片机上的按键检测框架

2021-03-25 来源:eefocus

下面是我之前写的一个按键检测的框架,适合比较多的按键操作,从信号接收、滤波、最好处理按键任务,大体上没什么问题,不过没具体测试过到时可能会有bug。


  1 /******************************************************************************

  2 * @file    button.c

  3 * @author  wule

  4 * @version 

  5 * @date    

  6 * @brief   

  7 ******************************************************************************

  8 *

  9 *****************************************************************************/

 10 

 11 typedef unsigned char ButtonSizeType;

 12 

 13 typedef enum{

 14                 RESET = 0,

 15                 SET = !RESET,

 16             }FLAG;

 17 

 18 typedef struct button_bit{

 19     ButtonSizeType button1:1;

 20     ButtonSizeType button2:1;

 21     ButtonSizeType button3:1;

 22     ButtonSizeType button4:1;

 23     ButtonSizeType button5:1;

 24     ButtonSizeType button6:1;

 25     ButtonSizeType button7:1;

 26     ButtonSizeType button8:1;

 27 }ButtonBitType;

 28 

 29 typedef union

 30 {

 31     ButtonBitType button_bit;

 32     ButtonSizeType button;

 33 }ButtonType;

 34 

 35 ButtonType InputFlag;

 36 

 37 //初始化按键标志状态

 38 void Init_Button_Variable(void)

 39 {

 40     InputFlag.button = 0;

 41 }

 42 

 43 //判断函数,读取每个按键的状态

 44 ButtonSizeType ReadButtonBit(void)

 45 {

 46     ButtonType button_bit;

 47     

 48     button_bit.button = 0;

 49     

 50     button_bit.button_bit.button1 = 1;

 51     button_bit.button_bit.button3 = 1;

 52     button_bit.button_bit.button5 = 1;

 53     

 54     return button_bit.button;

 55 }

 56 //滤波,返回值代表当前按键的值

 57 ButtonSizeType Button_Filter(void)

 58 {

 59     ButtonSizeType bf_buf;

 60     static ButtonSizeType bf_pre_buf = 0,bf_backval = 0;

 61     static unsigned char bf_filtercnt = 0;

 62     

 63     bf_buf = ReadButtonBit();

 64 

 65     if(bf_buf != bf_backval && bf_buf == bf_pre_buf)//判断两次是否相同

 66     {

 67         bf_filtercnt ++;

 68         if(bf_filtercnt > 50)//作一个简单的滤波

 69         {

 70             bf_backval = bf_pre_buf;

 71         }

 72     }

 73     else

 74     {

 75         bf_pre_buf = bf_buf;

 76         bf_filtercnt = 0;

 77     }

 78     

 79     return bf_backval;

 80 }

 81 //处在一个时间可控的位置,这里可以实现各种按键的操作

 82 void ButtonTask(void)

 83 {

 84     ButtonType bt_state = Button_Filter();//得到按键状态

 85     

 86     if(InputFlag.button_bit.button1 == 0 && bt_state.button_bit.button1 == 1)

 87     {

 88         //单次触发

 89     }

 90     else if(InputFlag.button_bit.button1 == 1 && bt_state.button_bit.button1 == 0)

 91     {

 92         //单次释放

 93     }

 94     

 95     

 96     if(bt_state.button_bit.button1 == 1)

 97     {

 98         //计时触发

 99     }

100     else

101     {

102         //结束判断按的时间

103     }

104 }


推荐阅读

史海拾趣

Fullywell Semiconductor Co Ltd公司的发展小趣事

为了进一步拓宽业务范围和提升技术实力,Fullywell在2015年进行了一次重要的收购。公司成功收购了某家专注于传感器技术的初创企业,将其先进的技术和产品线纳入麾下。这次收购不仅丰富了Fullywell的产品线,还使其在物联网、智能家居等新兴领域具备了更强的竞争力。随后,公司进行了业务整合,优化了资源配置,实现了优势互补,为公司的持续发展注入了新的动力。

Holmes Co Inc公司的发展小趣事

为了进一步提升竞争力,Holmes Electronics采取了一系列并购重组措施。他们首先收购了一家在物联网技术方面具有深厚积累的小型科技公司,通过整合双方资源,迅速在智能家居和智慧城市领域取得突破。随后,公司又成功并购了一家专业的半导体封装测试企业,进一步完善了产业链布局。这些并购重组不仅增强了Holmes Electronics的技术实力和市场地位,还为公司带来了新的增长动力。

台湾唯圣(GW)公司的发展小趣事
如晶体管、场效应管等,用于控制电流的产生和变化。
Cressall Power Resistors公司的发展小趣事

在电子行业的早期,Cressall Power Resistors公司以其对电阻技术的深入研究而脱颖而出。公司研发团队通过不懈的努力,成功开发出一种新型的功率电阻器,具有更高的耐热性、更低的电阻值变化率以及更长的使用寿命。这一技术突破迅速得到了市场的认可,公司因此获得了大量的订单,业绩迅速增长。随着技术的不断完善和产品的持续升级,Cressall逐渐在功率电阻器市场树立了技术领先的地位。

Electro Technik Industries公司的发展小趣事

随着公司规模的扩大和产品线的增加,ETI开始注重品质管理。公司建立了一套完善的品质管理体系,从原材料采购到生产过程再到成品检验都严格把关。同时,ETI还积极推行精益生产、六西格玛等先进管理方法,提高了生产效率和产品质量。这些措施使ETI的产品在市场上获得了良好的口碑和信誉。

Bytes公司的发展小趣事

在技术创新的基础上,Bytes公司积极拓展市场。公司通过精准的市场定位和营销策略,成功打开了多个国家和地区的市场。同时,Bytes公司注重品牌建设,通过优质的产品和服务赢得了消费者的信任和好评。公司还积极参与国际展览和交流活动,提升品牌知名度和影响力。

问答坊 | AI 解惑

AVR单片机应用系统开发典型实例

我们用的AVR系统,有一套教材 上传和大家分享咯…

查看全部问答>

各个管脚的含义

在下载程序时 cyclone II 各个管脚Q O S n代表什么含义呢 -%-278280-%-…

查看全部问答>

在串口调试工具上,用AT命令集打电话发短信的步骤是怎样的.

在串口调试工具上,用AT命令集打电话发短信的步骤是怎样的.…

查看全部问答>

安装了Sfilter,怎么看不到调试语句输出呢?

DDK里面的Sfilter例子。编译出sfilter.sys,用里面自带的inf文件安装,重启了。但是用windbg看不到调试语句输出。 怎么回事? …

查看全部问答>

tchar字符串转换为十进制的方法

请教一个问题: 在WinCE环境下,使用eVC编程 定义了2个字节的数据 TCHAR buf1[3]=_T(\"7A\"); SetDlgItemText(IDC_EDIT3,buf1); 显示的ASCII 现在我想用十进制显示出来,怎么转换呢?…

查看全部问答>

有关使用定时器产生PWM输出的配置问题、求高手!

看了STM32应用上讲的使用定时器产生PWM输出,其中一个配置步骤: 根据需要的频率和占空比计算出输出高电平的时间和低电平的时间:OCHy = 通道y的高电平时间;OCLy =通道y的低电平时间把OCHy写入对应的输出比较寄存器,并启动计数器开始计数,比较 ...…

查看全部问答>

伺服电机的测速方法介绍.

伺服电机的测速方法介绍.…

查看全部问答>

STC单片机 PCA 和DC问题

为什么我的STC当PCA定时和DC运算同时进行时 数据会乱跳,关掉DC运算PCA定时就正常了…

查看全部问答>

MSP430里的标志位定义方法

MSP430里没有位定义 可下面结构体定义来代替 struct flag_inf{              unsigned doc:1;        unsigned m:1;        unsigned up:1;     ...…

查看全部问答>

LVPECL问题

有个问题,请教大家,如果有个LVPECL的信号Q和Q把,怎么输入到FPGA中去啊?作为外部时钟输入。在管脚分配的时候,选LVPECL外,里面代友怎么写?要描述下,Q和Q把 的逻辑关系就好了?还是要怎么样的?困惑中。…

查看全部问答>