单片机51实现计算器详细代码能自己运行

1.实现功能:

实现单字节加减乘除四则运算
1、能通过键盘输入正确键值
2、能进行简单的四则运算
3、能以数码管正确显示数值
4、能重复操作

2.元器件清单

在这里插入图片描述

3.软件流程图

在这里插入图片描述
4.仿真图
在这里插入图片描述
如22+96
在这里插入图片描述
在这里插入图片描述

6.相关代码

#include "reg51.h"
sbit smg1=P2^0;//数码管
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
sbit smg5=P2^4;
sbit smg6=P2^5;
sbit smg7=P2^6;
sbit smg8=P2^7;
unsigned int a=0,b=0; //输入
unsigned char fuhao=0;//符号
unsigned int c=0;//结果
unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9,无小数点
unsigned char disp[]={0,0,0,0,0,0,0,0};

void delay(unsigned int i)//延时
{
	while(i--);
}

unsigned char key_scan()//按键检测
{
unsigned char i,j;
i=0;
j=0;
P1=0x0f;
if(P1!=0x0f) //检测有无按下
{
 switch(P1)//检测行
 {
  case 0x0e:i=3;break;
  case 0x0d:i=2;break;
  case 0x0b:i=1;break;
  case 0x07:i=0;
 }
 P1=0xf0;
 switch(P1)//检测列
 {
  case 0xe0:j=13;break;
  case 0xd0:j=9;break;
  case 0xb0:j=5;break;
  case 0x70:j=1;
 }
 while(P1!=0xf0);//等待按键松开
}
return i+j;
}

void main()//主函数
{
	unsigned char i;
	unsigned int m=0;
	while(1)
	{
		//显示
		if(fuhao<5)
		{
		P0=smgduan[a%1000/100];smg1=0;delay(100);smg1=1;
		P0=smgduan[a%100/10];smg2=0;delay(100);smg2=1;
		P0=smgduan[a%10];smg3=0;delay(100);smg3=1;

		switch(fuhao)//符号
		{
			case 1:P0=0x01;break;
			case 2:P0=0x40;break;
			case 3:P0=0x08;break;
			case 4:P0=0x80;break;
			default:P0=0;
		}
		smg4=0;delay(100);smg4=1;

		P0=smgduan[b%1000/100];smg5=0;delay(100);smg5=1;
		P0=smgduan[b%100/10];smg6=0;delay(100);smg6=1;
		P0=smgduan[b%10];smg7=0;delay(100);smg7=1;
		}
		else//显示结果
		{
			P0=smgduan[c%1000/100];smg5=0;delay(100);smg5=1;
			P0=smgduan[c%100/10];smg6=0;delay(100);smg6=1;
			P0=smgduan[c%10];smg7=0;delay(100);smg7=1;
		}
		//==================================================
		i=key_scan();//检测
		if((i>0)&&(i<11))//输入数值
		{
			if(fuhao==0)//第1个输入
			{
				a=a*10+i-1;
				if(a>999)
					a=a%1000;				
			}
			else //第2个输入
			{
				b=b*10+i-1;
				if(b>999)
					b=b%1000;				
			}
		}
		if(i==13)//+
		{
			fuhao=1;
		}
		if(i==14)//-
		{
			fuhao=2;
		}
		if(i==15)//*
		{
			fuhao=3;
		}
		if(i==16)// /
		{
			fuhao=4;
		}
		if(i==11)//ok
		{						
			switch(fuhao)
			{
				case 1:c=a+b;break;
				case 2:c=a-b;break;
				case 3:c=a;c=c*b;break;
				case 4:c=a/b;
			}
			fuhao=5;						
		}
		if(i==12)//清除
		{			 
			 a=0;
			 b=0;
			 c=0;
			 fuhao=0;
		}
	}
}
  • 14
    点赞
  • 160
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
这里提供一个简单的51单片机数码管计算器实现加减乘除的代码,供您参考。代码基于Keil C51编译器,使用4位共阳数码管和4个按键,实现了加减乘除四则运算。请注意,本代码仅供参考,具体实现方法可根据您自己的需求进行调整。 ``` #include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit KEY_0 = P1^0; //数字键0 sbit KEY_1 = P1^1; //数字键1 sbit KEY_2 = P1^2; //数字键2 sbit KEY_3 = P1^3; //数字键3 sbit KEY_ADD = P1^4; //加号键 sbit KEY_SUB = P1^5; //减号键 sbit KEY_MUL = P1^6; //乘号键 sbit KEY_DIV = P1^7; //除号键 sbit KEY_EQ = P3^2; //等号键 sbit LED_COM = P2^7; //数码管共阴极控制位 uchar code LED_TAB[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段码表 uint num1 = 0; //第一个数字 uint num2 = 0; //第二个数字 uint result = 0; //计算结果 uchar status = 0; //运算状态,0为未输入运算符,1为输入了运算符 void delay(uint xms) //延时函数 { uint i, j; for(i=xms; i>0; i--) for(j=110; j>0; j--); } void display(uint num) //数码管显示函数 { uchar i; for(i=0; i<4; i++) { LED_COM = 1 << i; //选择数码管位 P0 = LED_TAB[num % 10]; //显示个位数字 num /= 10; delay(5); //延时5ms P0 = 0x00; //关闭数码管 } } void input(uint *num) //数字键输入函数 { if(KEY_0 == 0) *num = *num * 10 + 0; else if(KEY_1 == 0) *num = *num * 10 + 1; else if(KEY_2 == 0) *num = *num * 10 + 2; else if(KEY_3 == 0) *num = *num * 10 + 3; } void calc(uchar op) //计算函数 { switch(op) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': if(num2 == 0) //除数为0,错误处理 { result = 0; break; } result = num1 / num2; break; } display(result); //显示计算结果 } void main() { uchar op = 0; //运算符 uint i = 0; //循环变量 while(1) { if(KEY_ADD == 0) //加号键按下 { op = '+'; status = 1; delay(10); } if(KEY_SUB == 0) //减号键按下 { op = '-'; status = 1; delay(10); } if(KEY_MUL == 0) //乘号键按下 { op = '*'; status = 1; delay(10); } if(KEY_DIV == 0) //除号键按下 { op = '/'; status = 1; delay(10); } if(KEY_EQ == 0) //等号键按下 { if(status == 0) //未输入运算符,错误处理 { result = 0; display(result); delay(500); continue; } calc(op); //进行计算 num1 = result; //保存计算结果 num2 = 0; op = 0; status = 0; delay(10); } input(&num2); //数字键输入 display(num2); //显示输入数字 } } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值