kwjy

持续进阶之三数码管简易时钟显示(续完)显示消影完结

0
阅读(1866)

只上修改了的代码,这回的确大意了。没注意到用的是共阴及数码管,结果用的是FF。火上浇油啊;有回头看了定时器刷新数码管的显示,修改过来了,但还是有点淡薄的影子,但是不仔细看很难发现;效果好多了;失误啊,下回我得注意点,嘿嘿


/*
MCU:STC89C52RC
Fosc:11059200Hz
日期:2014-04-28
2014-04-30修改BUG
网名:坎悟积验
功能:不可调节简单的数码管时钟
显示:00-00-00 :hour-fend-miao
*/
#include <reg52.h>

typedef unsigned char Uint8;
typedef unsigned int Uint16;
Uint8 code shuLED[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80,0x40};   //共阴数码管编码值
#define Pro0 P0

sbit DULA = P1^7;
sbit WELA = P1^6;

Uint8 tab[8] = {0};      //零时暂存的数据
Uint8 miao = 0,fend = 0,hour = 0;
void display_saxin(void);
void main()
{
TMOD  = 0x01;
TH0 = 0xf8;//2ms
TL0 = 0xcd;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1);
}

void display_saxin(void)
{
static Uint8 i = 0;
    switch(i)
{
case 0: DULA = 1;Pro0 = 0;DULA = 0;//关闭段码数据        放置上一次值得乱码
   WELA = 1;Pro0 = 0xfe;WELA = 0;Pro0 = 0;//关闭位码数据     选通位选  消影
DULA = 1;Pro0 = shuLED[tab[0]];DULA = 0;Pro0 = 0;    
i++;
       break;
case 1: DULA = 1;Pro0 = 0;DULA = 0;
WELA = 1;Pro0 = 0xfd;WELA = 0;Pro0 = 0;
DULA = 1;Pro0 = shuLED[tab[1]];DULA = 0;Pro0 = 0;
i++;
    break;
case 2: DULA = 1;Pro0 = 0;DULA = 0;
WELA = 1;Pro0 = 0xfb;WELA = 0;Pro0 = 0;
DULA = 1;Pro0 = shuLED[11];DULA = 0;Pro0 = 0;
i++;
   break;
case 3: DULA = 1;Pro0 = 0;DULA = 0;
WELA = 1;Pro0 = 0xf7;WELA = 0;Pro0 = 0;
DULA = 1;Pro0 = shuLED[tab[2]];DULA = 0;Pro0 = 0;
i++;
   break;
case 4: DULA = 1;Pro0 = 0;DULA = 0;
WELA = 1;Pro0 = 0xef;WELA = 0;Pro0 = 0;
DULA = 1;Pro0 = shuLED[tab[3]];DULA = 0;Pro0 = 0;
i++;
   break;
case 5: DULA = 1;Pro0 = 0;DULA = 0;
WELA = 1;Pro0 = 0xdf;WELA = 0;Pro0 = 0;
DULA = 1;Pro0 = shuLED[11];DULA = 0;Pro0 = 0;
i++;
    break;
case 6: DULA = 1;Pro0 = 0;DULA = 0;
WELA = 1;Pro0 = 0xbf;WELA = 0;Pro0 = 0;
DULA = 1;Pro0 = shuLED[tab[4]];DULA = 0;Pro0 = 0;
i++;
   break;
case 7: DULA = 1;Pro0 = 0;DULA = 0;
WELA = 1;Pro0 = 0x7f;WELA = 0;Pro0 = 0;
DULA = 1;Pro0 = shuLED[tab[5]];DULA = 0;Pro0 = 0;
i = 0;
   break;
default: Pro0 = 0;break;
}
}

void time0() interrupt 1
{
static Uint16 m = 0;
TH0 = 0xf8;
TL0 = 0xcd;//2ms
display_saxin();   //2MS刷新一次数码管位选
m++;
if(m == 500) //1s
{
m = 0;
miao++;
if(miao == 60) //1S到了清零计数值,并分离一次计数值送显示
{
miao = 0;
fend++;
if(fend == 60)
{
fend = 0;
hour++;
if(hour == 24)
{
hour = 0;
}
tab[0] = hour/10;
tab[1] = hour%10;     //时间到了分离一次计数值
}
tab[2] = fend/10;
tab[3] = fend%10;
}
tab[4] = miao/10;
tab[5] = miao%10;
}  
}

上图。。。。。