|
#include <reg51.h> //程序目的:从0计时到9999(数码管一位一位的打开)
#define uchar unsigned char
#define uint unsigned int
sbit K0=P3^0;sbit K1=P3^1;sbit K2=P3^2;sbit K3=P3^3;
uint counter,time_counter=0;
uchar code du[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F //"9"
}; //每个数码管显示
void delay(uint z)//延时函数
{
uchar x,y;
for(x = z;x > 0;x--)
for(y = 110;y >0;y--);
}
void init() //定时初始函数
{
TMOD = 0X10;
TH1 = (65536-46082)/256;
TL1 = (65536-46082)%256;
// TR1 = 1;
}
void display(uint time_counter) //数码管显示函数
{
uchar ge,shi,bai,qian;
ge = time_counter%1000%100%10;
shi = time_counter%1000%100/10;
bai = time_counter%1000/100;
qian = time_counter/1000;
if(0 <= time_counter <= 9) //计时9之内
{
P1 = 0xfe;
P0 = du[ge];
delay(1);
P0 = 0X00;
}
if(9 < time_counter <= 99) //计时9至99之间
{
P1 = 0xfe;
P0 = du[ge];
delay(1);
P0 = 0X00;
P1 = 0xfd;
P0 = du[shi];
delay(1);
P0 = 0X00;
}
if(99 < time_counter <= 999) //计时99至999之间
{
P1 = 0xfe;
P0 = du[ge];
delay(1);
P0 = 0X00;
P1 = 0xfd;
P0 = du[shi];
delay(1);
P0 = 0X00;
P1 = 0xfb;
P0 = du[bai];
delay(1);
P0 = 0X00;
}
if(time_counter > 999) //计时999以上
{
P1 = 0xfe;
P0 = du[ge];
delay(1);
P0 = 0X00;
P1 = 0xfd;
P0 = du[shi];
delay(1);
P0 = 0X00;
P1 = 0xfb;
P0 = du[bai];
delay(1);
P0 = 0X00;
P1 = 0xf7;
P0 = du[qian];
delay(1);
P0 = 0X00;
}
}
void main()
{
init();
while(1)
{
if(TF1 == 1)
{
TF1 = 0;
TH1 = (65536-46082)/256;
TL1 = (65536-46082)%256;
counter++; //延时50ms后counter+1
}
if(counter == 1)
{
counter = 0;
time_counter++; //20次后即一秒time——counter+1
}
if( time_counter == 9999)
{
while(1);
}
if(K0 == 0)
{
delay(10);
if(K0 == 0)
{
TR1 = 1;
while(!K0);
}
}
if(K1 == 0)
{
delay(10);
if(K1 == 0)
{
TR1 = 0;
while(!K1);
}
}
if(K2 == 0 && TR1 == 0)
{
delay(10);
if(K2 == 0)
{
time_counter++;
while(!K2);
}
}
if(K3 == 0 && TR1 == 0)
{
delay(10);
if(K3 == 0)
{
time_counter--;
while(!K3);
}
}
display(time_counter);
}
}
我想实现数码管一位一位的亮(0-9999)~他却前三位都亮了~直到999开始才是我要的。
|
|