单片机-- 简易计算器汇编程序
基于单片机的计算器——汇编

基于单片机的计算器——汇编编号:单片机综合设计实训 (论文)说明书题目:基于单片机的电子计算器院(系):专业:学生姓名:学号:指导教师:年01 月 1 日摘要当今社会,随着人们物质生活的不断提高,电子产品已经走进了家家户户,无论是生活或学习,还是娱乐和消遣几乎样样都离不开电子产品,大型复杂的计算能力是人脑所不能胜任的,而且比较容易出错。
计算器作为一种快速通用的计算工具方便了用户的使用。
计算器可谓是我们最亲密的电子伙伴之一。
单片机由于其微小的体积和极低的成本,广泛的应用于家用电器、工业控制等领域中。
在工业生产中。
单片微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
本系统就是充分利用了AT89S52芯片的I/O引脚。
系统以采用MCS-51系列单片机Intel8051为中心器件来设计计算器控制器,以矩阵键盘输入、八位数码管显示,实现了能根据实际输入值计算并显示的功能。
关键词:计算器 AT89S52 八位数码管矩阵键盘AbstractIn today's society, with people constantly improve the material life, the electronic produc ts have entered the each and every family, whether living or studying, or entertainment and recreation almost everything is inseparable from the electronic products, large and complex co mputing capability is the human brain are not competent, but relatively easy to go wrong.Calc ulator as a rapid generic computational tool is convenient for users to use.The calculator is our most intimate electronic partners.SCM because of its small size and low cost, widely used in household appliances, industr ial control and other areas.In industrial production.Single chip microcomputer, the microcomp uter is an important branch, is full of vitality.Single chip micro computer referred to as SCM, is particularly applicable to the control field, it is also known as the micro controller.The system is to make full use of the AT89S52 chip I / O pins.System for using MCS-51 MCU Intel8051 as the center device to design the computer controller, with the matrix keybo ard input, the eight digital tube display, can be achieved according to the actual input value ca lculation and display functions.Key words: calculator AT89S52 digital tube eight matrix keyboard目录1实训设计内容 (4)1.1 设计目的 (4)1.2 设计任务 (4)2 系统硬件设计 (4)2.1 芯片介绍 (4)2.1.1主控芯片AT89S52概述与介绍 (4)2.1.2 MAX232芯片介绍 (9)2.2 硬件电路 (10)2.2.1 键盘接口电路 (10)2.2.2 7段LED数码管 (10)2.2.3 程序下载接口 (11)2.2.4 单片机时钟电路 (11)2.2.5 单片机复位电路 (12)3 软件设计 (12)3.1 按键扫程序设计 (12)3.2 算法设计 (13)4 电路板制作过程 (13)5 作品调试 (14)5.1硬件调试 (14)5.2 程序调试 (14)致谢 (16)参考文献: (17)附录: (18)1实训设计内容1.1 设计目的通过本次课题设计,应用《单片机原理及应用》等所学相关知识及查阅资料,完成简易计算器的设计,以达到理论与实践更好的结合、进一步提高综合运用所学知识和设计的能力的目的。
单片机的简易计算器毕业设计

单片机的简易计算器毕业设计简易计算器是一种基本、常见的电子设备,它能够对数字进行简单的加减乘除运算。
单片机作为一种小型、低功耗的微型计算机,非常适合用于设计和实现计算器的功能。
在本文中,我们将以单片机为基础,设计和实现一个简易计算器。
一、设计思路1.硬件设计:-使用单片机作为主控制器。
-接入键盘矩阵和显示器。
-使用LED灯作为指示灯,用于显示运算符和结果。
2.软件设计:-通过键盘输入数字和运算符。
-将输入的数字和运算符转换成相应的控制信号。
-进行运算,并将结果显示在屏幕上。
3.功能实现:-实现加法、减法、乘法和除法运算。
-提供清零、退格和等号等功能。
-支持小数和负数的输入和运算。
-提供错误提示功能,例如除数不能为零等。
二、具体实现1.硬件实现:-将键盘矩阵的行和列与单片机的IO口相连,通过扫描来检测按键的输入。
-将显示器与单片机的IO口相连,通过控制引脚来发送和接收数据。
-将LED灯与单片机的IO口相连,设置相应的引脚状态来显示不同的指示信号。
2.软件实现:-使用C语言编写程序,通过中断和轮询的方式,实现键盘输入的检测和数据的读取。
-将读取到的数据进行解析,并根据不同的按键进行相应的操作。
-根据输入的数字和运算符,进行相应的运算并输出结果。
3.功能实现:-加法、减法、乘法和除法运算可以通过相应的算法实现,例如加法可以通过循环和位运算来实现。
-清零功能可以将运算结果和输入的数字都清零,退格功能可以删除输入的最后一个数字或运算符。
-支持小数运算可以在运算过程中进行进位和进位操作,支持负数运算可以通过判断运算符来进行相应的处理。
-错误提示功能可以通过对输入的数据进行检查和判断来实现,例如判断除数是否为零。
三、总结通过上述的设计和实现,我们可以成功地设计和制作一个单片机的简易计算器。
通过这个计算器,用户可以进行简单的加减乘除运算,同时还具备清零、退格、小数和负数等功能。
这个计算器可以应用在日常生活中的计算场景,方便用户进行各种简单的运算操作。
基于单片机的简易计算器编程

