
A37基于51单片机汇编语言简易计算器Proteus设计
用51单片机汇编语言做一个三位数计算器:4×4矩阵键盘输入数字和加减乘除,5位数码管通过串行移位的方式显示,能连续运算、能检测溢出、能一键清零。整个程序不用任何专用外设,全靠查表和加减乘除四条指令。
一、设计实现功能
本设计功能简介:使用51单片机和汇编语言设计一个简易计算器的proteus仿真,要求以下功能:
1、使用汇编语言编写程序。
2、4×4矩阵键盘输入0~9、+、-、*、/、=、清除共16个键。
3、支持三位数以内的加减乘除,可连续运算(上次结果直接参与下次计算)。
4、5位数码管显示输入值和运算结果,溢出时自动清零。
二、资源汇总
1、仿真文件:Proteus工程,7.8和8.6两个版本都能直接打开。
2、程序文件:main.asm汇编源码,以及编译好的cx.hex。
3、修改日期小工具:购买资料后赠送,用于修改文件创建日期,下载地址在文章最后。
三、设计介绍
拿到压缩包之后先解压,没有解压软件的直接搜"压缩",下载解压软件后先解压文件,再运行仿真和程序。
图1 Proteus仿真总览

键盘接P1,高4位做行扫描、低4位读列,键值0~15依次对应:0~9数字、10加、11减、12乘、13除、14等号、15清除。三字节的键码表放在程序尾部,扫描到哪一位就返回对应的键值。
显示部分没有用并行段码,而是串行移位送出去的:
`asm
DISP: MOV R0,#DBUF ;30H~34H是5位显示缓存
MOV R1,#TEMP+4
MOV R2,#5
DP10: MOV DPTR,#SEGTAB
MOV A,@R0
MOVC A,@A+DPTR ;段码查表
MOV @R1,A
INC R0
DEC R1
DJNZ R2,DP10
MOV R0,#TEMP
MOV R1,#5
DP12: MOV R2,#8
MOV A,@R0
DP13: RLC A ;带进位左移,一位一位往外送
MOV DIN,C ;P3.0数据
CLR CLK ;P3.1时钟
SETB CLK
DJNZ R2,DP13
INC R0
DJNZ R1,DP12
RET`
RLC A把段码的最高位顶进CY,再送到P3.0,给一个时钟脉冲,移位寄存器就收一位,8位送完一个字节,5个字节送完5位数码管全部刷新。这种方式省IO,两位引脚就能带5位数码管。
输入和运算的状态机由R3记录:按第1个数是个位、第2个是十位、第3个是百位,第4个数字直接判溢出清零。三位数的拼接就是乘10加新数:
`asm
E13: MOV R7,A
MOV B,#10
MOV A,R4
MUL AB ;老值×10
JB OV,E3 ;乘法溢出
ADD A,R7 ;加新数字
JB CY,E3 ;加法进位溢出
MOV R4,A`
按功能键时,程序把当前功能键和上一次的功能键交换,先算上一次的运算再记下这一次的——这就是"连续运算"能成立的原因:按12+34+,第二次按加号的那一刻,12+34先算出来,结果51留在YJ里,等着加下一个数。
四种运算各有一个分支,都用溢出标志兜底:
| 运算 | 指令 | 判断 |
| 加法 | ADD A,R4 | JB CY 溢出 |
| 减法 | SUBB A,R4 | JB CY 负数也算溢出 |
| 乘法 | MUL AB | JB OV 结果超255 |
| 除法 | DIV AB | 结果取整数部分 |
因为只用8位累加器,一次运算的结果最大255,所以乘法和加法很容易溢出,溢出就直接跳E3全清。除法是整除,7÷2得3,没有小数——这是这套方案的天花板,想算小数得换成多字节定点或BCD运算。
特别注意: 按键不响应或者一直出同一个数,先看P1的低4位有没有上拉,键盘是"行输出列输入",P1高4位做输出时低4位必须是输入态;显示乱码,检查串行送数的顺序,程序是先从TEMP+4往TEMP倒着查表的,接的是"高位先出",移位寄存器级联顺序反了就会左右颠倒;按下等号没反应,是上一次没按功能键(GONG=0),程序里FIRST分支只在第一次按功能键时把输入值直接送结果;减法出负数会整个清零,这是程序的设计,不是bug;仿真里数码管用74HC595级联,5片串起来,第一片的Q7'接下一片的DS。
四、日期修改
资料中提供修改日期的小工具,购买资料赠送修改文件创建日期的小工具,三个下载地址都在文章最后。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

