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

📄 calculator.c

📁 用单片机系统实现8位的加减乘除运算
💻 C
字号:
#include <math.h>
#include <stdio.h>
#include <reg51.h>

#define		TRUE			1
#define		FALSE			0
#define     ENRD         0     //读有效
#define     DISRD        1
#define     ENWR         0
#define     DISWR        1 
#define		DELAY_VALUE		3

#define    	PinDrvKey1	P0_0
#define		PinDrvKey2	P0_1
#define		PinDrvKey3	P0_2
#define    	PinDrvKey4	P0_3		//键盘扫描的驱动线

#define    	PinScanKey1	P0_0
#define    	PinScanKey2	P0_1
#define    	PinScanKey3	P0_2
#define    	PinScanKey4	P0_3		//键盘扫描的信号获取线

#define		LedSelect0	0x01
#define		LedSelect1	0x02
#define		LedSelect2	0x04
#define		LedSelect3	0x08
#define		LedSelect4	0x10
#define		LedSelect5	0x20
#define		LedSelect6	0x40
#define		LedSelect7	0x80    //led选择位

#define     num0  0x3f         //字符0的编码
#define     num1  0x06
#define     num2  0x5b
#define     num3  0x4f
#define     num4  0x66
#define     num5  0x6d
#define     num6  0x7d
#define     num7  0x07
#define     num8  0x7f 
#define     num9  0x67         //字符九的编码

sbit		P0_0=P0^0;
sbit		P0_1=P0^1;
sbit		P0_2=P0^2;
sbit		P0_3=P0^3;
sbit		P0_4=P0^4;
sbit		P0_5=P0^5;
sbit		P0_6=P0^6;
sbit		P0_7=P0^7;

sbit		P1_0=P1^0;
sbit		P1_1=P1^1;
sbit		P1_2=P1^2;
sbit		P1_3=P1^3;
sbit		P1_4=P1^4;
sbit		P1_5=P1^5;
sbit		P1_6=P1^6;
sbit		P1_7=P1^7;

sbit		P2_0=P2^0;
sbit		P2_1=P2^1;
sbit		P2_2=P2^2;
sbit		P2_3=P2^3;
sbit		P2_4=P2^4;
sbit		P2_5=P2^5;
sbit		P2_6=P2^6;
sbit		P2_7=P2^7;

char numtochar(char n)
{ switch(n)
  {case 0:return num0;
         break;
  case 1:return num1;
         break;
  case 2:return num2;
         break;
  case 3:return num3;
         break;
  case 4:return num4;
         break;
  case 5:return num5;
         break;
  case 6:return num6;
         break;
  case 7:return num7;
         break;
  case 8:return num8;
         break;
  case 9:return num9;
         break;
  default:break;

  }
}



void initial(void);              //初始化子程序
void delay(short i);
void display(unsigned char i,unsigned char num);
unsigned char keyscan(void);

void main(void)
{  char Li,Ln;           //第Li个le显示数字ln;
   long dt1,dt2,temp;
	char op,keyword;
   dt1=0;               //dt1为第一操作数
	dt2=0;               //dt2为第二操作数

	initial();	
		//键盘驱动信号都设为低
  for(Li=7;Li>=0;Li--) 
   {Ln=keyscan();  
	display(Li,Ln);
	}

    keyword=0;
    do
  { 
	keyword=keyscan();
	if(keyword<=9)
	{
	  dt2=dt2*10+keyword;
	  temp=dt2;
	  for(Li=0;Li<=7;Li++)
	  {  
	     Ln=temp%10;
		  temp=temp/10;
		  display(Li,Ln);   //显示输入的数字
		  if(temp==0)break;
	  }
   }
else if(keyword<=13)
	 { op=keyword-10;
	   dt1=dt2;
	   dt2=0;
		switch(op)
		{case 0:display(7,0);
		        break;
		 case 1:display(7,1);
		        break;
	    case 2:display(7,2);
		        break;
		 case 3:display(7,3);
		        break;
		default:break;
		}
	}
   }while(keyword!=14);  
	switch(op)
		{case 0:dt1=dt1+dt2;
		         break;
		 case 1:dt1=dt1-dt2;
		         break;
	    case 2:dt1=dt1*dt2;
		         break;
		 case 3:dt1=dt1/dt2;
		         break;
		 default:break;
		}
		for(Li=0;Li<=7;Li++)
	  {  
	     Ln=dt1%10;
		  dt1=dt1/10;
		  display(Li,Ln);   //显示结果
		  if(dt1==0)break;
	  }
	
}


