📄 sp0604_实验18_计算器.c
字号:
#include <REGX51.H>
#define PORTA P0
#define PORTC P2
#define PORTB P1
#define PINB P1
#define LEDDATAPORT PORTA
#define LEDBITPORT PORTC
const unsigned char LEDDATA[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,
0x00,0x40,
};
//数码管扫描代码表
unsigned char code LEDBITDATA[]=
{
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
};
void Delay(unsigned int t)
{
while(t)t--;
}
void main(void)
{
unsigned char LEDBuffer[8]={0,16,16,16,16,16,16,16};
unsigned char ScanLEDCount;
unsigned char i;
unsigned char Key;
unsigned char Temp;
unsigned char NoFlashFlag;
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;
while(1)
{
if(DotPosition!=0)
{
if(DotPosition==ScanLEDCount)LEDDATAPORT=LEDDATA[LEDBuffer[ScanLEDCount]]|0x80;
else LEDDATAPORT=LEDDATA[LEDBuffer[ScanLEDCount]];
}
else LEDDATAPORT=LEDDATA[LEDBuffer[ScanLEDCount]];
LEDBITPORT=LEDBITDATA[ScanLEDCount];
ScanLEDCount++;
if(ScanLEDCount==sizeof(LEDBuffer))ScanLEDCount=0;
Delay(664);
PORTB = 0xF0;
Delay(10);
if((PINB & 0xF0)!=0xF0)
{
if(NoFlashFlag==0)
{
Delay(664);
if((PINB & 0xF0)!=0xF0)
{
NoFlashFlag=1;
Temp=PINB & 0xF0;
PORTB = 0x0F;
Delay(10);
Temp|=(PINB & 0x0F);
Key=0;
switch(Temp)
{
case 0x7e://"=" Calc Button
Key=15;
break;
case 0xbe:
Key=13;//"/" Div Button
break;
case 0xde://"*" Mul Button
Key=12;
break;
case 0xee://"0"
Key=0;
break;
case 0x7d://"-"
Key=11;
break;
case 0xbd://"3"
Key=3;
break;
case 0xdd://"2"
Key=2;
break;
case 0xed://"1"
Key=1;
break;
case 0x7b://"+"
Key=10;
break;
case 0xbb://"6"
Key=6;
break;
case 0xdb://"5" No.5 Button
Key=5;
break;
case 0xeb://"4" No.4 Button
Key=4;
break;
case 0x77://"C" Clear Button
Key=14;
break;
case 0xb7://"9"
Key=9;
break;
case 0xd7://"8"
Key=8;
break;
case 0xe7://"7"
Key=7;
break;
}
switch(CurrentFunction)
{
case 0://输入数据1
if((Key>=0)&&(Key<=9))
{
if(GetKeyMaxFlag==0)
{
for(Temp=GetKeyCount;Temp>0;Temp--)
LEDBuffer[Temp]=LEDBuffer[Temp-1];
LEDBuffer[0]=Key;
GetKeyCount++;
if(GetKeyCount==5)GetKeyMaxFlag=1;
}
}
else if((Key>=10)&&(Key<=13))
{
NumberA=0;
Temp=0;
while(LEDBuffer[Temp]!=16)
{
switch(Temp)
{
case 0:
NumberA+=LEDBuffer[Temp];
break;
case 1:
NumberA+=(unsigned long)(LEDBuffer[Temp])*10;
break;
case 2:
NumberA+=(unsigned long)(LEDBuffer[Temp])*100;
break;
case 3:
NumberA+=(unsigned long)(LEDBuffer[Temp])*1000;
break;
case 4:
NumberA+=(unsigned long)(LEDBuffer[Temp])*10000;
}
Temp++;
}
CurrentFunction=1;
Signal=Key;
GetKeyMaxFlag=0;
GetKeyCount=0;
for(Temp=0;Temp<sizeof(LEDBuffer);Temp++)
LEDBuffer[Temp]=16;
LEDBuffer[0]=0;
}
else if(Key==14)
{
CurrentFunction=0;
GetKeyMaxFlag=0;
GetKeyCount=0;
NagFlag=0;
DotPosition=0;
for(Temp=0;Temp<sizeof(LEDBuffer);Temp++)
LEDBuffer[Temp]=16;
LEDBuffer[0]=0;
}
break;
case 1://输入数据2
if((Key>=0)&&(Key<=9))
{
if(GetKeyMaxFlag==0)
{
for(Temp=GetKeyCount;Temp>0;Temp--)
LEDBuffer[Temp]=LEDBuffer[Temp-1];
LEDBuffer[0]=Key;
GetKeyCount++;
if(GetKeyCount==5)GetKeyMaxFlag=1;
}
}
else if(Key==15)
{
NumberB=0;
Temp=0;
while(LEDBuffer[Temp]!=16)
{
switch(Temp)
{
case 0:
NumberB+=LEDBuffer[Temp];
break;
case 1:
NumberB+=(unsigned long)(LEDBuffer[Temp])*10;
break;
case 2:
NumberB+=(unsigned long)(LEDBuffer[Temp])*100;
break;
case 3:
NumberB+=(unsigned long)(LEDBuffer[Temp])*1000;
break;
case 4:
NumberB+=(unsigned long)(LEDBuffer[Temp])*10000;
break;
}
Temp++;
}
Result=0;
switch(Signal)
{
case 10://加法运算
Result=NumberA;
Result+=NumberB;
DotPosition=0;
break;
case 11://减法运算
Result=NumberA;
Result-=NumberB;
DotPosition=0;
break;
case 12://乘法运算
Result=NumberA;
Result*=NumberB;
DotPosition=0;
break;
case 13://除法运算
Result=NumberA;
Result*=10000;
Result/=NumberB;
break;
}
for(Temp=0;Temp<sizeof(LEDBuffer);Temp++)
LEDBuffer[Temp]=16;
LEDBuffer[0]=0;
NagFlag=0;
if(Result<0)
{
Result=~Result;
Result++;
NagFlag=1;
}
if(Signal==13)//除法运算中除得结果小于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(Temp=DotPosition;Temp<5;Temp++)LEDBuffer[Temp]=0;
DotPosition=4;
}
else DotPosition=0;
Temp=0;//将运算结果送出显示缓冲区
while(Result)
{
LEDBuffer[Temp]=Result%10;
Result/=10;
Temp++;
}
if(NagFlag==1)LEDBuffer[Temp]=17;//运算结果为负的处理
if(Signal==13)//除法运算中最后位"0"的处理
{
Temp=0;
while(LEDBuffer[Temp]==0)
{
for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i]=LEDBuffer[i+1];
LEDBuffer[sizeof(LEDBuffer)-1]=16;
DotPosition--;
}
}
CurrentFunction=2;
}
break;
case 2:
if(Key==14)
{
CurrentFunction=0;
GetKeyMaxFlag=0;
GetKeyCount=0;
NagFlag=0;
DotPosition=0;
for(Temp=0;Temp<sizeof(LEDBuffer);Temp++)
LEDBuffer[Temp]=16;
LEDBuffer[0]=0;
}
break;
}
}
}
}
else NoFlashFlag=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -