標題:
求助一個51單片機控制的數(shù)碼管計算器帶小數(shù)點功能的
[打印本頁]
作者:
q1363096
時間:
2017-10-28 19:16
標題:
求助一個51單片機控制的數(shù)碼管計算器帶小數(shù)點功能的
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; //--- 反轉(zhuǎn)一次 ---
P1 = 0x0F;
KeyTemp |= (P1 & 0x0F); //--- 讀取按鍵的內(nèi)容 ---
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)//除法運算中除得結(jié)果小于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;//將運算結(jié)果送出顯示緩沖區(qū)
while(Result)
{
LEDBuffer[i] = Result % 10;
Result /= 10;
i ++;
}
if(1 == NagFlag)LEDBuffer[i] = 17;//運算結(jié)果為負的處理
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溢出中斷服務(wù)程序 ---
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 ---
}
復(fù)制代碼
作者:
yzwzfyz
時間:
2017-10-29 12:26
先畫出邏輯框圖,然后再寫程序就好了。
把你的框圖給出來,我給你看看。
作者:
qwthh
時間:
2018-7-3 20:49
CurrentFunction是啥 博主只截了一小部分吧
作者:
qwthh
時間:
2018-7-3 20:50
currentfuction啥玩意 只給了一小部分是吧
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1