求助QAQ,一直是這樣查了好久看不出來問題。數(shù)組沒辦法初始化。。譜中的板子
qq_pic_merged_1546340613743.jpg (530.36 KB, 下載次數(shù): 12)
下載附件
2019-1-1 19:14 上傳
s.png (277.87 KB, 下載次數(shù): 13)
下載附件
2019-1-1 19:14 上傳
TIM截圖20190101185954.png (126.99 KB, 下載次數(shù): 10)
下載附件
2019-1-1 19:14 上傳
TIM截圖20190101190132.png (97.12 KB, 下載次數(shù): 11)
下載附件
2019-1-1 19:14 上傳
TIM截圖20190101190141.png (23.33 KB, 下載次數(shù): 13)
下載附件
2019-1-1 19:14 上傳
- #include <reg52.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
- sbit LSA = P2^2; //38譯碼器引腳編號,選擇數(shù)碼管
- sbit LSB = P2^3;
- sbit LSC = P2^4;
- sbit number = P0; //發(fā)送轉(zhuǎn)換表(段碼)
- sbit key1 = P3^1; //開始/暫停
- sbit key2 = P3^0; //復(fù)位
- sbit key3 = P3^2; //
- sbit key4 = P3^3; //
- u8 code smgduan[17] = {
- 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
- 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
- };//數(shù)碼管轉(zhuǎn)換表
- u8 LedBuff[8] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- } ;//數(shù)碼管緩沖區(qū)
- u8 KeySt[4] = {
- 1, 1, 1, 1
- };//按鍵電平狀態(tài)儲存區(qū)
- bit StopwatchRunning = 1; //秒表是否運行(確定是否暫停)
- bit StopwatchRefresh = 1; //秒表是否要刷新
- u8 DecimalPart = 0; //計數(shù)小數(shù)部分
- u16 IntegerPart = 0; //計數(shù)整數(shù)部分
- u8 T0RH = 0; //T0重裝高位
- u8 T0RL = 0; //T0重裝低位
- void ConfigTimer0(u16 ms); //配置定時器
- void StopwatchDisplay(); //顯示函數(shù)(數(shù)字分割顯示)
- void KeyDriver(); //檢測按鍵,執(zhí)行指令(主函數(shù)中調(diào)用)
- void main()
- {
- EA = 1; //打開總中斷
- ConfigTimer0(2); //定時器2ms
- while(1)
- {
- if(StopwatchRefresh) //是否更新數(shù)碼管顯示
- {
- StopwatchRefresh = 0;
- StopwatchDisplay();
- }
- KeyDriver(); //調(diào)用按鍵驅(qū)動
- }
- }
- /*函數(shù)部分*/
- void ConfigTimer0(u16 ms)//配置定時器
- {
- u32 tmp;
-
- tmp = 12000000 / 12;
- tmp = (tmp * ms) / 1000;
- tmp = 65536 - tmp;
- tmp += 18;
- T0RH = (u8)(tmp >> 8);
- T0RL = (u8)tmp;
- TMOD &= 0XF0; //僅改變后四位(置零)
- TMOD |= 0X01;
- TH0 = T0RH;
- TL0 = T0RL;
- ET0 = 1;
- TR0 = 1;
- }
- void StopwatchDisplay()//顯示函數(shù)(數(shù)字分割顯示)
- {
- signed char i;
- u8 buf[4]; //
- LedBuff[0] = smgduan[DecimalPart % 10]; //小數(shù)轉(zhuǎn)換
- LedBuff[1] = smgduan[DecimalPart / 10];
- buf[0] = IntegerPart % 10;
- buf[1] = (IntegerPart / 10) % 10;
- buf[2] = (IntegerPart / 100) % 10;
- buf[3] = (IntegerPart / 1000) % 10;
- for(i = 3; i >= 1; i --) //整數(shù)高位0轉(zhuǎn)換為空
- {
- if(buf[i] == 0)
- {
- LedBuff[i + 2] = 0XFF;
- }
- else break;
- }
- for( ; i >= 0; i --) //整數(shù)轉(zhuǎn)換
- {
- LedBuff[i + 2] = smgduan[buf[i]];
- }
- LedBuff[2] &= 0X80; //小數(shù)點
- }
- void StopwatchAction()//秒表的啟動與暫停
- {
- if (StopwatchRunning) //已啟動則停止
- StopwatchRunning = 0;
- else //未啟動則啟動
- StopwatchRunning = 1;
- }
- void StopwatchReset()//秒表復(fù)位
- {
- StopwatchRunning = 0;
- DecimalPart = 0;
- IntegerPart = 0;
- StopwatchRefresh = 1;
- }
- void KeyDriver()//檢測按鍵,執(zhí)行指令(主函數(shù)中調(diào)用)
- {
- u8 i;
- static u8 backup[4] = {1, 1, 1 , 1};//鍵值對比樣本
- for(i = 0; i < 4; i ++)
- {
- if(backup[i] != KeySt[i])
- {
- if(backup[i] != 0)
- {
- if(i == 1)
- {
- StopwatchReset();
- }
- else if(i == 2)
- {
- StopwatchAction();
- }
- }
- backup[i] = KeySt[i]; //刷新備份,作為下次判定樣本
- }
- }
- }
- void KeyScan()//按鍵掃描,定時中斷調(diào)用
- {
- u8 i;
- static u8 keybuf[4] = {
- 0xFF, 0xFF, 0xFF, 0xFF
- };
- keybuf[0] = (keybuf[0] << 1) | key1; //鍵值輸入
- keybuf[1] = (keybuf[1] << 1) | key2;
- keybuf[2] = (keybuf[2] << 1) | key3;
- keybuf[3] = (keybuf[3] << 1) | key4;
- for(i = 0; i < 4; i ++)
- {
- if(keybuf[i] == 0X00)
- {
- KeySt[i] = 0;
- }
- else if(keybuf == 0XFF)
- {
- KeySt[i] = 1;
- }
- }
- }
- void LedScan()//數(shù)碼管掃描,定時中斷調(diào)用
- {
- static u8 i = 0;
- number = 0X00;
- //LS = (LS & 0XE3) | (i << 2);
- for(i = 0;i < 5;i++)
- {
- switch(i) //位選,選擇點亮的數(shù)碼管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//顯示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//顯示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//顯示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//顯示第7位
- }
- }
- P0 = LedBuff[i];
- //if(i < 5) i ++;
- //else i = 0;
- }
- void StopwatchCount()//秒數(shù)統(tǒng)計
- {
- if(StopwatchRunning)
- {
- DecimalPart ++;
- if(DecimalPart >= 100)
- {
- DecimalPart = 0;
- IntegerPart ++;
- if(IntegerPart > 10000)
- {
- IntegerPart = 0;
- }
- }
- StopwatchRefresh = 1; //提醒刷新
- }
- }
- void InterruptTimer0() interrupt 1 //中斷函數(shù)
- {
- static u8 tmr10ms = 0;
-
- TH0 = T0RH;
- TL0 = T0RL;
- LedScan();
- KeyScan();
- tmr10ms ++;
- if(tmr10ms >= 5) //10ms記一次數(shù)
- {
- tmr10ms = 0;
- StopwatchCount();
- }
- }
復(fù)制代碼
|