⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sp0604_实验18_计算器.c

📁 基于AT89S52编写的一个计算器C程序
💻 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 + -