4.3.认识按键抖动并消除抖动

原创 2016年06月02日 10:40:32

实验目的:认识按键抖动并消除抖动

预备知识:
(1)什么是抖动:按键的内部结构是一个弹簧,当按键被按下的时候,弹簧可能会抖动好几次,而CPU轮训读取按键的IO端口的速度是很快的,可在抖动期间可能会多次读取IO口的电平值造成“按一次按键增加多次的现象”
(2)通过延时一段时间来“错过抖动期”
(3)全局变量:全局变量定义在函数外面,其作用与为整个程序,生命周期为从程序开始到程序结束。
实验过程分析:
(1)通过“按键一次使数码管增加1”实验,了解什么是抖动
(2)如何消除抖动
(3)测试代码

第一步:通过上节课代码进行改造成按键一次使数码管增加1
第二步:发现现象:按一次可能会增加好多数,而非只增加1
第三步:分析现象发现按键抖动

实验代码:

/******************** 按键一次使数码管增加1实验的代码************************/

#include<reg51.h>

sbit key1 = P1^0;       //  按键1接在P1^0
                        //  P0端口接数码管
unsigned char dnum = 0;
int dm[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc7,0xa1,0x86,0x8e};
                        //独立数码管的段码表

void display(void);
void delay(void);

void main(void)
{

    while(1)
    {
        if(key1==0)             //如果按键1被按下,则数码管就显示增加1
        {           
            display();
        }

          delay();      //延时函数
    }
}
//数码管显示函数
void display(void)
{                           //只有按键被按下,此函数才被执行
    dnum = dnum +1          //display函数每被执行一次,dnum 就 + 1
    P0 =dm[dnum];           //P0端口接到数码管上
}

void delay()
{
    unsigned char i = 0,j = 0;
    for(i=0;i<200;i++)
        for(j=0;j<200;j++);
}

上面的代码会导致一个问题,当按下一个按键时,数码管不是增加1,而是增加很多次,考虑其中的原理就是按键的抖动

/**************************** 按键消抖代码****************************/

#include<reg51.h>

sbit key1 = P1^0;
unsigned char dnum = 0;      //标记数码管显示的标记数
int dm[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc7,0xa1,0x86,0x8e};
    //独立数码管的段码表

void add_display(void);
void delay10ms(void);
void delay(void);

void main(void)
{
    unsigned char i=0;
    unsigned char keynum = 0;

    while(1)
    {
        if(key1==0)         //在1点检测到低电平
        {       
            delay10ms();    //延时10ms之后再来检测该电平
            if(key1 == 0)   //在2点及其之后,还是低电平,说明确实是按键被按下
            {
                add_display() ;     //显示函数被执行,数码管显示加 1
            }   

        }
        delay();
    }
}
/********************独立数码管显示****************************/
void add_display(void)
{
    dnum += 1;
    P0 = dm[dnum];
}
/*************延时函数(时间未知)*******************************/
void delay(void)
{
    unsigned char i = 0,j = 0;
    for(i=0;i<200;i++)
        for(j=0;j<200;j++);

}
/****************延时10ms*************************************/
void delay10ms(void)
{
    unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=4;b>0;b--)
            for(a=248;a>0;a--);
}

实验总结
(1)当按住一个按键不松开时,数码管会不停地增加,这是为什么?下节课介绍完整的按键检测。

版权声明:本文为博主原创文章,转载请注明出处。

stm32初学之GPIO寄存器

要控制GPIO端口,就得控制相关的寄存器。可分为4类,其功能简单概括如下: 1 .配置寄存器:选定GPIO 的特定功能,最基本的如:选择作为输入还是输出端口。 2. 数据寄存器:保存了 GPI...

stm32深入浅出——由GPIO谈谈寄存器配置

相信大家对GPIO的配置并不陌生,只需简单的几个库函数就能完成。而本菜今天要讲的不是怎么用这些库函数,而是要讲讲这些库函数是怎么工作的。本菜留意了下,无论是网上还是书籍,涉及这方面的知识很少,直接抄了...

内核定时器消除按键抖动

按键抖动 按键所用的开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,开关不会马上稳定地接通或断开。因而在闭合及断开的瞬间总是伴随有一连串的抖动。 按键去抖动的方法主要有两种:一...

android4.3 按键消息处理分析

2014-05-14     我来说两句    来源:android4.3 按键消息处理分析   收藏    我要投稿 Android4.3按键消息处理与之前的版本有稍微的区别,基本原...

Android4.3 屏蔽HOME按键返回桌面详解(源码环境下)

首先声明我是做系统开发的,

android4.3 按键消息处理分析

按键消息
  • txj8612
  • txj8612
  • 2014年05月13日 16:27
  • 1376

linux驱动程序之定时器防按键抖动

前提:按键按下通过中断方式进行处理。本博文基于上一个博文改写:上一篇博文 目的: 使用定时器防止按键抖动产生中断。 方法: 每次发生按键中断后,推迟10ms进行处理,最终将会只执行一次定时器中断处理...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:4.3.认识按键抖动并消除抖动
举报原因:
原因补充:

(最多只允许输入30个字)