求助,本萌新想設計一個在普通開始,暫停,清零三個功能鍵上擴展存儲和讀取功能的電子秒表,無奈遇到了一點問題,讀取第一個數據之后無法讀下一個數據,并且清零,開始按鍵都開始失效,只能重新啟動。
想了半天都沒有想出問題出在哪,希望大佬們能幫忙給點意見,謝謝!
下面是我的C語言程序:
- #include <reg52.h> //包含頭文件
- char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //數字對應顯示碼表
- char code tab1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//小數點
- char code index[]={0xef,0xdf,0xbf,0x7f}; //每位數字對應數碼管顯示位置
- unsigned char num[4]; //定義數組用于顯示
- int sec_fei=0; //飛秒變量
- int debate[5];
- int datainfor;
- int readinfor;
- sbit key1=P3^0; //開始
- sbit key2=P3^1; //停止
- sbit key3=P3^2; //清零
- sbit store=P3^3;
- sbit read=P3^4;
- sbit restart=P3^5;
- void delay(unsigned int z) //延時函數,大約延時1ms,不精確
- {
- unsigned int i,j;
- for(i=0;i<z;i++)
- for(j=0;j<121;j++);
- }
- void debateread()
- { switch(readinfor)
- {
- case 1:sec_fei=debate[0];break;
- case 2:sec_fei=debate[1];break;
- case 3:sec_fei=debate[2];break;
- case 4:sec_fei=debate[3];break;
- case 5:sec_fei=debate[4];break;
- }
- }
- void debatestore()
- { switch(datainfor)
- {
- case 1:debate[0]=sec_fei;break;
- case 2:debate[1]=sec_fei;break;
- case 3:debate[2]=sec_fei;break;
- case 4:debate[3]=sec_fei;break;
- case 5:debate[4]=sec_fei;break;
- }
- }
- void init() //定時器初始化函數
- { readinfor=0;
- sec_fei=0;
- datainfor=0;
- TMOD=0x01; //定時器0
- TH0=0xd8; //初值高8位
- TL0=0xf0; //定時10ms
- ET0=1; //打開中斷允許開關
- TR0=0; //關閉定時器
- EA=1; //打開中斷總開關
- }
- void display() //顯示函數
- {
- unsigned char i; //定義循環變量,循環4次,掃描4位數碼管
- num[0]=sec_fei%10; //飛秒取余10,就是除以10之后的余數
- num[1]=sec_fei%100/10; //飛秒取余100再除以10
- num[2]=sec_fei%1000/100;
- num[3]=sec_fei/1000;
- for(i=0;i<4;i++) //循環4次掃描數碼管
- {
- P2=index[i]; //位選
- if(i==2) //如果是第二位
- P0=tab1[num[i]]; //顯示數字加小數點
- else //不是第二位
- P0=tab[num[i]]; //正常顯示數字
- delay(1); //修改此參數可修改刷新頻率
- P0=0x00; //關閉顯示
- }
- }
- void main() //主函數
- {
- init(); //調用定時器初始化
- while(1) //進入循環
- {
- display(); //刷屏顯示數碼管
- if(restart==0)
- {
- init();
- }
- if(key1==0) //開始按鈕
- {
- TR0=1;
- } //打開定時器開始定時
- if(key2==0) //停止按鈕
- {
- TR0=0;
- } //關閉定時器
- if(key3==0) //復位按鈕,需要停止定時時有效
- {
- sec_fei=0;
- } //秒清零
- if(store==0)
- {
- delay(1);
- while(store==0)
- {
- datainfor ++;
- debatestore();
- if(datainfor==5)
- {
- datainfor=0;
- }
- while(store==0)
- {
- display();
- }
- }
- }
- if(TR0==0&&read==0)
- {
- delay(1);
- while(read==0)
- {
- readinfor++;
- debateread();
- if(readinfor==5)
- {
- readinfor=0;
- }
- while(read==0)
- {
- display() ;
- }
-
- }
- }
- }
- }
- void T0_time() interrupt 1
- {
- TH0=0xd8; //定時器定時時間為10ms
- TL0=0xf0;
- sec_fei++; //飛秒加1
- if(sec_fei>=10000) //加10000次
- sec_fei=0; //清零
- }
復制代碼
|