基于51单片机的简易计算器多位数码管显示proteus仿真设计

1 篇文章 0 订阅
1 篇文章 0 订阅
本文介绍了基于51单片机的简易计算器设计,包括四位数的加减乘除运算,使用4*4矩阵按键和四位数码管显示。详细展示了数码管显示和键盘矩阵函数的程序代码,以及主函数中的运算逻辑。
摘要由CSDN通过智能技术生成

基于51单片机的简易计算器多位数码管显示proteus仿真设计

1.设计功能

  1. 本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用)。

  2. 设计一个简易计算器,能够进行最多八位数的加、减、乘、除连续运算。

  3. 采用4*4的矩形按键,通过八位数码管显示输入数字和结果。

2.proteus仿真图

proteus仿真连接图

3.程序代码

  1. 数码管显示函数,参数为要显示的数
void tube(long n)
{
   	long i,k,m = 10000,a[8] = {~0};
	P2 = 0xf0;
	while(m--)
	{
		k =1;
		for(i = 0;i<8;i++)
		{	
			if(i != 0)
			{
				if(n/k == 0)
					break;
			}
			a[i] = n/k%10;

			k *= 10;			
			P3 = (1<<i);
			P1 = (~0);

			switch(a[i]){
				case 0:P1 = ~0x3f;break;
				case 1:P1 = ~0x06;break;
				case 2:P1 = ~0x5b;break;
				case 3:P1 = ~0x4f;break;			
				case 4:P1 = ~0x66;break;
				case 5:P1 = ~0x6d;break;
				case 6:P1 = ~0x7d;break;
				case 7:P1 = ~0x07;break;
				case 8:P1 = ~0x7f;break;
				case 9:P1 = ~0x6f;break;
			}
		}
		if(P2>>4 != 15)
		{
			break;
		}
	}
	P3 = 0; 
}

  1. 键盘矩阵函数,返回值为按下的按键对应的键值
int  matrix()
{
	int arr[4][4] = {
			{7,8,9,14},
			{4,5,6,13},
			{1,2,3,12},
			{16,0,15,11}
	};
	int row,col,i;
	int n = (~0);

	while(1)
	{
		for(i = 0;;i++)
		{
			P2 = 0xff - (1<<i);
			
			if(P2>>4 != 15)
			{
				row = i;
				for(i = 0;i<4;i++)
				{
					if((1<<i & P2>>4) == 0)
						{
							col = i;
							n = arr[row][col];
							break;
						}
				}
				break;
			}

			if(i == 3)
			 	i = -1;
		}

		while(P2>>4 != 0x0f);			
		return n;	
	} 
}
  1. 返回值为参加运算的值并将运算符存入*x
long innumber(int *x)
{
	int i,k = 1,temp[9];		
	long m = 0;
	for(i = 0;i<9;i++)
	{			
		temp[i] = matrix();
		if(temp[i] == 16)
		{
			tube(0);
			n = 0;
			return 0;	
		}
		if(temp[i] >=11 && temp[i] <= 14)
		{
			if(*x == 0)
				tube(n);
			else
				tube(m);
			*x = temp[i]; //保存运算符
			
			return m;
		}
		if(temp[i] == 15)
		{	
			*x = 0;

			return m;	
		}
		m = m*k+temp[i];
		k = 10;
		tube(m);
	}

	return m;
}

4.返回运算结果

long sum(long m,long n,int symble)
{
   switch(symble){
		case 11:n += m;break;
		case 12:n -= m;break;
		case 13:n *= m;break;
		case 14:n /= m;break;
		default :break;
	}
	return n;
}
  1. 主函数,注意n为全局变量
#include <reg51.h>	   //此文件中定义了51的一些特殊功能寄存器

int matrix();
void tube(long n);
long innumber(int *x);
long sum(long m,long n,int symble);
long n;
void main()
{
	long m = 0;
	int a,symble = 1,*x = &symble;
	n = 0;
	while(1)
	{	
		
		m = innumber(x);

		if(n != 0 )
		{
			
			n = sum(m,n,a);
	   		tube(n);

		}
		else
		{
		    n = m;
	    }
		if(symble == 0)
		{
		 	innumber(x);
			a = symble;
		}
		else
			a = symble;								
	}
	
}
  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值