#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; } } } |