基于51单片机的简易计算器设计(C51编写、矩阵键盘、数码管显示)

矩阵按键S1-S10表示0-9,S11表示加号,S12表示减号,S13表示乘号,S14表示除号,S15表示等于号。

#include <reg52.h> 
#include "math.h"

#define GPIO_KEY P1

typedef unsigned int u16;      
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 b[8]={0,0,0,0,0,0,0,0};

u16 l,m,KeyValue,flag;

u8 DisplayData[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};   
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //0-9的十六进制
void delay(u16 i)   //延时函数 
{
	while(i--); 
}

void KeyDown()    //按键函数 
{
	GPIO_KEY=0x0f;
	if(GPIO_KEY!=0x0f)
	{
		delay(1000);
		if(GPIO_KEY!=0x0f)
	  	{ 
	   		//测试列
	   		GPIO_KEY=0X0f;
			switch(GPIO_KEY)
	   		{
	    		case(0X07): KeyValue=0;break;
	    		case(0X0b): KeyValue=1;break;
	    		case(0X0d): KeyValue=2;break;
	    		case(0X0e): KeyValue=3;break;
	   		}
	   		//测试行
	   		GPIO_KEY=0Xf0;
	   		switch(GPIO_KEY)
	   		{
	    		case(0X70): KeyValue=KeyValue;break;
	    		case(0Xb0): KeyValue=KeyValue+4;break;
	    		case(0Xd0): KeyValue=KeyValue+8;break;
	    		case(0Xe0): KeyValue=KeyValue+12;break;
	   		}
	   }
	   if(KeyValue==0||KeyValue==1||KeyValue==2||KeyValue==3||KeyValue==4||KeyValue==5||KeyValue==6||KeyValue==7||KeyValue==8||KeyValue==9)    
	   {
	   		flag=1;
	   }
	   else if(KeyValue==10)    //S11位加号 
	   {
	   		flag=2;
	   }
	   else if(KeyValue==11)   //S12为减号 
	   {
	   		flag=3;
	   }
	   else if(KeyValue==12)   //S13为乘号 
	   {
	   		flag=4;
	   }
	   else if(KeyValue==13)   //S14为除号
	   {
	   		flag=5;
	   } 
	   else if(KeyValue==14)   //S15为等于号 
	   {
	   		flag=6;
	   }
	   while(GPIO_KEY!=0Xf0)
	   {
	   		delay(5);
	   }
	}		
}

void DigDisplay()   //在数码管上显示 DisplayData里的元素 
{
 	u8 j;
 	for(j=0;j<8;j++)
 	{	
  		switch(j)  
  		{
        	case(7):
				LSA=1;LSB=1;LSC=1;break;//显示第0位
			case(6):
				LSA=0;LSB=1;LSC=1;break;//显示第1位
			case(5):
				LSA=1;LSB=0;LSC=1;break;//显示第2位
			case(4):
				LSA=0;LSB=0;LSC=1;break;//显示第3位
			case(3):
				LSA=1;LSB=1;LSC=0;break;//显示第4位
			case(2):
				LSA=0;LSB=1;LSC=0;break;//显示第5位
			case(1):
				LSA=1;LSB=0;LSC=0;break;//显示第6位
			case(0):
				LSA=0;LSB=0;LSC=0;break;//显示第7位	
  		}
  		P0=DisplayData[j];
  		delay(100);
  		P0=0x00;
 	}
}



