无延时的按键消抖
时间: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。
够简单的说,赞一个先。
受教了
赞一个……对定时计数器又加深了理解