按键为什么要消抖呢?

按键再按下时,由于弹片时金属的,会产生振动导致当时IO口读取电平状态错误,其次如果将手指或其他导电物体接触到键盘底部的引脚也会导致读取电平状态错误。(我之前试过在while循环中只读按键和串口发送键值,这时甚至空放也会有个别键值错误)。

什么是状态机消抖?

即使用状态机原理进行消抖,具体来说为间隔(通用消抖间隔为20ms)的调用获取键值的函数,此函数内部会根据具体状态执行相应代码(看下面示例吧,更好看)。下面是我同学根据我代码画的阉割版状态机图(我不想画了,这个图也可以实现消抖,但不是最完备的)

下面是读取键值代码,后续还有另一重状态机处理读取的键值。

​
/*
下面为获取当前按键键值,需要自己实现,我用的为翻转法,后续有空会专门写一篇write_matrix_4x4(0x0f);key_ch[0] = matrix_4x4_r11();key_ch[1] = matrix_4x4_r21();key_ch[2] = matrix_4x4_r31();key_ch[3] = matrix_4x4_r41();write_matrix_4x4(0xf0);key_ch[4] = matrix_4x4_r51();key_ch[5] = matrix_4x4_r61();key_ch[6] = matrix_4x4_r71();key_ch[7] = matrix_4x4_r81();read_now_value = (key_ch[7] << 7) | (key_ch[6] << 6) | (key_ch[5] << 5) | (key_ch[4] << 4) | (key_ch[3] << 3) | (key_ch[2] << 2) | (key_ch[1] << 1) | key_ch[0]; //这一步为获取当前键值
*/
#define no_press_state 1     //未按下状态
#define judge_jitter_state 2 //判断抖动状态
#define press_state 3        //按下状态
byyc_u8 read_matrix_4x4()
{byyc_u8 return_key = matrix_4x4_key_no, read_now_value;byyc_u8 key_ch[8];static byyc_u8 matrix_4x4_state = no_press_state, matrix_last_key_value = matrix_4x4_key_no;write_matrix_4x4(0x0f);key_ch[0] = matrix_4x4_r11();key_ch[1] = matrix_4x4_r21();key_ch[2] = matrix_4x4_r31();key_ch[3] = matrix_4x4_r41();write_matrix_4x4(0xf0);key_ch[4] = matrix_4x4_r51();key_ch[5] = matrix_4x4_r61();key_ch[6] = matrix_4x4_r71();key_ch[7] = matrix_4x4_r81();read_now_value = (key_ch[7] << 7) | (key_ch[6] << 6) | (key_ch[5] << 5) | (key_ch[4] << 4) | (key_ch[3] << 3) | (key_ch[2] << 2) | (key_ch[1] << 1) | key_ch[0]; //这一步为获取当前键值switch (matrix_4x4_state){case no_press_state: //未按下状态{if (read_now_value != matrix_4x4_key_no) //不等于未按下的键值{matrix_4x4_state = judge_jitter_state;  //转入判断是否抖动状态matrix_last_key_value = read_now_value; //将当前值保存,方便后续判断抖动}}break;case judge_jitter_state: //判断抖动状态{if (read_now_value == matrix_last_key_value) //当前值与上次保存值相等,所以为非抖动状态{return_key = read_now_value;    //将返回值设为当前键值matrix_4x4_state = press_state; //转入按下状态}else if (read_now_value == no_press_state) //当前值与未按下的键值相等,所以为抖动状态{matrix_4x4_state = no_press_state; //返回未按下状态matrix_last_key_value = read_now_value;}else //与保存值和未按下的键值均不相等,即键值不稳定需要再次判断{matrix_4x4_state = judge_jitter_state;  //保持判断抖动状态(可不写)matrix_last_key_value = read_now_value; //将当前值保存,方便后续判断抖动}}break;case press_state: //按下状态{if (read_now_value == matrix_last_key_value) //当前值与上次保存值相等,为按下状态{return_key = read_now_value;    //将返回值设为当前键值(可不写)matrix_4x4_state = press_state; //保持按下状态(可不写)}else if (read_now_value == no_press_state) //当前值与未按下的键值相等,按键抬起{matrix_4x4_state = no_press_state; //返回未按下状态matrix_last_key_value = read_now_value;}else //与保存值和未按下的键值均不相等,即按键可能有新按键按下(可实现多按键一起按下){matrix_4x4_state = judge_jitter_state;  //转入判断抖动状态matrix_last_key_value = read_now_value; //将当前值保存,方便后续判断抖动}}break;default:break;}return return_key;
}​

