??
字號:
#include "at89x51.h"
unsigned char code ddisp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段顯0123456789,P0口
unsigned char code wdisp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位選,P2口
void disp( );
void ms();
char data flag;
unsigned int m=0; //總累加器。
unsigned char m1=0,m2=0,m3=0; //秒,分,時累加器。
void time0(void ) interrupt 1 using 1//定時器T0中斷。
{TH0=0xb2;
TL0=0xe0;
flag++;
}
void main(void ) //主函數。
{
TMOD=0x01;
EA=1;
ET0=1;
TH0=0xb2;
TL0=0xe0; //20ms
flag=0;
while(1)
{do{
disp( );
}while(flag<=50); //等待1s時間
if(m==0)
{flag=0;
P1_1=1;
TR0=0;
m=m1=m2=m3=0;
} //時間到關定時器,關P1_1口
else
{flag=0;
--m; //時間不到,m減1
}
}
}
void disp( ) //顯示鍵盤函數
{
unsigned char k,S,S1,S2,M,M1,M2,H,H1,H2;
P2=wdisp[0]; //選中位
S=m%60;
S1=S%10; //數制轉換
for(k=0;k<50;k++)
{P0=ddisp[S1];} //顯示段碼
P0=0x00; //關顯示
if((P2_7==0)&&(TR0==0))
{if((P2_7==0)&&(TR0==0))
{ms();
do{}while(P2_7==0); //鍵盤除顫判斷s5的狀態
m1++;
if(m1>=60) m1=0;}} //60歸0
P2=wdisp[1];
S2=(S-S1)/10;
for(k=0;k<50;k++)
{P0=ddisp[S2];}
P0=0x00;
if ((P2_7==0)&&(TR0==0))
{if((P2_7==0)&&(TR0==0))
{ ms();
do{}while(P2_7==0); //鍵盤除顫判斷s4的狀態
m2++;
if(m2>=60) m2=0;}}
P2=wdisp[2];
M=((m-S)/60)%60;
M1=M%10;
for(k=0;k<50;k++)
{P0=ddisp[M1]+0x80; } //顯示小數點
P0=0x00;
if((P2_7==0)&&(TR0==0))
{ ms();
do{}while(P2_7==0); //鍵盤除顫判斷s3的狀態
m3++;
if(m3>=13) m3=0; }
P2=wdisp[3];
M2=(M-M1)/10;
for(k=0;k<50;k++)
{P0=ddisp[M2];}
P0=0x00;
if ((P2_7==0)&&(TR0==0))
{ ms();
if(P2_7==0) //鍵盤除顫判斷s2的狀態
TR0=1;
P1_1=0;
}
P2=wdisp[4];
H=((m-S)/60-M)/60;
H1=H%10;
for(k=0;k<50;k++)
{P0=ddisp[H1]+0x80;} //顯示小數點
P0=0x00;
P2=wdisp[5];
H2=(H-H1)/10;
for(k=0;k<50;k++)
{P0=ddisp[H2];}
P0=0x00;
if(TR0==0) m=m1+60*m2+3600*m3; //總計數轉換
}
void ms() //除顫程序
{unsigned int n;
for(n=0;n<1000;n++)
{ }
}
//本程序已通過uision2調試通過,在實驗板實驗正常,程序由祁維國編寫,其中s5為秒對時
//s4為分對時,s3為時對時,s2為啟動按鈕。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -