独立按键非延时去抖
时间:10-02
整理:3721RD
点击:
/*
研究独立按键非延时去抖程序
程序按键检测未模块化,有待改进
各按键处于研究状态,未有明确的含义
*/
#include<reg52.h>
#define N 50
typedef unsigned char uint8;
typedef unsigned int uint16;
code uint8 number[10]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};//0到9
uint8 a[4]={0};
uint16 x = 0;
sbit buff = P1^5;
void timer1_init(void)
{
TMOD |= 0x10;
TMOD &= 0xDF;
TH1 = 0XEC;
TL1 = 0X78; //刷新速度约为4ms
TR1 = 1;
ET1 = 1;
}
refresh(uint16 m) //加M是为了清掉高位0 数码管动态刷新函数
{
static uint8 j=0;
switch(j)
{
case 0:P1=0xf7;P0=number[a[0]];j++;break;
case 1:if(m>9)P1=0xfb;else P1=0xff;P0=number[a[1]];j++;break;
case 2:if(m>99)P1=0xfd;else P1=0xff;P0=number[a[2]];j++;break;
case 3:if(m>999)P1=0xfe;else P1=0xff;P0=number[a[3]];j=0;
default:j=0;
}
}
void delay(uint8 t)//延时函数,用在蜂鸣器中
{
uint8 i;
while(t--)
for(i=0;i<200;i++);
}
void buzzer() //无源蜂鸣器程序
{
uint8 i,j;
buff = 1;
for(i=0;i<60;i++)
{
buff = ~buff;
for(j=0;j<200;j++);
}
}
main()
{
uint8 i;
timer1_init();
EA = 1;
while(1)
{
for(i=0;i<9;i++)//P2控制led,用于检测单片机是否延时
{
P2=0xff>>i;
delay(N);
}
for(i=0;i<9;i++)
{
P2=0xff<<i;
delay(N);
}
}
}
void interrupt_timer1() interrupt 3
{
static char m=0;
timer1_init();
if(P3 == 0xff)
m=0;
else
m++;
if(m == 10)
{
m=-150;//x++;
switch(P3)
{
case 0x7f:x++;buzzer();break;
case 0xbf:x--;buzzer();break;
case 0xdf:x=3;break;
case 0xef:x=4;break;
case 0xf7:x=5;break;
case 0xfb:x=6;break;
}
a[0] = x%10;//数码管各位值
a[1] = x/10%10;
a[2] = x/100%10;
a[3] = x/1000%10;
}
refresh(x);//数码管刷新
}
研究独立按键非延时去抖程序
程序按键检测未模块化,有待改进
各按键处于研究状态,未有明确的含义
*/
#include<reg52.h>
#define N 50
typedef unsigned char uint8;
typedef unsigned int uint16;
code uint8 number[10]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};//0到9
uint8 a[4]={0};
uint16 x = 0;
sbit buff = P1^5;
void timer1_init(void)
{
TMOD |= 0x10;
TMOD &= 0xDF;
TH1 = 0XEC;
TL1 = 0X78; //刷新速度约为4ms
TR1 = 1;
ET1 = 1;
}
refresh(uint16 m) //加M是为了清掉高位0 数码管动态刷新函数
{
static uint8 j=0;
switch(j)
{
case 0:P1=0xf7;P0=number[a[0]];j++;break;
case 1:if(m>9)P1=0xfb;else P1=0xff;P0=number[a[1]];j++;break;
case 2:if(m>99)P1=0xfd;else P1=0xff;P0=number[a[2]];j++;break;
case 3:if(m>999)P1=0xfe;else P1=0xff;P0=number[a[3]];j=0;
default:j=0;
}
}
void delay(uint8 t)//延时函数,用在蜂鸣器中
{
uint8 i;
while(t--)
for(i=0;i<200;i++);
}
void buzzer() //无源蜂鸣器程序
{
uint8 i,j;
buff = 1;
for(i=0;i<60;i++)
{
buff = ~buff;
for(j=0;j<200;j++);
}
}
main()
{
uint8 i;
timer1_init();
EA = 1;
while(1)
{
for(i=0;i<9;i++)//P2控制led,用于检测单片机是否延时
{
P2=0xff>>i;
delay(N);
}
for(i=0;i<9;i++)
{
P2=0xff<<i;
delay(N);
}
}
}
void interrupt_timer1() interrupt 3
{
static char m=0;
timer1_init();
if(P3 == 0xff)
m=0;
else
m++;
if(m == 10)
{
m=-150;//x++;
switch(P3)
{
case 0x7f:x++;buzzer();break;
case 0xbf:x--;buzzer();break;
case 0xdf:x=3;break;
case 0xef:x=4;break;
case 0xf7:x=5;break;
case 0xfb:x=6;break;
}
a[0] = x%10;//数码管各位值
a[1] = x/10%10;
a[2] = x/100%10;
a[3] = x/1000%10;
}
refresh(x);//数码管刷新
}
欢迎各位提出更好的建议
