51V0T5-FX`$PB(SJJ_IOKCX.png (11.9 KB, 下載次數(shù): 57)
下載附件
2017-10-28 19:15 上傳
最好有這里面的功能謝謝了或者幫忙加下小數(shù)點功能
- #include <REGX51.H>#define FOSC 12000000 //--- 宏定義時鐘頻率 ---
- //=================================================================================================
- //--- 數(shù)碼管顯示定義與函數(shù)聲明區(qū) ---
- sfr P0M1 = 0x93;
- sfr P0M0 = 0x94;
- sfr P2M1 = 0x95;
- sfr P2M0 = 0x96;
- #define TIMER1MS 1000 //--- 宏定義定時1ms,1000us ---
- unsigned char code SEGLED[] = //--- 顯示0~9,A~F筆段代碼表 ---
- {
- 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40,
- };
- unsigned char code DIGLED[] = //--- 數(shù)碼管顯示的位選通段代碼表 ---
- {
- 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
- };
- unsigned char LEDBuffer[8] = {0,16,16,16,16,16,16,16}; //--- 定義的顯示緩沖區(qū) ---
- unsigned char LEDPointer; //--- 定義的掃描計數(shù)變量 ---
- unsigned char GetKeyCount=0;
- unsigned char GetKeyMaxFlag=0;
- unsigned long NumberA;
- unsigned long NumberB;
- long Result;
- unsigned char NagFlag=0;
- unsigned char DotPosition=0;
- unsigned char CurrentFunction=0;
- unsigned char Signal;
- unsigned char code KEYCODE[] = //--- 矩陣按鍵代碼表 --
- {
- 0x7e,0xbe,0xde,0xee,//0 1 2 3
- 0x7d,0xbd,0xdd,0xed,//4 5 6 7
- 0x7b,0xbb,0xdb,0xeb,//8 9 A b
- 0x77,0xb7,0xd7,0xe7,//C d E F
- };
- void DelaymS(unsigned char t) //--- 延時函數(shù) ---
- {
- unsigned char i,j;
- while(t --)
- {
- for(j=2;j>0;j--)
- for(i=248;i>0;i--); //--- 12MHZ晶振延時約1mS ---
- }
- }
- //=================================================================================================
- //--- main()主程序 ---
- void main(void)
- {
- char i,j;
- unsigned char Key;
- unsigned char KeyTemp;
- P0M1 = 0x00; //--- 配置P0端口的P0.0~P0.7為推挽輸出模式 ---
- P0M0 = 0xFF;
- P2M1 = 0x00; //--- 配置P2端口的P2.0~P2.7為推挽輸出模式 ---
- P2M0 = 0xFF;
- TMOD = 0x01; //--- 配置T0為16位的定時方式 ---
- TH0 = (65536 - FOSC / 12 / TIMER1MS) / 256; //--- 初始化T0定時1mS ---
- TL0 = (65536 - FOSC / 12 / TIMER1MS) % 256;
- TR0 = 1; //--- 啟動T0工作 ---
- ET0 = 1; //--- 使能T0的溢出中斷 ---
- EA = 1; //--- CPU開中斷 ---
- while(1)
- {
- P1 = 0xF0;
- if((P1 & 0xF0) != 0xF0) //--- 判斷是否有鍵按下 ---
- {
- DelaymS(5); //--- 去抖動 ---
- if((P1 & 0xF0) != 0xF0) //--- 再判斷是否真得按下 ---
- {
- KeyTemp = P1 & 0xF0; //--- 反轉一次 ---
- P1 = 0x0F;
- KeyTemp |= (P1 & 0x0F); //--- 讀取按鍵的內容 ---
- Key = 0;
- while(KeyTemp != KEYCODE[Key])Key ++; //--- 在代碼中尋找Key的數(shù)值 ---
- switch(CurrentFunction)
- {
- case 0: //--- 輸入第1個數(shù)據(jù) ---
- if((Key >= 0) && (Key <= 9))
- {
- if(0 == GetKeyMaxFlag)
- {
- for(i=GetKeyCount;i>0;i--)LEDBuffer[i] = LEDBuffer[i - 1];
- LEDBuffer[0] = Key;
- GetKeyCount++;
- if(8 == GetKeyCount)GetKeyMaxFlag = 1;
- }
- }
- else if((Key >= 10) && (Key <= 13))
- {
- NumberA = 0;
- i = 7;
- while(i >= 0)
- {
- if(16 != LEDBuffer[i])
- NumberA = NumberA * 10 + LEDBuffer[i];
- i --;
- }
- CurrentFunction = 1;
- Signal = Key;
- GetKeyMaxFlag = 0;
- GetKeyCount = 0;
- for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
- LEDBuffer[0] = 0;
- }
- else if(14 == Key)
- {
- CurrentFunction = 0;
- GetKeyMaxFlag = 0;
- GetKeyCount = 0;
- NagFlag = 0;
- DotPosition = 0;
- for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
- LEDBuffer[0] = 0;
- }
- else
- {
- }
- break;
- case 1:
- if((Key >= 0) && (Key <= 9))
- {
- if(0 == GetKeyMaxFlag)
- {
- for(i=GetKeyCount;i>0;i--)LEDBuffer[i] = LEDBuffer[i - 1];
- LEDBuffer[0] = Key;
- GetKeyCount++;
- if(8 == GetKeyCount)GetKeyMaxFlag = 1;
- }
- }
- else if(15 == Key)
- {
- NumberB = 0;
- i = 7;
- while(i >= 0)
- {
- if(16 != LEDBuffer[i])
- NumberB = NumberB * 10 + LEDBuffer[i];
- i --;
- }
- switch(Signal)
- {
- case 10:
- Result = NumberA;
- Result += NumberB;
- break;
- case 11:
- Result = NumberA;
- Result -= NumberB;
- break;
- case 12:
- Result = NumberA;
- Result *= NumberB;
- break;
- case 13:
- Result = NumberA;
- Result *= 10000;
- Result /= NumberB;
- break;
- }
- for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
- LEDBuffer[0] = 0;
- DotPosition = 0;
- NagFlag = 0;
- if(Result < 0)
- {
- Result = ~Result;
- Result ++;
- NagFlag = 1;
- }
- if(13 == Signal)//除法運算中除得結果小于0的處理
- {
- if(Result >= 1000)DotPosition = 4;
- else if(Result >= 100)DotPosition = 3;
- else if(Result >= 10)DotPosition = 2;
- else if(Result >= 1)DotPosition = 1;
- for(i=DotPosition;i<5;i++)LEDBuffer[i] = 0;
- DotPosition = 4;
- }
- else DotPosition = 0;
- i = 0;//將運算結果送出顯示緩沖區(qū)
- while(Result)
- {
- LEDBuffer[i] = Result % 10;
- Result /= 10;
- i ++;
- }
- if(1 == NagFlag)LEDBuffer[i] = 17;//運算結果為負的處理
- if(13 == Signal)//除法運算中最后位"0"的處理
- {
- j = 0;
- while(0 == LEDBuffer[j])
- {
- for(i=0;i<sizeof(LEDBuffer);i++)
- LEDBuffer[i] = LEDBuffer[i+1];
- LEDBuffer[sizeof(LEDBuffer)-1]=16;
- DotPosition--;
- }
- }
- CurrentFunction = 2;
- }
- break;
- case 2:
- if(14 == Key)
- {
- CurrentFunction = 0;
- GetKeyMaxFlag = 0;
- GetKeyCount = 0;
- NagFlag = 0;
- DotPosition = 0;
- for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
- LEDBuffer[0] = 0;
- }
- break;
- }
- while((P1 & 0x0F)!=0x0F); //--- 等待按鍵釋放 ---
- }
- }
- }
- }
- //=================================================================================================
- //--- 定時器T0溢出中斷服務程序 ---
- void T0_ISR(void) interrupt 1
- {
- TH0 = (65536 - FOSC / 12 / TIMER1MS) / 256; //--- 重裝T0的定時初值 ---
- TL0 = (65536 - FOSC / 12 / TIMER1MS) % 256;
- P0 = SEGLED[LEDBuffer[LEDPointer]]; //--- 顯示數(shù)字 ---
- if((0 != DotPosition) && (DotPosition == LEDPointer))
- P0 |= 0x80; //--- 顯示小數(shù)點 ---
- P2 = DIGLED[LEDPointer]; //--- 數(shù)碼管的位選段選擇 ---
- LEDPointer++; //--- 動態(tài)掃描計數(shù)變量加1 ---
- if(sizeof(LEDBuffer) == LEDPointer)LEDPointer = 0; //--- 所有數(shù)碼管掃描完,計數(shù)歸0 ---
- }
復制代碼
|