#include<reg52.h>
#include"led.h"
uchar code lednum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x76,0x38};//数码管字0~9、'-'、'H'、'L'、,共阴数码管段码
uchar code lednum_p[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//数码管字0~9,带小数点
/*****************延时函数********************/
void LedDelay(uint x)
{
uchar k;
while(x--)
for(k=0;k<30;k++) ;
}
/*****************数码管扫描********************/
void LedScan(void)
{
uchar k;
for(k=0;k<100;k++)
{
SEG=lednum[dig0]; DIG=0xfe; LedDelay(1); SEG=0x00;//DIG是选择哪一只数码管点亮
SEG=lednum_p[dig1]; DIG=0xfd; LedDelay(1); SEG=0x00;//SEG是选择数码管哪几段亮,这里0x00是熄灭所有段
SEG=lednum[dig2]; DIG=0xfb; LedDelay(1); SEG=0x00;
SEG=lednum[dig3]; DIG=0xf7; LedDelay(1); SEG=0x00;
}
}
/**************数码管某位闪烁*****************/
void LedFlick(uchar FlickBit)
{
uchar k;
for(k=0;k<100;k++)
{
switch(FlickBit)
{
case(1)://第1位数码管闪烁,右往左
SEG=lednum[dig0];if(k<50){DIG=0xfe; LedDelay(1);}else{DIG=0xff; LedDelay(1);} SEG=0x00;
SEG=lednum_p[dig1]; DIG=0xfd; LedDelay(1); SEG=0x00;
SEG=lednum[dig2]; DIG=0xfb; LedDelay(1); SEG=0x00;
SEG=lednum[dig3]; DIG=0xf7; LedDelay(1); SEG=0x00;
break;
case(2)://第2位数码管闪烁
SEG=lednum[dig0]; DIG=0xfe; LedDelay(1); SEG=0x00;
//SEG=lednum_p[dig1];if(k<50){DIG=0xfd; LedDelay(1);}else{DIG=0xff; LedDelay(1);} SEG=0x00;
//以下这句是用来处理闪烁数字而不闪烁小数点的
DIG=0xfd; if(k<50){SEG=lednum_p[dig1];LedDelay(1);}else{SEG=0x80; LedDelay(1);} DIG=0xff;
SEG=lednum[dig2]; DIG=0xfb; LedDelay(1); SEG=0x00;
SEG=lednum[dig3]; DIG=0xf7; LedDelay(1); SEG=0x00;
break;
case(3)://第3位数码管闪烁
SEG=lednum[dig0]; DIG=0xfe; LedDelay(1); SEG=0x00;
SEG=lednum_p[dig1]; DIG=0xfd; LedDelay(1); SEG=0x00;
SEG=lednum[dig2];if(k<50){DIG=0xfb; LedDelay(1);}else{DIG=0xff; LedDelay(1);} SEG=0x00;
SEG=lednum[dig3]; DIG=0xf7; LedDelay(1); SEG=0x00;
break;
case(4)://第4位数码管闪烁
SEG=lednum[dig0]; DIG=0xfe; LedDelay(1); SEG=0x00;
SEG=lednum_p[dig1]; DIG=0xfd; LedDelay(1); SEG=0x00;
SEG=lednum[dig2]; DIG=0xfb; LedDelay(1); SEG=0x00;
SEG=lednum[dig3];if(k<50){DIG=0xf7; LedDelay(1);}else{DIG=0xff; LedDelay(1);} SEG=0x00;
default:break;
}
}
} |