使用51单片机实现简单的四则运算(只包含+ - * / 和 =)
实验设备 : 普中科技 单片机开发试验仪
开发软件 : Keil uVision3
烧录软件 : PZ-ISP V1.48
设计思路 :
由于51单片机数据存储空间有限,所以不能开辟过多的数据空间,C语言处理四则运算的代码无法直接通过改写,编译烧录。故此次实验采用状态转换的方式实现计算器的简单四则运算。使用数据空间3个:a, b, c。即可实现。下图为状态转换图。
在程序实现过程中,如果遇到’=’则需要显示结果到显示屏,这部分说明请看代码相应位置。对于错误输入在各自状态有相应处理过程,如不存储该错误输入等。此外,在程序实现过程中添加 状态11:用于清屏重置;状态12:ERROR状态。下面介绍接线及运行结果。
接线
Jp8连JP4 Jp9连Jp5 把1602液晶插入
按键说明
输入
计算结果
程序代码
/**************************************************************************************
* 简易四则运算计算器 *
* *
* 仪器:普中科技 单片机开发实验仪 *
* 连接方法:Jp8连JP4 Jp9连Jp5 把1602液晶插入 *
* *
***************************************************************************************/
#include <reg51.h> //此文件中定义了51的一些特殊功能寄存器
#define uchar unsigned char
#define uint unsigned int
#define MAXLEN 16
sbit EN=P2^7; //LCD的使能引脚
sbit RS=P2^6; //LCD数据命令选择端
sbit RW=P2^5; //LCD的读写选择端
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
sbit K8=P3^7; // 清屏,重置变量
bit flag = 0; // + 或 - 标识符; 0:+;1:-;
uchar KEY_CODE[]={ 0xed,0xdd,0xbd,0x7d,//3X4矩阵键盘键值表
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77};
//定义字符键值表
uchar CHAR_TABLE[]={
0x30,0x31,0x32,0x33,//这四个会在液晶显示器中显示0 1 2 3
0x34,0x35,0x36,0x37,//这四个会显示4 5 6 7
0x38,0x39,0x2b,0x3d,//这四个会显示8 9 + =
0x2b,0x2d,0x2a,0x2f,//这四个会显示+ - * /
0x45,0x52,0x4f}; //这三个会显示E R O
uchar QUEUE[2*MAXLEN]={
' ',' ',' ',' ',' ',' '}; //定义一个队列
int count = 0;
unsigned int state=0;
long a=0,b=0,c=0;
void mscanf(uchar *var); //从矩阵键盘中获取值
void print(uchar *outStr,uint end); //打印字符串
void delay5MS(); //短延时函数
void delay100MS(); //较长延时函数
void writeCMD(uchar com); //写命令子程序
void showOneChar(uchar dat); //写数据子程序
void init(); //初始化子程序,初始化液晶显示屏
void clear(); //清除显示屏上的显示
void clearInit(); //清屏,重置变量
void splitResultNum(long result); // 分离数值
void number(); //state0: 数字输入
void middle_add_sub(); //state:1:
void add_sub(); //state:2:
void middle_add_sub_times(); //state:3;
void middle_add_sub_div(); //state:4;
void add_sub_times(); //state:5;
void add_sub_div(); //state:6;
void mulMidState(); //state7: *中间态
void divMidState(); //state8: /中间态
void mulState(); //state9: *计算态
void divState(); //state10: /计算态
void showError(); //state12:错误状态
/**************** 主函数 ******************/
void main()
{
// state0:数字输入态
// state1:+,-中间态
// state2:+,-计算态
// state3:+/-,*中间态
// state4:+/-,/中间态
// state5:+/-,*计算态
// state6:+/-,/计算态
// state7:*中间态
// state8:/中间态
// state9:*计算态
// state10:/计算态
// state11:清屏重置
// state12:错误状态
state = 0;
init();
while(1){
switch(state){
case 0: // state0:数字输入态
number();
break;
case 1: // state1:+,-中间态
middle_add_sub();
break;
case 2: // state2:+,-计算态
add_sub();
break;
case 3: // state3:+,-,*中间态
middle_add_sub_times();
break;
case 4: // state4:+,-,/中间态
middle_add_sub_div();
break;
case 5: // state5:+,-,*计算态
add_sub_times();
break;
case 6: // state6:+,-,/计算态
add_sub_div();
break;
case 7: // state7:*中间态
mulMidState();
break;
case 8: // state8:/中间态
divMidState();
break;
case 9: // state9:*计算态
mulState();
break;