用按键控制数码管,每按下一次按键,数码管加一,按键如果不消抖,就会造成一次加两个数字甚至更多,会造成数码管的叠加;
以下有消抖和不消抖的代码;
一:不消抖:
#include <reg52.h>
sbit ADDR2 = P2^2;
sbit ADDR1 = P2^1;
sbit ADDR0 = P2^0;
sbit ENLED = P1^1;
sbit KOUT4 = P2^7;
sbit KEY4 = P2^3;
//sbit LED5 = P0^4;
//sbit LED6 = P0^5;
//sbit LED7 = P0^6;
//sbit LED8 = P0^7;
unsigned char ledchar[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
};
unsigned char cnt = 0;
unsigned char i = 0;
bit backup = 1;
bit keybuff = 1;
void main()
{
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 0;
ENLED = 0;
KOUT4 = 0;
KEY4 = 1;
P0 = ledchar[cnt];
while(1)
{
if(backup != KEY4)
{
if(backup == 0)
{
cnt++;
P0 = ledchar[cnt];
if(cnt>=10)
{
cnt=0;
}
}
backup = KEY4;
}
}
}
二:消抖代码
#include <reg52.h>
sbit ADDR2 = P2^2;
sbit ADDR1 = P2^1;
sbit ADDR0 = P2^0;
sbit ENLED = P1^1;
sbit KOUT4 = P2^7;
sbit KEY4 = P2^3;
//sbit LED5 = P0^4;
//sbit LED6 = P0^5;
//sbit LED7 = P0^6;
//sbit LED8 = P0^7;
unsigned char ledchar[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
};
unsigned char cnt = 0;
unsigned char i = 0;
void delay();
bit backup = 1;
bit keybuff = 1;
void main()
{
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 0;
ENLED = 0;
KOUT4 = 0;
KEY4 = 1;
P0 = ledchar[cnt];
while(1)
{
keybuff = KEY4;
if(keybuff != backup)
{
delay();
if(keybuff == KEY4)
{
if(backup == 0)
{
cnt++;
if(cnt>=10)
{
cnt = 0;
}
P0 = ledchar[cnt];
}
backup = keybuff;
}
}
}
}
void delay()
{
unsigned int i =0;
i = 1000;
while(i--);
}
消抖的时候就是用延时 可以把void delay这个
直接换成for延时 可以达到同样的效果
for(i=0;i<=100;i++);
|