樓主想要完成上述預想的功能沒必要寫這么復雜,只要把邏輯關系捋清,很容易實現(xiàn)。不論仿真或實物也完全不需要按鍵消抖。給你改好了,你試試。
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar Duan[] = {//共陽數(shù)碼管段碼"0~f-. "
- 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f,0xFF};
- uchar Wei[4]={0x01,0x02,0x04,0x08}; //位的控制端 (仿真)
- uchar Time_Buffer[4]; //時間緩存
- uint Time=0;
- uint Time_Count=0;
- uchar Cnt100us=0;
- bit flag=0;
- /*
- void delayms(uint x) //延時函數(shù)
- {
- uint i,j;
- for(i = x; i > 0; i --)
- for(j = 125; j > 0; j --);
- }*/
- void Show_Time() //數(shù)碼管動態(tài)掃描顯示
- {
- uchar i;
- uint j;
- static uchar k=0;
- /*****************數(shù)據(jù)分解*****************************/
- if(flag==0)//判斷啟動標志復位 處理數(shù)據(jù)
- {
- j=Time;
- for(i=4;i>0;i--)
- {
- Time_Buffer[i-1]=Duan[j%10];//由低位到高位保存
- j/=10;
- }
- }
- else //等待計時結束
- {
- for(i=4;i>0;i--)
- {
- Time_Buffer[i-1]=0xbf;//全部'-'
- }
- }
- P0 = 0xFF;
- P1 = Wei[k];
- if(k==0)P0=Time_Buffer[k]&0x7f;//加小數(shù)點
- else P0=Time_Buffer[k];
- k++;k%=4;
- }
- /******************
- 主函數(shù)
- ******************/
- void main()
- {
- IT0 = 1;//下降沿觸發(fā)
- IT1 = 1;
- EX0 = 1;
- EX1 = 1;
- EA = 1;
-
- TMOD=0x02; //設置為自動重載方式
- TH0=0x9c; //設置為100us的計數(shù)
- TL0=0x9c;
- ET0=1;
- TR0=0;
- while(1)
- {
- Show_Time();
- }
- }
- void Timer_T0() interrupt 1
- {
- if(++Cnt100us>=10) //1ms
- {
- Cnt100us=0;
- if(++Time_Count>9999) //計時范圍0-9999
- Time_Count=0; //10s
- }
- }
- void Stop_Int0() interrupt 0
- {
- if(TR0==0) //與INT1互鎖
- {
- flag=1; //啟動標志
- Cnt100us=0; //初始值清0
- Time_Count=0; //初始值清0
- TR0=1; //開始計時
- }
- }
- void Start_ExInt1()interrupt 2
- {
- if(flag) //判斷啟動狀態(tài) 與INT0互鎖
- {
- TR0=0; //停止計時
- flag=0; //啟動標志復位
- Time=Time_Count;//讀取計數(shù)值
- }
- }
復制代碼
|