按键状态机消抖(上)相关推荐

  1. 单片机矩阵消抖延时c语言,单片机矩阵按键定时器消抖程序源码

    芯片是采用的stc89c51单片机. 下面是矩阵键盘的电路图,矩阵键盘是接在p2口的. 下面是单片机部分的图,数码管显示等完整的原理图可以从http://www.51hei.com/f/ks51.pd ...

  2. FPGA实现按键检测消抖程序

    这个是黑金的板子提供的原版按键消抖程序 `timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2020/02/29 1 ...

  3. 单片机入门资料,按键消抖方式,按键怎么消抖

     1.什么是按键消我们先来看一下按键按下去的波形图 1.按键消抖原理 我们可以看到当按键按下的那一时刻和松开的时候有类似于锯齿的形状那就是按键抖动,这个抖动不是我们人为能控制得了的,所以我们只能对进行 ...

  4. 状态机按键消抖电路设计

    按键消抖电路设计 1. 什么是按键抖动 2. 消抖电路设计思路 3. 代码实现 4. 仿真测试 4.1. initial语句块赋值 4.2. 调用task任务封装赋值并调用$random函数 重新补充 ...

  5. Verilog实现独立按键消抖(状态机)

    本文参考小梅哥的独立按键消抖视频 1,实验原理: 这里是黑金开发板教程中的图,可以看出,按键未按下时的状态是高电平,按下为低电平.下边是小梅哥画的图解. 因为是机械按键,按下时候有一个不稳定的抖动期, ...

  6. 一种相对高效的按键消抖方法

    按键软件消抖自我接触单片机开始就已经存在这个问题了,网上的办法无非是延时消抖和定时轮询.对于写裸机的我来说这两种方法都不可避免的会有资源浪费掉,今天突然有了灵感,想到了一种相对高效的办法来解决消抖问题 ...

  7. 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击

    九层妖塔 起于垒土 直接跳转到三行代码 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击 一.基本理论 0.按键的常见名词:  ①按键抖动  ②按键稳定闭合时间 1.按键的扫描: 2.按键的消抖 ...

  8. STM32按键消抖的几种实现方式-STM32 Button Debouncing

    一.按键抖动的现象 按键按下和松开的时候,按键金属片之间的贴合.分离有一个过程.给STM32输入的信号并不是理想的0和1切换的过程.而是如下图所示的,按下和松开的一小段时间内按键信号出现抖动(jitt ...

  9. FPGA学习笔记---利用连续赋值语句延时功能实现按键消抖

    最近一直在学习FPGA,今天在学习延时语句时,发现了连续赋值的一个特点.在连续赋值语句中添加延时时,任何小于延迟值的输入变化都会被滤除而不会体现在输出上.比如  #10 B = A; 当A的变化小于1 ...

最新文章

  1. 如何解决border的重叠问题
  2. Swoole实现私聊群聊
  3. 腾讯音视频实验室:基于音视频细分场景的技术创新探索
  4. Fedex Ship Manager Software安装
  5. java8 hadoop_java8-模拟hadoop
  6. 5次方用计算机,用科学计算器来求三的五次方的值,按键顺序是( )?
  7. [转载]Qt之鼠标样式_vortex_新浪博客
  8. asp.net页生命周期
  9. 属性用途_onenote样式系列②:详解11种默认样式,附style属性值
  10. 小程序把图片转换成base64
  11. VC里一些容易混淆的地方(转)
  12. matlab:圆形的图像识别(一)
  13. ASP.NET Web程序设计 第四章 系统对象
  14. 国内外证券交易系统开发平台比较
  15. TimerFd使用心得
  16. Unity笔记之Unity读取/写入Excel
  17. 百度seo和谷歌seo的区别
  18. Gif动图制作神器(GifCam)
  19. 使用这个算法我可以实现英雄联盟里英雄的走位|Java 开发实战
  20. 深圳地铁APP伴您行,妥妥的

热门文章

  1. [转贴]ERP实施呕心沥血谈
  2. 数据分析篇 Microsoft Excel 2016导入数据库数据-01
  3. flask操作MySQL
  4. error: yaml: line 6: mapping values are not allowed in this context
  5. ifttt_选择IFTTT平台的7个技巧
  6. IT软件行业网欣物业收费客服软件单页宣传资料源文件PSD格式
  7. FCU2201实现eth0网口做WAN口,eth1做LAN口
  8. python Ubuntu14.04+SQLSERVER在线显卡DIAG测试+BIOS升级(源码)
  9. Unity针对高低端机型的优化
  10. 如何使用 Python编程来识别整数、浮点数、分数和复数