前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单片机入门:按键消抖

单片机入门:按键消抖

作者头像
电子工程师成长日记
发布2022-07-21 15:48:33
8090
发布2022-07-21 15:48:33
举报

按键按下都会发出一声响,虽然有的按键声音很轻微,但这都是金属导体碰撞产生的震动,这种现象称为键盘抖动。如果不对键盘的抖动进行处理,按键会对系统电路或程序产生意外的干扰。

按键按下产生的抖动现象持续的时间不会很久,因此在按键按下后,可延时一段时间跳过抖动,再对按键的状态检测,从而利用延时的方法也可以实现键盘输入。本案例通过两个按键设计,实现对数码管显示数据的调整。利用延时函数消除键盘抖动实现键盘输入电路如图所示:

图中,KEY1、KEY2两个键盘一端分别接P3.0、P3.1,另一端接地,数码管仍使用共阳极数码管。在Proteuse软件中,按键的英文名字为BUTTON,在Switches& Relasy下的Switches里。现在实现两个按键控制数码显示的数字,其中KEY1按下使数字增加,数字到9后变为0,依次循环;KEY2按下使数字减小。

验证程序如下:

代码语言:javascript
复制
#include<reg51.h> 
#define uchar unsigned char
uchar code  seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit key1 = P3^0;
sbit key2 = P3^1;
uchar key1_state,key2_state;      //按键按下的状态变量
void delay(uchar i)
{
  while(i) i--; 
}
void key_scan(void)            //键盘扫描函数
{  
  if(key1 == 0)               //如果按键按下
  {  
    delay(200);              //延时一段时间,消除键抖
    while(key1 == 0);
     key1_state = 1;  //再对按键检测,如果确实按下,按键状态变量为1
  }
  if(key2 == 0)
  {  
    delay(200);
    while(key2 == 0)
     key2_state = 1;
  }
}
void main(void)
{  
  char i;
  while(1)
  {
    key_scan();          //调用键盘扫描函数
    if(key1_state == 1)  //判断键盘状态变量,如果为1,说明有按键按下
    {
      i++;                //显示数据增加
      key1_state = 0;    //数据增加后,键盘状态变量清零
      if(i>9) i = 0;   //数据增加超过9后,回到0
    }
    if(key2_state == 1)
    {  
      i--;
      key2_state = 0; 
      if(i < 0) i = 9;
    }
    P0 = seven_seg[i];    //显示键盘调整数据
    P2 = 0xfe;      //数码管SEG0显示
  }
}

如果按键按下不放开,程序一直执行语句while(key1==0),这时程序在此处死循环,不能执行其它程序,所以本案例按键抬起后数据才能得到调整。

仿真电路如图:

仿真视频如下:

http://mpvideo.qpic.cn/0bf2fya4oaabvmam6fukrzpvclwdy4xadrya.f10002.mp4?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子工程师成长日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档