完全下圖做時間電路和程序,共陽數碼管,可以實現樓主想要的功能。 A、B 鍵互鎖,不需要消抖,用閃爍表示換顯示位,否則相鄰數字相同無法分辨。小數點前為妙,小數點后為毫秒。
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit A1=P3^4;
- sbit A2=P3^5;
- uint m=0;
- uint count,t;
- uchar code table[]={//共陽數碼管"0~f .-"
- 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
- uchar cnt[6]={0xc0,0xc0,0xc0,0xc0,0xc0,0xc0};//小數緩存
- bit flag=0;
- bit sign=0;
- bit init=0;
- void start()
- {
- TMOD=0x01; //T0 使用工作方式 1
- TH0=(65536-1000)/256; //1ms 定時
- TL0=(65536-1000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void display() //顯示子程序,從第一位開始逐位顯示't 00秒 000毫秒'
- {
- static uint j=0;
- if(sign)
- P0=0xbf;//等待計數時顯示'-'
- else
- {
- if(j<=900)
- P0=cnt[m];
- else if(init==1)
- P0=0xff;//閃爍表示換位顯示
- j++;
- if(j>=1000)
- {
- j=0;
- m++;
- m%=6;
- }
- }
- }
- void main(void)
- {
- start();
- P0=0xc0;//初始顯示0
- while(1)
- {
- if(A1==0 && flag==0) //按鍵掃描
- {
- flag=1;
- count=0;
- t=0;
- sign=1;
- init=1;
- }
- if(A2==0 && flag==1)
- {
- sign=0;
- flag=0;
- cnt[0]=0x87;
- cnt[1]=table[t/10];
- cnt[2]=table[t%10]&0x7f;//加秒點
- cnt[3]=table[count/100];
- cnt[4]=table[count/10%10];
- cnt[5]=table[count%10];
- m=0;
- }
- }
- }
- void time0(void) interrupt 1 //T0 中斷服務子程序
- {
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- if(sign)
- {
- count++;
- if(count>=1000)
- {
- count=0;
- t++;
- if(t>=60)
- {
- t=0;
- }
- }
- }
- display();
- }
復制代碼
|