|
#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開始才是我要的。
|
|