你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

单片机——按键检测

[复制链接]
gaosmile 发布时间:2020-11-22 10:24
一、总结

好了,单片机这个东西呢,无非是输入和输出,所以经过前面两个led灯,实际上单片机就学完了一半了,甚至是学完了一大半了,毕竟任何一个单片机都不可能没有输出,没有输出的单片机是没有任何意义的,但是可以没有输入,比如流水灯,不需要进行任何信息的输入,也是可以好好的闪灯的。今天写写另一半,输入之典型---按键。

二、按键电路设计

比较常见的按键检测电路有好几种设计方法,其中最常见的就是一个端口加一个按键,如图1,还有矩阵键盘,如图二。还有一些键盘比如利用单片机的AD功能,可以实现一个AD脚检测电压的功能,接4个甚至8个按键,通过按键实现不同的阻值导通,达到分压的效果,实现每个按键对应一个电压值,达到按键区分的效果;还有些单片机内部集成了触摸按键的检测电路,只需要在单片机管脚上接上金属片,当触摸时也能检测到按键。

微信图片_20201122102214.png

微信图片_20201122102219.png

三、按键扫描

好了回到主题,按键电路设计起来是比较简单的,但是按键扫描却不是一件简单的事情,事实上,按键扫描可玩性非常高,比如说:单按键单次按下、单按键连按、单按键长按、双按键同时按下等应用场景,写起来都要想一想。即使是同一种按键功能,也有多种实现方式。接下来看看比较简单的按键扫描的代码。以下代码实现参考图一和图二 。。。。。。。心态崩了呀,录得视频竟然能忘了开麦。。。。。。。

以下代码仅示例,没验证,不保证能用

1. 单按键单次按下
  • #include "reg52.h"

  • //定义管脚
  • sbit key = P2^0;

  • void main()
  • {
  •     //定义管脚状态
  •     bit key_status = 1;
  •     while(1)
  •     {
  •         //如果key按下(0),且上一次状态是弹起(1)
  •         //则执行对应代码,并将状态改为按下(0)
  •         if(!key && key_status)
  •         {
  •             dosth();
  •             key_status = 0;
  •         }
  •         //如果key弹起(0),且上一次状态是按下(1)
  •         //则执行对应代码,并将状态改为按下(1)
  •         if(key && !key_status)
  •         {
  •             key_status = 1;
  •         }

  •     }
  • }

2. 三行代码按键扫描

本来想着这一篇就是写这个三行代码的,写着写着它就成了一个小小节了。

  • //仅示例代码,不保证能用
  • BYTE Trg;
  • BYTE Cont;
  • void KeyRead( void )
  • {
  •     BYTE ReadData = ~P2;
  •     Trg = ReadData & (ReadData ^ Cont);
  •     Cont = ReadData;
  • }

按键按下时各变量的变化,尤其需要注意Trg变量只变化一次,Cont则会保持状态。

微信图片_20201122102224.png

3. 矩阵键盘扫描
  • //仅示例代码,不保证能用
  • BYTE Trg;
  • BYTE Cont;
  • void KeyRead( void )
  • {
  •     BYTE ReadData = scankey();
  •     Trg = ReadData & (ReadData ^ Cont);
  •     Cont = ReadData;
  • }

  • BYTE scankey()
  • {
  •     BYTE val[] = {0xfe, 0xfd, 0xfb, 0xf7,0xff};
  •     BYTE temp, key = 0, i;

  •     for (i = 0; i < 4; i++)
  •     {
  •         P2 = val[i];
  •         temp = P2 & 0xf0;
  •         switch (temp)
  •         {
  •         case 0xe0:
  •             key = 1 + i * 4;
  •             break;
  •         case 0xd0:
  •             key = 2 + i * 4;
  •             break;
  •         case 0xb0:
  •             key = 3 + i * 4;
  •             break;
  •         case 0x70:
  •             key = 4 + i * 4;
  •             break;
  •         default:
  •             break;
  •         }
  •     }
  •     P2 = val[i];
  •     return key;
  • }

四、按键去抖

由于按键属于一种机械结构(即使是触摸按键也没办法保证能够一瞬间保持稳定的电平),那么在按下(弹起)时就很难直接从高电平降到低电平,而是会经历一定的抖动逐渐的达到稳定的低电平状态。还有另外一种情况,即使我们没有按下按键,管脚也可能由于收到外界干扰而产生低电平(当年开发ESP8266就出现这种问题,拿螺丝刀敲击屏蔽壳,就可能会出现外部中断管脚被触发的情况,将该管脚换成软件检测,并添加去抖程序后解决问题),所以按键的去抖是很重要而且很有必要的,那么去抖我了解到的主要有两种方式,即硬件去抖和软件去抖。

1. 软件去抖

软件去抖的原理比较简单,就是当检测的低电平时,进行时间延时,当经过一定时间(比如20ms)后,再次对该管脚进行检测,如果仍然是低电平,则可以认为管脚状态已经稳定了,也就是确定是按下了。好处么,实现简单,不花钱。

2. 硬件去抖

硬件去抖的原理是采用了电容的滤波作用,抖动的过程实际就是电平波动的过程,在设计时可以给按键并联一个104(0.1uf)的电容,经过实际验证,通过示波器进行查看时,电平变化基本就是直上直下,没有抖动电平的出现,好处就是不需要加延时了。实际上,即使不加电容,如果手比较稳定,抖动也不像想象中的那么的严重,但是不去抖肯定是不行的。而且去抖可以软硬件相结合,确保万无一失。

收藏 1 评论0 发布时间:2020-11-22 10:24

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版