if(t[j]==0x34) { DispCharacter(0,k--,'4');}
if(t[j]==0x35) { DispCharacter(0,k--,'5');}
if(t[j]==0x36) { DispCharacter(0,k--,'6');}
}
for(i=r-2;i>=0;i--)
{
tx=u;
u=u+(( unsigned long )(t[i]-48)*(pow(r-i-2)));
if(u<tx) { systemerror();}
}
}
void hou( ) //计算符号后面的数值
{
int j,flash=0; //标志位:从不是零的高位开始显示!
int k=12;
for(j=3;j>=0;j--)
{
if(f3==0) { break; }
if(m[0]==0x30&&m[1]==0x30&&m[2]==0x30) { f3=0; break; }
PinRW=0;
PinE=0;
PinData = data1;
PinE=1;
ShortDelay(10);
PinE=0;
PinRW=1;
PinRS=0;
}
void WriteInstruc(char Instruc)
{
while(StatusCheck());
if(m[j]==0x32) { DispCharacter(1,k++,'2'); flash++;}
单片机简易计算器设计(二)2024

单片机简易计算器设计(二)引言:单片机简易计算器是一种以单片机为核心实现基本算术运算的小型电子设备。
本文继续探讨单片机简易计算器的设计方案,并详细介绍了其具体实现步骤和功能。
正文:第一大点:电路设计1. 选择适当的单片机型号2. 设计电源电路,确保稳定供电3. 搭建输入输出电路,包括按键和显示模块的连接4. 设计外部调试接口,方便程序的调试和更新5. 进行电路的模拟仿真和实际测试,确保电路的正常工作第二大点:程序编写1. 定义输入输出的数据结构2. 编写初始化程序,配置端口和寄存器3. 编写按键扫描程序,实现按键的读取和编码4. 编写基本算术运算程序,包括加法、减法、乘法和除法5. 编写显示程序,将结果显示在数码管或液晶屏上第三大点:算法优化1. 选择合适的算法,使计算速度尽可能快2. 使用位运算代替乘除法运算,提高运算效率3. 使用查表法来加速计算过程4. 增加缓存机制,优化存储空间的使用5. 对程序进行反复优化和测试,确保算法的准确性和高效性第四大点:错误处理与异常处理1. 设计输入错误的检测机制,防止用户输入无效的数据2. 处理溢出和除零等运算错误,避免程序崩溃3. 设计异常处理程序,对错误输入进行友好提示4. 进行充分的测试和调试,确保程序的稳定性5. 添加日志功能,记录错误信息和运行状态,便于排查问题第五大点:功能扩展1. 添加科学计算功能,如平方根、三角函数等2. 实现单位换算功能,方便不同单位之间的转换3. 增加储存器功能,可以保存计算结果或中间数据4. 设计菜单界面,使用户可以自由选择不同的功能5. 进行实际应用测试,检验扩展功能的可靠性和实用性总结:本文对单片机简易计算器的设计进行了全面的阐述。
通过合理的电路设计、程序编写和算法优化,以及错误和异常处理,使得计算器具备稳定高效的运算能力。
同时还介绍了功能扩展方面的设计思路,为后续的开发和升级提供了参考。
51单片机简易计算器设计

51单片机简易计算器设计一、设计思路计算器的基本功能包括加法、减法、乘法和除法。
我们可以使用按键作为输入方式,将输入的数字和操作符暂时保存在内存中,然后根据操作符进行相应的运算。
最后再将运算结果显示在数码管上。
具体设计思路如下:1.确定计算器所需的硬件组件:数码管、按键、51单片机和相关电路。
2.定义按键与数字和操作符的对应关系。
3.编写51单片机的程序,实现按键输入、运算和结果显示的功能。
二、硬件设计1.数码管:使用常见的7段数码管作为显示器,通过引脚连接到51单片机的IO口。
2.按键:使用4个按键分别表示数字输入键、加法键、减法键和等于键。
三、软件设计1.初始化:将数码管引脚设为输出模式,将按键引脚设为输入模式。
2.按键处理:采用中断方式检测按键输入,通过编程判断所按的键。
3.数字输入:将按键所对应的数字保存在变量中,最多支持四位数的输入。
4.操作符输入:将按下的操作符保存在变量中。
5.运算:根据保存的操作符进行相应的运算,并将结果保存在变量中。
6.结果显示:将结果显示在数码管上。
四、代码实现下面是一个示例代码的框架,供参考:```c#include <reg52.h>sbit SDA = P0^0; // I2C总线数据线sbit SCL = P0^1; // I2C总线时钟线//定义按键的IO口sbit BUTTON0 = P1^0; // 数字输入键sbit BUTTON1 = P1^1; // 加法键sbit BUTTON2 = P1^2; // 减法键sbit BUTTON3 = P1^3; //等于键unsigned char num1 = 0; // 第一个操作数unsigned char num2 = 0; // 第二个操作数unsigned char op = 0; // 操作符unsigned char result = 0; // 运算结果//判断按键所对应的数字或操作符void buttonif (BUTTON0 == 0) // 数字输入键//将按键所对应的数字保存在变量中//显示数字}else if (BUTTON1 == 0) // 加法键//保存操作符为加号}else if (BUTTON2 == 0) // 减法键//保存操作符为减号}else if (BUTTON3 == 0) //等于键//根据保存的操作符进行相应的运算//将结果保存在变量中//显示结果}void mainwhile (1)button(; // 按键处理}```五、总结通过以上的设计思路和示例代码,我们可以轻松地实现一个简易的计算器。
单片机设计简易计算器

单片机设计简易计算器单片机是指将整个计算机系统集成在一块芯片上的微处理器。
设计一个简易计算器,可以使用单片机实现各种基本运算,如加、减、乘、除以及开方等。
首先,我们需要选择单片机的类型和开发环境。
常用的单片机有51系列、AVR系列、ARM系列等。
根据具体需求,选择一种合适的单片机进行设计。
接下来,需要设计计算器的硬件电路。
计算器的核心部分是输入和输出部分,因此需要设计一个合适的显示屏和按键阵列。
一种常用的显示屏是数码管,可以显示数字和一些特殊字符。
按键阵列可以使用矩阵型按键。
在硬件设计完成后,需要进行软件编程。
首先要开发一个简单的操作系统,以便管理单片机的资源和任务。
然后,根据计算器的功能需求,在操作系统上开发相应的计算器应用程序。
计算器的软件程序主要包括以下几个模块:1.输入模块:通过按键阵列读取用户输入的数字和操作符,并且根据用户的输入进行相应的处理。
2.运算模块:根据用户输入的操作符进行相应的运算,包括加、减、乘、除以及开方等。
3.输出模块:将运算结果通过数码管显示出来。
以下是一个简单计算器的软件程序设计示例:```c#include <reg51.h>sbit row1 = P1^0;sbit row2 = P1^1;sbit row3 = P1^2;sbit col1 = P1^3;sbit col2 = P1^4;sbit col3 = P1^5;sbit col4 = P1^6;void delay(unsigned int ms)unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 112; j++);unsigned char keyscarow1 = 0; // 设置第一行为低电平row2 = 1;row3 = 1;if (col1 == 0) { delay(10); while(col1 == 0); return '1'; } if (col2 == 0) { delay(10); while(col2 == 0); return '2'; } if (col3 == 0) { delay(10); while(col3 == 0); return '3'; }if (col4 == 0) { delay(10); while(col4 == 0); return '+'; } row1 = 1;row2 = 0; // 设置第二行为低电平row3 = 1;if (col1 == 0) { delay(10); while(col1 == 0); return '4'; } if (col2 == 0) { delay(10); while(col2 == 0); return '5'; } if (col3 == 0) { delay(10); while(col3 == 0); return '6'; } if (col4 == 0) { delay(10); while(col4 == 0); return '-'; } row1 = 1;row2 = 1;row3 = 0; // 设置第三行为低电平if (col1 == 0) { delay(10); while(col1 == 0); return '7'; } if (col2 == 0) { delay(10); while(col2 == 0); return '8'; } if (col3 == 0) { delay(10); while(col3 == 0); return '9'; } if (col4 == 0) { delay(10); while(col4 == 0); return '*'; } return 0;void display(unsigned char number)P2 = number;void maiunsigned char num1 = 0, num2 = 0, result = 0; unsigned char operator = 0;while (1)num1 = keyscan(;if (num1 == '+')operator = '+';} else if (num1 == '-')operator = '-';} else if (num1 == '*')operator = '*';} else if (num1 != 0)while (1)num2 = keyscan(;if (num2 != 0)break;}}if (operator == '+')result = num1 + num2;} else if (operator == '-')result = num1 - num2;} else if (operator == '*')result = num1 * num2;}display(result);}}```以上程序是一个简单的计算器程序示例。
H-L单片机【简单计算器程序】xys

//***********H-L51单片机【简单计算器】程序************// /*知识运用到:LED灯,蜂鸣器,LED显示器动静态显示,矩阵键盘输入,定时器*///************************************************************************** ***************************************************************************#include <reg52.h> //【计算器】键盘模式 1 2 3 4 【功能;加减乘除基本运算,两位输入四位可#define uint unsigned int // 5 6 7 8 带一位小数点输出,最大显示:99*99=9801】#define uchar unsigned char // 9 0 =sbit dula=P2^6; //控制数码管段选的锁存器锁存端// + - * / sbit wela=P2^7; //控制数码管位选的锁存器锁存端sbit beep=P2^3; //蜂鸣器接口uchar num=0,temp,shu,xshu,ge,shi,bai,qian,d,e,f,g;long i,j,xiaoshu,aa; //i用于表示输入次数,j 表示输入运算符(可用于区分a、b),aa用于定时器float zh,a1,a2,b1,b2,a2a1,b2b1,c;//a2a1、b2b1运算等于zh,由于有运算结果小数点输出,故需定义为浮点型uchar code table[]={ //编码表table[]={ 0,1,2,3 }0x3f,0x06,0x5b,0x4f, // 4,5,6,7,0x66,0x6d,0x7d,0x07, // 8,9,A,B,0x7f,0x6f,0x77,0x7c, // C,D,E,F,无显示,"_",".",0x39,0x5e,0x79,0x71,0x00,0x08,0x80};//***********************【延迟函数】************************//void delay(uint z){uint x,y;for(x=100;x>0;x--)for(y=z;y>0;y--);}//***********************【中断函数】************************// void jishu() interrupt 1{aa=0;}//***********************【显示函数】************************//display1(d) // 【个位显示】{P0=table[d]; //将第num 个显示编码送P0dula=1; //一个下降沿将数据锁存dula=0;P0=0xdf; //位选通全部的数码管wela=1; //一个下降沿将数据锁存wela=0;}display2(e){P0=table[e]; //【十位显示】dula=1;dula=0;P0=0xef;wela=1;wela=0;}display3(f){P0=table[f]; //【百位显示】dula=1;dula=0;P0=0xf7;wela=1;wela=0;}display(g) //【千位显示】{P0=table[g];dula=1;dula=0;P0=0xfb;wela=1;wela=0;}display4(shu) //【数显示】//*********************************千百十个四位显示▼▼{xiaoshu=zh*10;xshu=xiaoshu%10;if(xshu>=1) //******************************判断是否存在小数点▼{if(shu/100>=1)//(判断有没有百位){bai=shu/100;shi=shu%100/10;ge=shu%100%10;while(1){display(bai);delay(2);display3(shi);delay(2);display2(ge);delay(2);display2(18);delay(2);display1(xshu);delay(2);}}//if(shu/100else if(shu/10>=1)//(判断有没有十位){shi=shu/10;ge=shu%10;while(1){display3(shi);delay(2);display2(ge);delay(2);display2(18);delay(2);display1(xshu);delay(2);}}//else if(shu/10else if(shu/1>=1){ge=shu/1;while(1){display2(ge);delay(2);display2(18);delay(2);display1(xshu);delay(2);}}//else if(shu/1else{while(1){display2(18);delay(2);display1(xshu);delay(2);} }}//if(xshu //******************************判断是否存在小数点▲else //第一个if对应的else{if(shu/1000>=1)//(判断有没有千位){qian=shu/1000;bai=shu%1000/100;shi=shu%1000%100/10;ge=shu%1000%100%10;while(1){display(qian);delay(2);display3(bai);delay(2);display2(shi);delay(2);display1(ge);delay(2);}}//if(qianelse if(shu/100>=1)//(判断有没有百位){bai=shu/100;shi=shu%100/10;ge=shu%100%10;while(1){display3(bai);delay(2);display2(shi);delay(2);display1(ge);delay(2);}}else if(shu/10>=1)//(判断有没有十位){shi=shu/10;ge=shu%10;while(1){display2(shi);delay(2);display1(ge);delay(2);}}else display1(shu);}//else} //【数显示】//****************************千百十个四位显示▲▲display5(shi,ge) //【定时】十个位显示,用于防止死循环的动态显示{EA=1;ET0=1;TMOD=0x01;TH0=(65536-100000)/256;//0.5s计数TL0=(65536-100000)%256;while(aa){display2(shi);delay(5);display1(ge);delay(5);TR0=1; //启动定时器TR0}display1(17);delay(300);display1(16);delay(300);display1(17);}//*********************【蜂鸣器鸣灭函数】**********************//void whbeep(){while(temp!=0xf0) //这段程序是检测按键是否被释放{temp=P3; //如果没有释放就一直等待并且temp=temp&0xf0;beep=0; //蜂鸣器一直响}beep=1; //释放后关闭蜂鸣器}//************************【主函数】*************************////**************【主要通过键盘检测等技术来实现】*************//void main(){i=0;j=0;display4(0);while(1){P3=0xfe; //●★●给P3.0 送低电平,其余为高电平,即1111 1110,以便检测第一列的四个键盘temp=P3; //把P3 口数据读回来temp=temp&0xf0;//把P3 口与11110000 相与while(temp!=0xf0)//当有键按下刚一定不相等,于是进入//下一步检测{delay(5); //软件延时去抖动temp=P3;temp=temp&0xf0;switch(temp) //因为我们刚才是将第一行置的低,在这里再判断是第几列{case 0xe0:num=1;i++; break; //如果temp=0xee 则为第一行和第一列的交叉点,由此我们知道是矩阵键盘上的第一个键被按下,我们给num=1case 0xd0:num=2;i++; break;case 0xb0:num=3;i++; break;case 0x70:num=4;i++; break;}whbeep();// 控制蜂鸣器的响delay(8); //延时while(temp!=0xf0); //软件松手检测if(j==0){if(i==1){a2=num;a2a1=a2;display1(a2a1);P1=0xfe;}//如果j=0,i=1,表示第一次输入,赋值给a2-》显示-》开第一个灯else {a1=num;a2a1=10*a2+a1; aa=4;display5(a2,a1);TR0=0;P1=0xfe;}//如果j=0,i=1,表示第二次次输入,赋值给a1-》关计数器-》显示-》开第一个灯}else{if(i==1){b2=num;b2b1=b2;display1(b2b1);P1=0xf8;}////如果j>=1,i=1,表示第一次输入,赋值给a2-》显示-》开第一个灯else {b1=num;b2b1=10*b2+b1; aa=4;display5(b2,b1);TR0=0;P1=0xf8;}//如果j>=1,i=2,表示第二次次输入,赋值给a1-》关计数器-》显示-》开第一个灯}}//while(temp!=0xf0)P3=0xfd; //●★●给P3.1 送低电平,其余为高电平,即1111 1101,以便检测第二列的四个键盘temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;switch(temp){case 0xe0:num=5;i++; break;//i自加作用为标记第一第二次输入,过程为i=1、2、0、1、2 。
项目报告 简易计算器 单片机汇编语言

项目报告三、简易计算器一、任务分析利用MOVC、DB指令编写程序。
用单片机实验箱来实现简易计算器的功能,实现的现象是“1+2=3”,是通过独立式按键来控制数码管来实现“1+2=3”的。
二、硬件电路图三、程序框图主程序:按键子程序:四、程序代码;显示1+2=3,效果”1+23“逐个数码管显示,数码管动态显示ORG 0000HAJMP MAINORG 0100HMAIN: MOV SP,#60HMOV DPTR,#TAB;---------------------------------M1: ACALL ANJIANMOV A,50HCJNE A,#0,M2AJMP M1;--------------------------------- M2: CJNE A,#1,M3MOV 20H,AMOV P1,#20HMOVC A,@A+DPTRMOV P0,AAJMP M1;----------------------------------- M3: CJNE A,#2,M4MOV P1,#10HMOVC A,@A+DPTRMOV P0,AAJMP M1;---------------------------------- M4: CJNE A,#3,M5MOV 21H,AMOV P1,#08HMOVC A,@A+DPTRMOV P0,AAJMP M1;---------------------------M5: MOV A,20HADD A,21HINC AMOV P1,#04HMOVC A,@A+DPTEMOV P0,AAJMP M1;------------------------ ANJIAN: MOV 50H,#0JB P2.0,J1ACALL DELAY10MSJB P2.0,J1AJ0: JNB P2.0,$ACALL DELAY10MSJNB P2.0,AJ0MOV 50H,#1RETJ1: JB P2.1,J2ACALL DELAY10MSJB P2.1,J2AJ1: JNB P2.1,$ACALL DELAY10MSJNB P2.1,AJ1MOV 50H,#2RETJ2: JB P2.2,J3ACALL DELAY10MSJB P2.2,J3AJ2: JNB P2.2,$ACALL DELAY10MSJNB P2.2,AJ2MOV 50H,#3RETJ4: JB P2.3,RETTACALL DELAY10MSJB P2.3,RETTAJ4: JNB P2.3,$ACALL DELAY10MSJNB P2.3,AJ4MOV 50H,#4RETT: RET;----------------------------DELAY10MS: MOV R5,#20L1: MOV R6,#250DJNZ R6,$DJNZ R5,L1RET;---------------------------TAB: DB 00H,06H,46H,5BH,4FHEND五、仿真效果按下k1键第一位数码管显示 1按下k2键第二位数码管显示+按下k3键第三位数码管显示2按下k4键第四位数码管显示1+2的值3六、心得体会在经过这次实验后,我发现在编程时必须先想好流程图不然在完美的程序也出不了结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NAME T11 单片机-- 简易计算器汇编程序;将键盘的KA10~KA12接8259的KA0~KA2;RL10~RL17接8255A的RL0~RL7 ; T11 8279键盘显示接口实验二CSEG AT 0000HLJMP STARTCSEG AT 4100HSTART: MOV DPTR,#00CFE9H ;8279命令字MOV A,#0D1H ;清显示MOVX @DPTR,ALOOP1: MOVX A,@DPTRANL A,#0FHJZ LOOP1 ;有键按下?没有则循环等待MOV A,#0A0H ;显示\消隐命令MOVX @DPTR,AMOV A,#40H ;读FIFO命令MOVX @DPTR,AMOV DPTR,#0CFE8H ;读键值MOVX A,@DPTRMOV R1,A ;保存键值加个FMOV DPTR,#0CFE9H ;写显示RAM命令MOV A,#80H ;选中LED1MOVX @DPTR,AMOV A,R1ANL A,#0FH ;取后半字节MOV DPTR,#TABMOVC A,@A+DPTR ;取段显码MOV DPTR,#0CFE8H ;写显示RAMMOVX @DPTR,AMOV DPTR,#0CFE9H ;写显示RAM命令LOOP2: MOVX A,@DPTR ;输入显示符号ANL A,#0FHJZ LOOP2 ;有键按下?没有则循环等待MOV A,#0A0H ;显示\消隐命令MOVX @DPTR,AMOV A,#40H ;读FIFO命令MOVX @DPTR,AMOV DPTR,#0CFE8H ;读键值MOVX A,@DPTRMOV R2,A ;保存键值MOV DPTR,#0CFE9H ;写显示RAM命令MOV A,#81H ;选中LED2MOVX @DPTR,AMOV A,R2ANL A,#0FH ;取后半字节MOV DPTR,#TABMOVC A,@A+DPTR ;取段显码MOV DPTR,#0CFE8H ;写显示RAMMOVX @DPTR,AMOV DPTR,#0CFE9H ;写显示RAM命令LOOP3: MOVX A,@DPTR ;第二个数ANL A,#0FHJZ LOOP3 ;有键按下?没有则循环等待MOV A,#0A0H ;显示\消隐命令MOVX @DPTR,AMOV A,#40H ;读FIFO命令MOVX @DPTR,AMOV DPTR,#0CFE8H ;读键值MOVX A,@DPTRMOV R3,A ;保存键值MOV DPTR,#0CFE9H ;写显示RAM命令MOV A,#82H ;选中LED3MOVX @DPTR,AMOV A,R3ANL A,#0FH ;取后半字节MOV DPTR,#TABMOVC A,@A+DPTR ;取段显码MOV DPTR,#0CFE8H ;写显示RAMMOVX @DPTR,AMOV DPTR,#0CFE9H ;写显示RAM命令LOOP4: MOVX A,@DPTR ;====ANL A,#0FHJZ LOOP4 ;有键按下?没有则循环等待MOV A,#0A0H ;显示\消隐命令MOVX @DPTR,AMOV A,#40H ;读FIFO命令MOVX @DPTR,AMOV DPTR,#0CFE8H ;读键值MOVX A,@DPTRMOV R4,A ;保存键值MOV DPTR,#0CFE9H ;写显示RAM命令MOV A,#83H ;选中LED4MOVX @DPTR,AMOV A,R4ANL A,#0FH ;取后半字节MOV DPTR,#TABMOVC A,@A+DPTR ;取段显码MOV DPTR,#0CFE8H ;写显示RAMMOVX @DPTR,AMOV DPTR,#0CFE9H ;写显示RAM命令CJNE R4,#0CEH,LOOP5 ;判断第四个输入是不是等于号jia: CJNE R2,#0cAH,jianMOV A,R1ANL A,#0FHMOV R1,AMOV A,R3ANL A,#0FHMOV R3,AMOV A,R1ADD A,R3LJMP XIANSHIjian: CJNE R2,#0cBH,chengMOV A,R1ANL A,#0FHMOV R1,AMOV A,R3ANL A,#0FHMOV R3,AMOV A,R1SUBB A,R3LJMP XIANSHIcheng:CJNE R2,#0CcH,CHUMOV A,R1ANL A,#0FHMOV R1,AMOV A,R3ANL A,#0FHMOV R3,AMOV A,R1MOV B,R3MUL ABLJMP XIANSHICHU: MOV A,R1ANL A,#0FHMOV R1,AMOV A,R3ANL A,#0FHMOV R3,AMOV A,R1MOV B,R3DIV ABLJMP XIANSHI ;第四个等于号运算LOOP5: MOVX A,@DPTR ;第二个数ANL A,#0FHJZ LOOP5 ;有键按下?没有则循环等待MOV A,#0A0H ;显示\消隐命令MOVX @DPTR,AMOV A,#40H ;读FIFO命令MOVX @DPTR,AMOV DPTR,#0CFE8H ;读键值MOVX A,@DPTRMOV R5,A ;保存键值MOV DPTR,#0CFE9H ;写显示RAM命令MOV A,#84H ;选中LED5MOVX @DPTR,AMOV A,R5ANL A,#0FH ;取后半字节MOV DPTR,#TABMOVC A,@A+DPTR ;取段显码MOV DPTR,#0CFE8H ;写显示RAMMOVX @DPTR,AMOV DPTR,#0CFE9H ;写显示RAM命令CJNE R5,#0CEH,LOOP6; panduandi五个是等于号MOV A,R4ANL A,#0FHMOV R4,AMOV A,R1ANL A,#0FHMOV R1,ACJNE R2,#0CAH,TIAO2 ;人为地忽略单位数减双位数MOV A,R3 ;加法,第二个是符号ANL A,#0FHMOV R3,AMOV B,#0AHMUL ABADD A,R4ADDC A,R1LJMP XIANSHITIAO2 :CJNE R2,#0CCH,TIAO4 ;人为地忽略分数MOV A,R3 ;乘法,第二个是符号ANL A,#0FHMOV R3,AMOV B,#0AHMUL ABADD A,R4MOV B,R1MUL ABLJMP XIANSHITIAO4 :CJNE R3,#0CAH,TIAO5;加法,第三个是符号MOV A,R2ANL A,#0FHMOV R2,AMOV B,#0AHMOV A,R1MUL ABADD A,R2ADDC A,R4LJMP XIANSHITIAO5 :CJNE R3,#0CBH,TIAO6;减法,第三个是符号MOV A,R2ANL A,#0FHMOV R2,AMOV B,#0AHMOV A,R1MUL ABADD A,R2SUBB A,R4LJMP XIANSHITIAO6 :CJNE R3,#0CCH,TIAO7;乘法,第三个是符号MOV A,R2ANL A,#0FHMOV R2,AMOV B,#0AHMOV A,R1MUL ABADD A,R2MOV B,R4MUL ABLJMP XIANSHITIAO7 : MOV A,R2 ;除法,第三个是符号ANL A,#0FHMOV R2,AMOV B,#0AHMOV A,R1MUL ABADD A,R2MOV B,R4DIV ABLJMP XIANSHILOOP6: MOVX A,@DPTR ;====ANL A,#0FHJZ LOOP6 ;有键按下?没有则循环等待MOV A,#0A0H ;显示\消隐命令MOVX @DPTR,AMOV A,#40H ;读FIFO命令MOVX @DPTR,AMOV DPTR,#0CFE8H ;读键值MOVX A,@DPTRMOV R6,A ;保存键值MOV DPTR,#0CFE9H ;写显示RAM命令MOV A,#85H ;选中LED6MOVX @DPTR,AMOV A,R6ANL A,#0FH ;取后半字节MOV DPTR,#TABMOVC A,@A+DPTR ;取段显码MOV DPTR,#0CFE8H ;写显示RAMMOVX @DPTR,AMOV DPTR,#0CFE9H ;写显示RAM命令MOV A,R1ANL A,#0FHMOV R1,AMOV A,R2ANL A,#0FHMOV R2,AMOV A,R4ANL A,#0FHMOV R4,AMOV A,R5ANL A,#0FHMOV R5,AMOV B,#0AHMOV A,R1MUL ABADD A,R2MOV R7,A ;把12放到R7MOV B,#0AHMOV A,R4MUL ABADD A,R5MOV R1,A ;把45放到R1CJNE R3,#0CAH,JIAN1MOV A,R7ADDC A,R1LJMP XIANSHIJIAN1: CJNE R3,#0CBH,CHENG1MOV A,R7SUBB A,R1LJMP XIANSHICHENG1:CJNE R3,#0CCH,CHU1MOV A,R7MOV B,R1MUL ABLJMP XIANSHICHU1: MOV A,R7MOV B,R1DIV ABLJMP XIANSHIXIANSHI: ;MOV R1,A;MOV DPTR,#00CFE9H ;8279命令字;MOV A,#0D1H ;清显示;MOVX @DPTR,A;MOV A,R1MOV R0,A ;jieguoSUBB A,#64H ;HE 100 BI JIAOJC DENG2 ;XIAOYU 100 TIAOMOV A,R0MOV B,#64H ;SAN WEI SHU QU BAI WEIDIV ABMOV R4,A ;BAI WEI SHU FANG R4MOV A,B ;QU BAI HOU YU SHU GEI aMOV B,#0AHDIV AB ;QU SHI WEIMOV R5,A ;SHI WEI FANG R5MOV R6,B ;GE WEI SHU FANG R6MOV DPTR,#0CFE9H ;写显示RAM命令BAI WEI DENGMOV A,#80H ;选中LED1MOVX @DPTR,AMOV A,R4ANL A,#0FH ;取后半字节MOV DPTR,#TABMOVC A,@A+DPTR ;取段显码MOV DPTR,#0CFE8H ;写显示RAMMOVX @DPTR,AMOV DPTR,#0CFE9H ;写显示RAM命令;MOV DPTR,#0CFE9H ;写显示RAM命令SHI WEI DENGMOV A,#81H ;选中LED2MOVX @DPTR,AMOV A,R5ANL A,#0FH ;取后半字节MOV DPTR,#TABMOVC A,@A+DPTR ;取段显码MOV DPTR,#0CFE8H ;写显示RAMMOVX @DPTR,AMOV DPTR,#0CFE9H ;写显示RAM命令;MOV DPTR,#0CFE9H ;写显示RAM命令GE WEI DENGMOV A,#82H ;选中LED3MOVX @DPTR,AMOV A,R6ANL A,#0FH ;取后半字节MOV DPTR,#TABMOVC A,@A+DPTR ;取段显码MOV DPTR,#0CFE8H ;写显示RAMMOVX @DPTR,AMOV DPTR,#0CFE9H ;写显示RAM命令;LJMP LOOP1DENG2 : MOV A,R0CLR C ;上面借位清0SUBB A,#0AHJC DENG3MOV A,R0MOV B,#0AHDIV ABMOV R4,A ;SHI WEI GEI R4MOV R5,B ;GE WEI GEI R5MOV DPTR,#0CFE9H ;写显示RAM命令SHI WEI DENGMOV A,#80H ;选中LED1MOVX @DPTR,AMOV A,R4ANL A,#0FH ;取后半字节MOV DPTR,#TABMOVC A,@A+DPTR ;取段显码MOV DPTR,#0CFE8H ;写显示RAMMOVX @DPTR,AMOV DPTR,#0CFE9H ;写显示RAM命令;MOV DPTR,#0CFE9H ;写显示RAM命令GE WEI DENGMOV A,#81H ;选中LED2MOVX @DPTR,AMOV A,R5ANL A,#0FH ;取后半字节MOV DPTR,#TABMOVC A,@A+DPTR ;取段显码MOV DPTR,#0CFE8H ;写显示RAMMOVX @DPTR,AMOV DPTR,#0CFE9H ;写显示RAM命令;LJMP LOOP1DENG3 : MOV A,R0MOV DPTR,#0CFE9H ;写显示RAM命令MOV A,#80H ;选中LED1MOVX @DPTR,AMOV A,R0ANL A,#0FH ;取后半字节MOV DPTR,#TABMOVC A,@A+DPTR ;取段显码MOV DPTR,#0CFE8H ;写显示RAMMOVX @DPTR,AMOV DPTR,#0CFE9H ;写显示RAM命令;LJMP LOOP1TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;段显码表db 7fh,6fh,77h,7ch,39h,5eh,79h,71hEND。