要求:b0 b1 b2 b3 位始终显示0;b4 b5显示分钟,b6 b7显示秒
#include
unsigned int t=0,z=0;
code unsigned char BCDto7SEG[10]={0x5f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;
unsigned char d[8]={0,0,0,0,0,0,0,0};
void delay(void)
{unsigned int i;
for(i=0;i<123;i++);
}
void display(void)
{ unsigned char i;
for(i=0;i<8;i++)
{P0=BCDto7SEG[d];
P2=1<
delay();
P2=0;
}
}
int main(void)
{unsigned char i=0;
while(1)
{if(++i>=125)
{if(++t>5959)t=0;
d[7]=t%60%10;
d[6]=t%60/10;
d[5]=t/60%10;
d[4]=t/600;
i=0;
}
d[5]=t/60%10|0x80;
display();
}
}
首先要说的是,这个程序的书写风格真的很差,关键部位连注释都没,想看懂真的很费劲
现整理一下
- #include
- unsigned int t=0,z=0;
- code unsigned char BCDto7SEG[10]={0x5f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;
- unsigned char d[8]={0,0,0,0,0,0,0,0};
- void delay(void)
- {
- unsigned int i;
- for(i=0;i<123;i++)
- ;
- }
- void display(void)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- P0=BCDto7SEG[d[i]];
- P2=1<
- delay();
- P2=0;
- }
- }
-
- int main(void)
- {
- unsigned char i=0;
- while(1)
- {
- if(++i>=125)
- {
- if(++t>5959)
- t=0;
- d[7]=t%60%10;
- d[6]=t%60/10;
- d[5]=t/60%10;
- d[4]=t/600;
- i=0;
- }
- d[5]=t/60%10|0x80;
- display();
- }
- }
while(1)
{
if(++i>=125)
{
if(++t>5959) 根据上下程序联系,这里是否应该是改成3600?
t=0;
d[7]=t%60%10;
d[6]=t%60/10;
d[5]=t/60%10;
d[4]=t/600;
i=0;
}
d[5]=t/60%10|0x80;
display();
}
请注意,display()的自身耗时是很严重的,虽然这里是用了8*125的预想估算,但是for函数在转换为汇编的时候,并不能单纯的转换为DJNZ这样简单的循环,这方面的代码研究已经有过很多人做过,谷歌上有很多相关资料。既然用单片机,最好的做法是利用定时器来做定时而且这样还能使MCU主流程空闲出来作为显示用,非常合用。