添加去抖动程序
时间:10-02
整理:3721RD
点击:
本人最近在学习单片机编程,下面的是用中断控制LED灯的程序,请问大神添加按键去抖动的话应当怎么加?
#include < reg51.h >
#include <intrins.h>
sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;
unsigned int LedNumVal_1,LedNumVal_2,LedOut[8];
//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main(void)
{ unsigned char i;
P0=0xff;
P1=0xff;
P2=0xff;
// IT0=0; //低电平触发
IT0=1; //下降沿触发
EX0=1;
// IT1=0; //低电平触发
IT1=1; //下降沿触发
EX1=1;
EA=1;
while(1)
{
LedOut[0]=Disp_Tab[LedNumVal_1%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal_1%1000/100]|0x80; //0x7f小数点
LedOut[2]=Disp_Tab[LedNumVal_1%100/10];
LedOut[3]=Disp_Tab[LedNumVal_1%10];
LedOut[4]=Disp_Tab[LedNumVal_2%10000/1000];
LedOut[5]=Disp_Tab[LedNumVal_2%1000/100];
LedOut[6]=Disp_Tab[LedNumVal_2%100/10];
LedOut[7]=Disp_Tab[LedNumVal_2%10];
for( i=0; i<8; i++)
{ P0 = LedOut[i];
switch(i)
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
case 5:LS138A=1; LS138B=0; LS138C=1; break;
case 6:LS138A=0; LS138B=1; LS138C=1; break;
case 7:LS138A=1; LS138B=1; LS138C=1; break;
}
delay(150);
}
}
}
/********************************************************
* INT0中断函数 *
********************************************************/
void counter0(void) interrupt 0 using 1
{
EX0=0;
LedNumVal_1++;
EX0=1;
}
/********************************************************
* INT1中断函数 *
********************************************************/
void counter1(void) interrupt 2 using 2
{
EX1=0;
LedNumVal_2++;
EX1=1;
}
/********************************************************/
#include < reg51.h >
#include <intrins.h>
sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;
unsigned int LedNumVal_1,LedNumVal_2,LedOut[8];
//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main(void)
{ unsigned char i;
P0=0xff;
P1=0xff;
P2=0xff;
// IT0=0; //低电平触发
IT0=1; //下降沿触发
EX0=1;
// IT1=0; //低电平触发
IT1=1; //下降沿触发
EX1=1;
EA=1;
while(1)
{
LedOut[0]=Disp_Tab[LedNumVal_1%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal_1%1000/100]|0x80; //0x7f小数点
LedOut[2]=Disp_Tab[LedNumVal_1%100/10];
LedOut[3]=Disp_Tab[LedNumVal_1%10];
LedOut[4]=Disp_Tab[LedNumVal_2%10000/1000];
LedOut[5]=Disp_Tab[LedNumVal_2%1000/100];
LedOut[6]=Disp_Tab[LedNumVal_2%100/10];
LedOut[7]=Disp_Tab[LedNumVal_2%10];
for( i=0; i<8; i++)
{ P0 = LedOut[i];
switch(i)
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
case 5:LS138A=1; LS138B=0; LS138C=1; break;
case 6:LS138A=0; LS138B=1; LS138C=1; break;
case 7:LS138A=1; LS138B=1; LS138C=1; break;
}
delay(150);
}
}
}
/********************************************************
* INT0中断函数 *
********************************************************/
void counter0(void) interrupt 0 using 1
{
EX0=0;
LedNumVal_1++;
EX0=1;
}
/********************************************************
* INT1中断函数 *
********************************************************/
void counter1(void) interrupt 2 using 2
{
EX1=0;
LedNumVal_2++;
EX1=1;
}
/********************************************************/
给你一个思路判断延时下再判断最后再加while松键检测
按键触发中断之后,延时一定时间再次判断状态,之后可以用while进行松开检测,如果同时开定时器的话还能判断长按短按。