基于51单片机的简单两位数加减乘除计算器(只能算算正数)

# 实验说明
## 动态数码管
## 矩阵按键
#### 线翻转法
#软件设计
##main函数代码

# 实验总结

实验说明

按键对应为

1234

5678

9+-0

清零*/=

动态数码管

 因为就是两位数的加减乘除我用到的是最右边的四个数码管,通过在函数里加if语句可以使高位不显示零,再封装一个数组将对应数字的段选码存入,方便数码管显示函数调用

矩阵按键

线翻转法就是先将行线全部置零,再去检测是哪一根列线按下,然后将列线置零,再去检测是哪一根行线按下,行列交叉就是按下的键

软件设计

延时函数相信大家都会的,就不给出代码了

#include <REGX52.H>
#include "delay.h"
unsigned int  MKey()
{
static unsigned int  key_value=0;
	P1=0x0f;
	if(P1!=0x0f)
	{
		Delay(1);
		if(P1!=0x0f)
		{
			P1=0x0f;
			switch(P1)
			{
				case 0x07: key_value=1;break;
				case 0x0b: key_value=2;break;
				case 0x0d: key_value=3;break;
				case 0x0e: key_value=4;break;
			}
			P1=0xf0;
			switch(P1)
			{
				case 0x70: key_value=key_value;break;
				case 0xb0: key_value=key_value+4;break;
				case 0xd0: key_value=key_value+8;break;
				case 0xe0: key_value=key_value+12;break;
			}
				while(P1!=0xf0);
		}
	}
	else
		key_value=0;
		return key_value;
}

main函数代码

#include <REGx52.H>
#include "juzheng.h"
#include "delay.h"
int  key,z=0;
void display(int b );
int a[4];
int i=0;
int c[2];
int sign=0;
int  num=0;
unsigned char	n[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//存0-9的段选码
void main()
{
	while(1)
	{	
		key=MKey();//获取键值
		if(key>=1&&key<=9)
		{
			num=key;//将键值存取
			z=z*10+num;//初始的z为0,如果一位数就是z=num,两位数就是z=z*10+num
		}
		else if(key==12)//key=12 代表0,两位数第二位为0的话就是原先数乘10
			z=z*10;
		else if(key==13)//代表清零,c[0]则是用来存取第一个数的值
		{
			z=0;
			c[0]=0;
		}
	
		else if(key==10)//	+
		{
			sign=1;
			c[0]=z;
			z=0;
		}
		else if(key==11)//	-
		{
			sign=2;
			c[0]=z;
			z=0;
		}
			else if(key==14)//	*
		{
			sign=3;
			c[0]=z;
			z=0;
		}
			else if(key==15)// 代表除
		{
			sign=4;
			c[0]=z;
			z=0;
		}
		else if(key==16&&sign==1)//	=    sign是加减乘除的标志位,代表不同算法
		{
			z=z+c[0];
			c[0]=0;
			sign=0;
		}
			else if(key==16&&sign==2)
		{
			z=c[0]-z;
			c[0]=0;sign=0;
		}	
			else if(key==16&&sign==3)
		{
			z=z*c[0];
			c[0]=0;sign=0;
		}
			else if(key==16&&sign==4)
		{
			z=c[0]/z;
			c[0]=0;sign=0;
		}
				display(z );//数码管则是一直显示z的值

	}
}

void display(int b )
{
	/*两位乘法最多也就用到四个数码管,然后高位不显示零的话,我是用数组去存的,将b的每一位都存在数组里去
	只要本位和高位有一个不为零就显示在数码管上*/
	i=3;
	
	while(i!=-1)
	{
		a[i]=b%10;
		b=b/10;
		i--;
	}
	P2_4=0;P2_3=1;P2_2=1;//位选数码管
	if(a[0]!=0)
	{
		P0=n[a[0]];
		Delay(1);	
		P0=0x00;//消隐
	}
	P2_4=0;P2_3=1;P2_2=0;
	if(a[0]!=0||a[1]!=0)
	{
		P0=n[a[1]];
		Delay(1);	
		P0=0x00;
	}
	P2_4=0;P2_3=0;P2_2=1;
	if(a[0]!=0||a[1]!=0||a[2]!=0)
	{
		P0=n[a[2]];
		Delay(1);	
		P0=0x00;
	}
	P2_4=0;P2_3=0;P2_2=0;
	{
		P0=n[a[3]];
		Delay(1);	
		P0=0x00;
	}
}

实验总结

没有去处理除法的小数和负数,只能实现正数,写到这里我就没继续研究了,最后代码有不足和需要完善的地方希望各位大神博主指出,这是我发的第一篇博客,如果有人觉得好的话,可以点赞,评论支持一下,最后谢谢大家!

工程链接可以看看这里哔哩哔哩工房 (bilibili.com)

  • 21
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值