微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 无延时的按键消抖

无延时的按键消抖

时间:10-02 整理:3721RD 点击:

/*
****************************************************************************
*        名称:key.c
*
*        功能:独立按键测试,非挂起延时防抖
****************************************************************************
*/
#include        "stc89xx.h"
#define                key1                        P10
volatile unsigned char key1_timer;
volatile unsigned char key1_valid;
void key_timer0_init(void)
{
        TMOD&=0xF0;
        TMOD|=0x01;
        TH0=(65536-Fclk/1000/12*5+15)/256;                         //定时间隔为5ms,加15是为了修正重装所花费时间
        TL0=(65536-Fclk/1000/12*5+15)%256;   
        ET0=1;
        TR0=1;
        EA=1;        
}
/********************************************************************
函数功能:在定时器0中断里获取按键
入口参数:无。
返    回:无。
备    注:22.1184M晶体约5ms中断一次。
********************************************************************/
void Timer0Isr(void) interrupt 1
{
        TH0=(65536-Fclk/1000/12*5+15)/256;                         //定时间隔为5ms,加15是为了修正重装所花费时间
        TL0=(65536-Fclk/1000/12*5+15)%256;   
        
        if(key1==0)                                                                        //按键此刻按下
        {
                key1_timer++;                                                        //计时
                if(key1_timer>=2)                                                                                       
                {        
                        key1_timer=2;
                        key1_valid=1;                                                //按键生效
                }
        }
        else
       {        
                key1_timer=0;
                key1_valid=0;                                                         //按键无效
       }
        
}

这是定时器扫描是吗?为啥扫描间隔时间5ms那么长? Fclk是啥?

一个按键为什么防抖动,通常按键按下需要大约5ms-10ms左右才能稳定的保持按下的状态。
你用1us,1ms间隔测得的状态是不稳定的。
fclk是系统时钟频率,例如你外挂11.0592晶振这个数值就是110592。

够简单的说,赞一个先。

受教了                     

赞一个……对定时计数器又加深了理解

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top