/*
晶振頻率11.0592MHz
程序修改說明:
第一版程序在開發板上運行時,雖能基本完成功能,但閃爍嚴重,復位后數組還有異常數據等,應是算法問題,此版尋求解決之道。
問題之一:閃爍嚴重
將FormatTimeWithMS(TotalMS)語句從定時器中斷程序中移出,放到mian中,問題得到解決,與預計的FormatTimeWithMS函數占了太大的時間資源不一致。
但發現出現另一問題:最后(右)一位顯示明顯偏亮,運行別的程序時,各位顯示一致,但亮度與前面所述最后一位一致,說明其實是前7位亮度偏暗。
經調試,發現原因為消影語句放置位置不妥,修改位置后,閃爍問題完全解決。
問題之二:保存數據的數據重置后數據異常
經調試,發現原因為數組設置與讀取不正確,修改后正常。
*/
- #include <reg52.h>
- #include <string.h>
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit seg_sel = P2^6;
- sbit bit_sel = P2^7;
- sbit start_key = P3^0;
- sbit record_key = P3^1;
- sbit reload_key = P3^2;
- sbit reset_key = P3^3;
- //共陰極數碼管0-9和"-"編碼0x40
- unsigned char code seg_table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F,0x40};
- //數碼管位碼(數組第1位對應數碼管最左位)
- unsigned char code bit_table[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
- #define DATA P0
- u8 timer;
- //初始化顯示數據
- u8 TimeFormat[] = {0,0,1,0,0,1,0,0};
- //數據記錄數組,5組,每組8個數據
- u8 ResultArray[5][8];
- u8 ResultMax = 5;
-
- u8 i,j,k,z;
- unsigned long TotalMS;
- u8 minS,minG,secS,secG,msS,msG;
- bit IsReload;
- void delay(u16 num)
- {
- u16 m,n;
- for(m=num; m>0; m--)
- for(n=113; n>0; n--);
- }
- //此函數將毫秒數轉換成需要顯示的時間格式(設置數組TimeFormat[])
- void FormatTimeWithMS(long tms)
- {
- minS = (tms/60000)/10;
- minG = (tms/60000)%10;
- secS = (tms-(minS*10+minG)*60000)/1000/10;
- secG = (tms-(minS*10+minG)*60000)/1000%10;
- msS = (tms%1000)/100;
- msG = (tms%1000)%100/10;
- TimeFormat[0] = minS;
- TimeFormat[1] = minG;
- TimeFormat[3] = secS;
- TimeFormat[4] = secG;
- TimeFormat[6] = msS;
- TimeFormat[7] = msG;
- }
- void TimeDisplay(void)
- {
- i = 0;
- for (j=0; j<8; j++)
- {
- //移位
- bit_sel = 1;
- DATA = bit_table[j];
- bit_sel = 0;
- //顯數
- seg_sel = 1;
- if ( i==2 | i==5 )
- {
- DATA = seg_table[10];
- }else{
- DATA = seg_table[TimeFormat[i]];
- if (!IsReload)
- {
- DATA = seg_table[TimeFormat[i]];
- }else{
- DATA = seg_table[ResultArray[z][i]];
- }
- }
- i++;
- delay(1);
-
- //消影
- DATA = 0x00;
- seg_sel = 0;
- }
- }
- void StopTimer(void)
- {
- if(TR0){TR0=0;}
- IsReload = 1;
- TotalMS = 0;
- FormatTimeWithMS(TotalMS);
- }
- void main(void)
- {
- DATA = 0x00;
- P3 = 0xff;
- seg_sel = 0;
- bit_sel = 0;
- TMOD = 0x01;
- //單次溢出時間10ms之初值
- TH0 = 0xdc;
- TL0 = 0x00;
- EA = 1;
- ET0 = 1;
- TotalMS = 0;
- while(1)
- {
- //計時啟停
- if (start_key == 0)
- {
- delay(10);
- if (start_key == 0)
- {
- TR0 = ~TR0;
- }
- while(!start_key);
- }
-
- //記錄時間
- if (record_key == 0)
- {
- delay(10);
- if (record_key == 0)
- {
- //小于最大記錄時,記錄數據;達到最大值時,停止計時器
- if (k < ResultMax)
- {
- ResultArray[k][0] = minS;
- ResultArray[k][1] = minG;
- ResultArray[k][2] = 1;
- ResultArray[k][3] = secS;
- ResultArray[k][4] = secG;
- ResultArray[k][5] = 1;
- ResultArray[k][6] = msS;
- ResultArray[k][7] = msG;
- k++;
- if (k==ResultMax) if(TR0){TR0=0;}
- }
- }
- while(!record_key);
- }
-
- //回顯被記錄的時間
- if (reload_key == 0)
- {
- delay(10);
- if (reload_key == 0)
- {
- //如果不是回顯數據,那么z=0(此處加判斷的意義是首次點擊回顯鍵時,數據從第一組開始顯示)
- if(!IsReload)
- {
- z = 0;
- }else{
- z++;
- if( z > (ResultMax-1)){z=0;}
- }
- StopTimer();
- }
- while(!reload_key);
- }
-
- //重置(計時器停止,總顯示時間清0,時間記錄數組清0,回顯數據狀態置0)
- if (reset_key == 0)
- {
- delay(10);
- if (reset_key == 0)
- {
- StopTimer();
- memset(ResultArray,0,sizeof(ResultArray));
- IsReload = 0;
- }
- while(!reset_key);
- }
- //顯示時間
- FormatTimeWithMS(TotalMS);
- TimeDisplay();
- }
- }
- void timer0_service(void) interrupt 1
- {
- TH0 = 0xdc;
- TL0 = 0x00;
- //因為是每10ms溢出一次,故總時間累加10ms。
- TotalMS = TotalMS+10;
- }
復制代碼
|