51单片机数码管计算器实现加减乘除代码
时间: 2023-11-06 09:04:13 浏览: 218
这里提供一个简单的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); //显示输入数字
}
}
```