#include <REGX52.H>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar counter1=0; //消抖计时
uint counter2=0; //按下结束计时
bit Start=0; //消抖起始标志位
bit Over=0; //消抖结束标志位
sbit Key1=P3^1;
sbit Key2=P3^0;
sbit LED1=P2^0;
sbit LED2=P2^1;
void Timer0_init() //晶振频率12MHZ
{
TMOD=0x02; //8位自动重装载
TH0=156; //自动重装载值
TL0=156; //装填初值
ET0=1; //开定时器0中断
EA=1; //开总中断
TR0=1; //开定时器
}
void Timer0_Routine() interrupt 1 //0.1ms中断
{
if(Start==1) counter1++;
if(Over==1)
{
if(++counter2==1000){ //一般按键按下到弹起时间间隔为100ms,长按连击效果
counter2=0;
Over=0;
}
}
}
void Key_scan()
{
if(counter1<150){ //按下15ms内不执行后续代码,达到消抖效果
Start=1;
return;
}
if(counter1>150) //15ms消抖结束
{
Start=0;counter1=0;
//判断按键状态,执行相应按键任务
if(Key1==0){
LED1=!LED1; //按键1任务,把你想要执行的任务放在这里
//KEY1_Task();
Over=1;return;
}
else if(Key2==0){
LED2=!LED2; //按键2任务
//KEY2_Task();
Over=1;return;
}
else;
}
}
void main()
{
Timer0_init();
while(1)
{
if(Key1==0||Key2==0){ //把用到的按键都添加到此处
if(Over==0) Key_scan();
}
}
}
基于51单片机独立按键无延时消抖程序
于 2021-12-19 03:04:28 首次发布