void initial(void)
{  WR=ENWR;
   P2=0x80;
	P0=0xff;
   P2=0x90;
	P0=0x00; //键盘驱动信号都设为低
   WR=DISWR; 		
}

unsigned char keyscan()
{
char kword=0;
P0=0x00;
P2=0x80;
while(1)
{
RD=DISRD;
WR=ENWR;
PinDrvKey1=TRUE;
WR=DISWR;
RD=ENRD;

if(PinScanKey1==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey1==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey1==TRUE)			
	kword=1;
	break;}					//确认确实有按键信号,返回键值
if(PinScanKey2==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey2==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey2==TRUE)			
	kword=2;break;}					//确认确实有按键信号,返回键值
if(PinScanKey3==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey3==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey3==TRUE)			
	kword=3;break;}					//确认确实有按键信号,返回键值
if(PinScanKey4==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey2==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey2==TRUE)
	kword=10;break;}					//确认确实有按键信号,返回键值
				//以上语句扫描第一列


RD=DISRD;
WR=ENWR;
PinDrvKey1=FALSE;
PinDrvKey2=TRUE;
WR=DISWR;
RD=ENRD;

if(PinScanKey1==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey1==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey1==TRUE)
	kword=4;break;}					//确认确实有按键信号,返回键值
if(PinScanKey2==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey2==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey2==TRUE)
	kword=5;break;}					//确认确实有按键信号,返回键值
if(PinScanKey3==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey3==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey3==TRUE)
	kword=6;break;}					//确认确实有按键信号,返回键值
if(PinScanKey4==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次 
if(PinScanKey4==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey4==TRUE)
	kword=11;break;}					//确认确实有按键信号,返回键值
			//以上语句扫描第二列

RD=DISRD;
WR=ENWR;
PinDrvKey2=FALSE;	
PinDrvKey3=TRUE;
WR=DISWR;
RD=ENRD;

if(PinScanKey1==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey1==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey1==TRUE)
	kword=7;break;}					//确认确实有按键信号,返回键值
if(PinScanKey2==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey2==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey2==TRUE)
	kword=8;break;}					//确认确实有按键信号,返回键值
if(PinScanKey3==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次 
if(PinScanKey3==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey3==TRUE)
	kword=9;break;}					//确认确实有按键信号,返回键值
if(PinScanKey4==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey4==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey4==TRUE)
	kword=12;}					//确认确实有按键信号,返回键值
			//以上语句扫描第三列

RD=DISRD;
WR=ENWR;
PinDrvKey3=FALSE;	
PinDrvKey4=TRUE;
WR=DISWR;
RD=ENRD;

if(PinScanKey4==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey1==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey1==TRUE)
	kword=0;break;}					//确认确实有按键信号,返回键值
if(PinScanKey2==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey2==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey2==TRUE)
	kword=14;break;}					//确认确实有按键信号,返回键值
if(PinScanKey3==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
if(PinScanKey3==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey3==TRUE)
	kword=14;break;}					//确认确实有按键信号,返回键值
if(PinScanKey4==TRUE)
	delay(DELAY_VALUE);		//如果判断有信号,则延时一次 
if(PinScanKey4==TRUE)
{ delay(DELAY_VALUE);			//假如判断还有信号,则再延时
if(PinScanKey4==TRUE)
	kword=13;break;}					//假如判断还有信号,则再延时
	 //以上语句扫描第四列

RD=DISRD;
WR=ENWR;
PinDrvKey4=FALSE;	
WR=DISWR;
RD=ENRD;
}return kword;
}



void display(unsigned char i,unsigned char num)
{  WR=FALSE;
	if(num >= 0 && num <=9)
	{switch(i)
	{ case 0:P2=0x80;
	         P0=LedSelect0;
 			   P2=0x90;
				P0=numtochar(num);
           //Led0显示nu
	break;
	  case 1:P2=0x80;
	         P0=LedSelect1;
 			   P2=0x90;
				P0=numtochar(num);
           //Led1显示nu
		  break;
	  case 2:P2=0x80;
	         P0=LedSelect2;
 			   P2=0x90;
				P0=numtochar(num);
           //Led2显示nu镜氖

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -