数码管消除抖动
#include<reg52.h>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
unsigned char code ledchar[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char ledbuff[6]={
0xff,0xff,0xff,0xff,0xff,0xff};
void secondcount();
void ledrefresh();
void main()
{
ENLED=0;
ADDR3=1;
TMOD=0X01;
TH0=0XFC;
TL0=0X67;
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0XFC;
TL0=0X67;
ledrefresh();
secondcount();
}
}
}
void secondcount()
{
static unsigned int cnt=0;
static unsigned long sec=0;
static unsigned char j=0;
cnt++;
if(cnt>=1000)
{
cnt=0;
sec++;
}
switch(j) //数码管抖动主要是因为段选,这里可以解决抖动问题;
{
case 0:ledbuff[0]=ledchar[sec%10];j++;;break;
case 1:ledbuff[1]=ledchar[sec/10%10];j++;break;
case 2:ledbuff[2]=ledchar[sec/100%10];j++;break;
case 3:ledbuff[3]=ledchar[sec/1000%10];j++;break;
case 4:ledbuff[4]=ledchar[sec/10000%10];j++;break;
case 5:ledbuff[5]=ledchar[sec/100000%10];j=0;break;
default:break;
}
}
/*
void secondcount()
{
static unsigned int cnt=0;
static unsigned long sec=0;
cnt++;
if(cnt>=1000)
{
cnt=0;
sec++;
ledbuff[0]=ledchar[sec%10];
ledbuff[1]=ledchar[sec/10%10];
ledbuff[2]=ledchar[sec/100%10];
ledbuff[3]=ledchar[sec/1000%10];
ledbuff[4]=ledchar[sec/10000%10];
ledbuff[5]=ledchar[sec/100000%10];
}
} */
void ledrefresh()
{
static unsigned char i=0;
P0=0XFF;
switch(i)
{
case 0:ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=ledbuff[0];break;
case 1:ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=ledbuff[1];break;
case 2:ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=ledbuff[2];break;
case 3:ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=ledbuff[3];break;
case 4:ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=ledbuff[4];break;
case 5:ADDR2=1;ADDR1=0;ADDR0=1;i=0;P0=ledbuff[5];break;
default:break;
}
}
这个案例中使用备注里的代码来段选时,运行起来需要的时间要长一些,会延长数码管位选的每次扫描间隔时间,从而导致了每次段选时,数码段所有数码管都会暗一下,看起来就像抖动了一下。