void main()
{
	u16 i,d,e,f=0,s,g=0,t,z,y,h,am,lzc;
	u16 lm[8]={0};
	while(1)
	{
		DigDisplay();
		KeyDown();
		if(flag==1)
		{
	 		for(i=7;i>0;i--)
			{
				b[i]=b[i-1];
			}
			b[0]=KeyValue;
			if(g==0)
			{
				l=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);
			}
			else
			{
				m=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);
			}
			for(e=0;e<8;e++)
			{
				if(b[e]!=0)
				{
					f=e+1;
				}
			}
			for(d=0;d<f;d++)
			{
				DisplayData[d]=smgduan[b[d]]; 
			}
			flag=100;
		}
		
		if(flag==2)   //加运算 
		{
			for(s=0;s<8;s++)
			{
				b[s]=0;
				DisplayData[s]=0x00;
			}
			flag=100;
			g++;
			lzc=1;   //加法标志位	
		}
		if(flag==3)   //减运算 
		{
			for(s=0;s<8;s++)
			{
				b[s]=0;
				DisplayData[s]=0x00;
			}
			flag=100;
			g++;
			lzc=2;
		}
		if(flag==4)   //乘运算 
		{
			for(s=0;s<8;s++)
			{
				b[s]=0;
				DisplayData[s]=0x00;
			}
			flag=100;
			g++;
			lzc=3;
		}
		if(flag==5)   //除运算 
		{
			for(s=0;s<8;s++)
			{
				b[s]=0;
				DisplayData[s]=0x00;
			}
			flag=100;
			g++;
			lzc=4;
		}
		if(flag==6)
		{
			if(lzc==1)
			{
				t=l+m;
				lm[7]=t/10000000;
				lm[6]=(t%10000000)/1000000;
				lm[5]=((t%10000000)%1000000)/100000;
				lm[4]=(((t%10000000)%1000000)%100000)/10000;
				lm[3]=(((t%10000000)%1000000)%100000)%10000/1000;
				lm[2]=(((t%10000000)%1000000)%100000)%10000%1000/100;
				lm[1]=(((t%10000000)%1000000)%100000)%10000%1000%100/10;
				lm[0]=(((t%10000000)%1000000)%100000)%10000%1000%100%10;
				for(z=0;z<8;z++)
				{
					if(lm[z]!=0)
					{
						y=z+1;
					}
				}
				for(h=0;h<y;h++)
				{
					DisplayData[h]=smgduan[lm[h]];
				}
				for(am=y;am<8;am++)
				{
					DisplayData[am]=0x00;
				}
			}
			if(lzc==2)
			{
				if(l>m)
				{	
					t=l-m;
					lm[7]=t/10000000;
					lm[6]=(t%10000000)/1000000;
					lm[5]=((t%10000000)%1000000)/100000;
					lm[4]=(((t%10000000)%1000000)%100000)/10000;
					lm[3]=(((t%10000000)%1000000)%100000)%10000/1000;
					lm[2]=(((t%10000000)%1000000)%100000)%10000%1000/100;
					lm[1]=(((t%10000000)%1000000)%100000)%10000%1000%100/10;
					lm[0]=(((t%10000000)%1000000)%100000)%10000%1000%100%10;
					for(z=0;z<8;z++)
					{
						if(lm[z]!=0)
						{
							y=z+1;
						}
					}
					for(h=0;h<y;h++)
					{
						DisplayData[h]=smgduan[lm[h]];
					}
					for(am=y;am<8;am++)
					{
						DisplayData[am]=0x00;
					}
				}
				if(l<m)
				{
					t=m-l;
					lm[7]=t/10000000;
					lm[6]=(t%10000000)/1000000;
					lm[5]=((t%10000000)%1000000)/100000;
					lm[4]=(((t%10000000)%1000000)%100000)/10000;
					lm[3]=(((t%10000000)%1000000)%100000)%10000/1000;
					lm[2]=(((t%10000000)%1000000)%100000)%10000%1000/100;
					lm[1]=(((t%10000000)%1000000)%100000)%10000%1000%100/10;
					lm[0]=(((t%10000000)%1000000)%100000)%10000%1000%100%10;
					for(z=0;z<8;z++)
					{
						if(lm[z]!=0)
						{
							y=z+1;
						}
					}
					DisplayData[y]=0x40;
					for(h=0;h<y;h++)
					{
						DisplayData[h]=smgduan[lm[h]];
					}
					for(am=y+1;am<8;am++)
					{
						DisplayData[am]=0x00;
					}		
				}	
			}
			if(lzc==3)
			{
				t=l*m;
				lm[7]=t/10000000;
				lm[6]=(t%10000000)/1000000;
				lm[5]=((t%10000000)%1000000)/100000;
				lm[4]=(((t%10000000)%1000000)%100000)/10000;
				lm[3]=(((t%10000000)%1000000)%100000)%10000/1000;
				lm[2]=(((t%10000000)%1000000)%100000)%10000%1000/100;
				lm[1]=(((t%10000000)%1000000)%100000)%10000%1000%100/10;
				lm[0]=(((t%10000000)%1000000)%100000)%10000%1000%100%10;
				for(z=0;z<8;z++)
				{
					if(lm[z]!=0)
					{
						y=z+1;
					}
				}
				for(h=0;h<y;h++)
				{
					DisplayData[h]=smgduan[lm[h]];
				}
				for(am=y;am<8;am++)
				{
					DisplayData[am]=0x00;
				}	
			}
			if(lzc==4)
			{
				t=l/m;
				lm[7]=t/10000000;
				lm[6]=(t%10000000)/1000000;
				lm[5]=((t%10000000)%1000000)/100000;
				lm[4]=(((t%10000000)%1000000)%100000)/10000;
				lm[3]=(((t%10000000)%1000000)%100000)%10000/1000;
				lm[2]=(((t%10000000)%1000000)%100000)%10000%1000/100;
				lm[1]=(((t%10000000)%1000000)%100000)%10000%1000%100/10;
				lm[0]=(((t%10000000)%1000000)%100000)%10000%1000%100%10;
				for(z=0;z<8;z++)
				{
					if(lm[z]!=0)
					{
						y=z+1;
					}
				}
				for(h=0;h<y;h++)
				{
					DisplayData[h]=smgduan[lm[h]];
				}
				for(am=y;am<8;am++)
				{
					DisplayData[am]=0x00;
				}
			}
		}
		DigDisplay(); 
	}
}
  • 34
    点赞
  • 221
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
基于STC89C51单片机简易计算器电路原理图如下: 该电路主要包括STC89C51单片机、键盘模块、显示模块和电源模块四个部分。 首先,通过电源模块为整个电路供电。电源模块将交流电转化为稳定的直流电,供给STC89C51单片机和其他模块使用。 其次,键盘模块与STC89C51单片机相连接。键盘模块通过矩阵键盘的方式将用户的按键输入转化为电信号,并通过引脚与STC89C51单片机的IO口相连。通过扫描键盘输入状态,STC89C51单片机可以接收到用户输入的数字和操作符。 然后,显示模块与STC89C51单片机相连接。显示模块主要用于显示计算结果和用户输入的数字和操作符。显示模块通常采用七段数码管或液晶显示屏,通过引脚与STC89C51单片机的IO口相连。STC89C51单片机根据用户的输入和计算结果,通过控制IO口的电平或数据,实现显示功能。 最后,STC89C51单片机作为计算器的核心控制器。它通过运算、判断用户输入的数字和操作符,实现基本的加减乘除运算。在接收到用户输入后,STC89C51单片机根据输入的数字和操作符,进行相应的计算。计算结果可通过IO口控制显示模块进行显示。 综上所述,基于STC89C51单片机简易计算器电路原理图包括电源模块、键盘模块、显示模块和STC89C51单片机四个部分。通过合理连接和控制,实现了用户输入数字和操作符,计算结果的显示功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值