unsigned char second=0,minute=0,hour=0,max=23; //second秒,minute分,hour時,max時制
//主函
main()
{
unsigned char code table[]={0xdd,0x84,0xe9,0xec,0xb4,0x7c,0x7d,0xc4,0xfd,0xfc};
unsigned int i;
void good();
TMOD=0X11; //T0工作於定時模式1用於計時,T1工作於定時模式1用於掃描按鍵
IE=0X8a; //開放T0、T1中斷
IP=0X80; //T1優先級高於T0,有按鍵停止計時
TH0=0X3c; //設置T0初值,定時5MS
TL0=0Xb0;
TH1=0x3c; //定時250ms掃描按鍵;
TL1=0xb0;
TR1=1; //啟動
good();
while(1) //掃描輪流顯示
{
i=minute/10; //顯示分十位
P0_5=0;
P0_4=1;
P0_6=1;
P0_7=1;
P2=table[i];
for(i=0;i<500;i++);
i=minute%10; //顯示分個位
P0_5=1;
P0_4=0;
P0_6=1;
P0_7=1;
P2=table[i];
for(i=0;i<500;i++);
i=hour%10; //顯示時個位
P0_5=1;
P0_4=1;
P0_6=0;
P0_7=1;
P2=table[i];
for(i=0;i<500;i++);
i=hour/10; //顯示時十位
P0_5=1;
P0_4=1;
P0_6=1;
if(i!=0)P0_7=0;
P2=table[i];
for(i=0;i<500;i++);
}
}
//計時中斷程序
void abc() interrupt 1 //t0(計時)中斷子程序
{
static char a=0;
TH0=0X3c; //重賦初值
TL0=0Xb0;
a++;
if (a==20) //當a=20時壹秒到了
{a=0;
P1_7=~P1_7; //二級管取反閃爍
second++; //秒增1
if(minute==0)
{if(second<2*hour)P1_4=~P1_4;
else P1_4=1; }
if(second==60){second=0;minute++;} //秒計到60,秒清0,分增壹
if(minute==60){minute=0;hour++;} //分計到60,分清0,時增壹
if(hour==max+1){hour=0;} //時計到最大值,清0
}
}
//按鍵中斷處理程序
void key() interrupt 3
{ char key=9;
// int i;
static char b=0;
TR1=0; //停止計時
TH1=0x3c; //重賦初值
TL1=0xb0;
b++; //250ms計數
if(b==5){ //判斷按鍵是哪壹個
if(P1_0==0)key=0;
if(P1_1==0)key=1;
if(P1_2==0||P3_2==0)key=2;
if(P1_3==0)key=3;
b=0;
}
switch (key)
{
case 0: //按下調時鍵調整時數
{TR0=0;
hour++;
if (hour==max+1)hour=0;
break;}
case 2: //按下調分鍵調整分數
{TR0=0;
minute++;
if (minute==60)minute=0;
break;}
case 1: {TR0=1;break;}//按下重啟鍵重新計時
case 3: Musicu(); //按下通訊鍵,功能待定
}
TR1=1; //重啟T1
}
void good()
{ int i,j=0,k;
unsigned char a[]={0x00,0x00,0x00,0x84,0x00,0x19,0x2d,0x0d,0x79,0x00,0xbc,0x2d,0x9d} ;//放置0~9
while(TR0==0&&minute==0&&hour==0)
{ if(k==60 ) { k=0;j++;if(j==13) j=0;}
//顯示g
P0_5=1;
P0_4=1;
P0_6=1;
if(a[j%13]==0x00) P0_7=1;
else P0_7=0;
P2=a[j%13];
for(i=0;i<500;i++);
//顯示分十位
if(a[(j+1)%13]==0x00) P0_6=1;
else P0_6=0;
P0_4=1;
P0_5=1;
P0_7=1;
P2=a[(j+1)%13];
for(i=0;i<500;i++);
//顯示時O位
P0_4=1;
P0_6=1;
if(a[(j+2)%13]==0x00) P0_5=1;
else P0_5=0;
P0_7=1;
P2=a[(j+2)%13];
for(i=0;i<500;i++);
//顯示分0位
P0_5=1;
if(a[(j+3)%13]==0x00) P0_4=1;
else P0_4=0;
P0_6=1;
P0_7=1;
P2=a[(j+3)%13];
for(i=0;i<500;i++);
k++;
} }
這條程序寫進去要註意幾點.
因為數碼管的接法不同.給數組a[]的0~9的代碼也要改.要不然妳寫進去後,顯示都是亂碼