剛學沒幾天看不太懂
#include<reg52.h> #defineuint unsigned int #defineuchar unsigned char sbitkey1=P2^0; //定義"啟動/暫停"按鈕 sbitkey2=P2^1; //定義"復位"按鈕 sbitkey3=P2^2; //定義"模式"按鈕 sbitkey4=P2^3; //定義"查看"按鈕 sbitwei1=P2^4; //定義位選 sbitwei2=P2^5; sbitwei3=P2^6; sbitwei4=P2^7; bitflag_start,flag_mode,flag_5sec; uchartemp,temp1,aa,aa1,shi,ge,shifen,baifen,num,i,j; uchartime_data1[11],time_data2[11]; ucharcode table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //不帶小數點共陰極數碼管編碼 ucharcode tabledp[]={ 0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfd,0x87, 0xff,0xef,0xf7,0xfc, 0xb9,0xde,0xf9,0xf1}; //帶小數點共陰極數碼管編碼 voiddisplay(uchar shi,uchar ge,uchar shifen,uchar baifen); //聲明顯示子函數 voiddelay(uint z); //聲明延時子函數 voidinit(); //聲明初始化函數 voidkey(); //聲明鍵掃描函數 voiddisplay_process(); //聲明顯示處理函數 voidmain() { init(); //調用初始化子程序 while(1) { key(); display_process(); display(shi,ge,shifen,baifen); //調用顯示子函數 } } voiddelay(uint z) //延時子函數 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } voiddisplay(uchar shi,uchar ge,uchar shifen,uchar baifen) //顯示子程序 { P0=table[shi]; //使用動態掃描的方法實現數碼管顯示 wei1=0; delay(1); wei1=1; P0=tabledp[ge]; wei2=0; delay(1); wei2=1; P0=table[shifen];//使用動態掃描的方法實現數碼管顯示 wei3=0; delay(1); wei3=1; P0=table[baifen]; wei4=0; delay(1); wei4=1; } voidinit() //初始化子程序 { temp=0; TMOD=0x01; //使用定時器T0的方式1 TH0=(65536-10000)/256; TL0=(65536-10000)%256; //定時50ms中斷一次 EA=1; //中斷總允許 ET0=1; //允許定時器T0中斷 } voidkey() { if(key1==0) //檢測"啟動"按鈕是否按下 { delay(5); //延時去抖動 if(key1==0) //再次檢測"啟動"按鈕是否按下 { while(!key1); //松手檢測 flag_start=~flag_start; if(flag_mode==0) { if(flag_start==1) TR0=1; //啟動定時器開始工作 else TR0=0; } else { if(flag_start==1) TR0=1; else TR0=0; } } } if(key2==0) //檢測"停止"按鈕是否按下 { delay(5); if(key2==0) { while(!key2); if(flag_mode==0||i!=0) { shi=0; //關閉定時器 ge=0; shifen=0; baifen=0; aa=0; temp=0; TR0=0; i=0; num=0; for(j=0;j<=10;j++) { time_data1[j]=0; time_data2[j]=0; } } else { num++; if(num==11) num=1; aa1=aa; temp1=temp; time_data1[num]=aa1; time_data2[num]=temp1; flag_5sec=0; } } } if(key3==0) { delay(5); if(key3==0) { while(!key3); flag_mode=~flag_mode; } } if(key4==0) { delay(5); if(key4==0) { while(!key4); i++; TR0=0; if(i==11) i=1; } } } voiddisplay_process() { shifen=aa%100/10; baifen=aa%10; shi=temp%100/10; ge=temp%10; if(flag_mode==1&&num!=0&&flag_5sec==0) { shi=time_data2[num]/10; ge=time_data2[num]%10; shifen=time_data1[num]/10; baifen=time_data1[num]%10; if(temp-time_data2[num]==2) flag_5sec=~flag_5sec; } if(i!=0) { shi=time_data2/10; ge=time_data2%10; shifen=time_data1/10; baifen=time_data1%10; } } voidtimer0() interrupt 1 { TH0=(65536-10000)/256; //重新賦初值 TL0=(65536-10000)%256; aa++; //中斷一次變量aa的值加1 if(aa==100) //中斷100次后,定時時間為100*10ms=1000ms=1s,將變量temp的值加1 { aa=0; temp++; if(temp==100) //秒表到達100s后回零 temp=0; } }
|