只要滿足題目要求,方法越簡(jiǎn)單越好。由于單片機(jī)I/O資源足夠,所以雙數(shù)碼管可接成靜態(tài)顯示方式,兩個(gè)共陰數(shù)碼管分別接在P1(秒十位)和P2(秒個(gè)位)口,它們的共陰極都接地,安排兩個(gè)按鍵接在P3.2(十位數(shù)調(diào)整)和P3.3(個(gè)位數(shù)調(diào)整)上,為了方便計(jì)時(shí),選用12MHz的晶體。為了達(dá)到精確計(jì)時(shí),選用定時(shí)器方式2,每計(jì)數(shù)250重載一次,即250us,定義一整數(shù)變量計(jì)數(shù)重載次數(shù),這樣計(jì)數(shù)4000次即為一秒。定義兩個(gè)字節(jié)變量S10和S1分別計(jì)算秒十位和秒個(gè)位。編得如下程序:
#include <at89x52.h> Code unsigned char Seg7Code[16]= //用十六進(jìn)數(shù)作為數(shù)組下標(biāo),可直接取得對(duì)應(yīng)的七段編碼字節(jié) // 0 1 2 3 4 5 6 7 8 9 A b C d E F {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; void main( void ) { unsigned int us250 = 0; unsigned char s10 = 0; unsigned char s1 = 0; unsigned char key10 = 0; //記憶按鍵狀態(tài),為1按下 unsigned char key1 = 0; //記憶按鍵狀態(tài),為1按下 //初始化定時(shí)器 Timer0 TMOD = (TMOD & 0xF0) | 0x02; TH1 = -250; //對(duì)于8位二進(jìn)數(shù)來說,-250=6,也就是加250次1時(shí)為256,即為0 TR1 = 1; while(1){ //----------循環(huán)1 P1 = Seg7Code[ s10 ]; //顯示秒十位 P2 = Seg7Code[ s1 ]; //顯示秒個(gè)位 while( 1 ){ //----------循環(huán)2 //計(jì)時(shí)處理 if( TF0 == 1 ){ TF0 = 0; if( ++us250 >= 4000 ){ us250 = 0; if( ++s1 >= 10 ){ s1 = 0; if( ++s10 >= 6 ) s10 = 0; } break; //結(jié)束“循環(huán)2”,修改顯示 } } //按十位鍵處理 P3.2 = 1; //P3.2作為輸入,先要輸出高電平 if( key10 == 1 ){ //等松鍵 if( P3.2 == 1 ) key10=0; } else{ //未按鍵 if( P3.2 == 0 ){ key10 = 1; if( ++s10 >= 6 ) s10 = 0; break; //結(jié)束“循環(huán)2”,修改顯示 } } //按個(gè)位鍵處理 P3.3 = 1; //P3.3作為輸入,先要輸出高電平 if( key1 == 1 ) //等松鍵 { if( P3.3 == 1 ) key1=0; } else { //未按鍵 if( P3.3 == 0 ){ key1 = 1; if( ++s1 >= 10 ) s1 = 0; break; //結(jié)束“循環(huán)2”,修改顯示 } } } //循環(huán)2’end }//循環(huán)1’end }//main’end |
|