基于8086/微机原理的计算器系统仿真设计 实现功能: 1、实现加减乘除运算,并通过四位一体数码管显示 2、清零功能 包含仿真+源码 仿真软件:Proteus8.9 编程软件:Masm for Windows 2015 编程语言:汇编
掀开Proteus的深蓝色界面,在元件库里翻出8086芯片那一刻,就知道这注定是个要和机器码死磕的夜晚。今天咱们要折腾的是用汇编在8086上搓个带数码管显示的计算器,别看现在满大街都是计算器APP,用机器语言驱动七段数码管可比手机划屏刺激多了。
先甩张Proteus设计图镇楼:核心是8086带着8255A扩展IO,四位共阴数码管接在8255的PA口做段选,PB口位选。键盘矩阵接在PC口,这布局跟学校实验室里落灰的老设备一模一样。特别注意8255的片选接在0x0600,这地址后面写代码时得刻烟吸肺。
PORT_A EQU 0600H PORT_B EQU 0602H PORT_C EQU 0604H CTRL EQU 0606H初始化8255的代码简单粗暴,直接把控制字0x81拍进控制寄存器。这波操作让PA、PB口都工作在模式0输出,PC口上半部分输入,下半部分输出——刚好适配矩阵键盘的扫描需求。
键盘扫描是重头戏,这里用了个巧妙的行反转法:
SCAN_KEY: MOV AL, 0F0H OUT PORT_C, AL ; 高四位输出0,低四位输入 IN AL, PORT_C AND AL, 0FH ; 取低四位状态 CMP AL, 0FH JE NO_KEY ; 无按键则跳 CALL DELAY ; 消抖 ; 行扫描开始...这段代码先让PC口高四位输出低电平,然后读取低四位状态。当检测到有按键按下时,就逐行拉低每行电平,通过检测列线变化确定具体按键位置。调试时在这里卡过三次,最后发现是延时子程序不够长,导致快速扫描时出现鬼键。
运算核心部分藏着魔鬼细节。处理连续运算时得用两个缓存区:
NUM_BUFF DB 8 DUP(0) ; 输入缓冲区 OPERAND1 DW 0 ; 第一个操作数 OPERATOR DB ? ; 运算符暂存当按下运算符键时,先把缓冲区里的ASCII转成二进制数存到OPERAND1,然后清空缓冲区准备接收第二个数。这里栽过跟头——最开始忘记处理进位,导致12+34显示成46,后来加了个ADC指令才搞定。
基于8086/微机原理的计算器系统仿真设计 实现功能: 1、实现加减乘除运算,并通过四位一体数码管显示 2、清零功能 包含仿真+源码 仿真软件:Proteus8.9 编程软件:Masm for Windows 2015 编程语言:汇编
数码管动态扫描像在玩节奏游戏:
DISPLAY: MOV CX, 4 ; 四位扫描 MOV BL, 08H ; 从最高位开始 NEXT_DIGIT: MOV AL, [DI] ; 取显示数据 OUT PORT_A, AL ; 送段码 MOV AL, BL OUT PORT_B, AL ; 选位 ROR BL, 1 ; 右移选下一位 CALL DELAY_2MS ; 保持显示 LOOP NEXT_DIGIT RET这里必须精确控制每个数码管的点亮时间,2ms的延时是用8253定时器啃出来的。最开始手动写延时循环导致亮度不均,换成定时器中断后显示稳如老狗。
除法运算有个坑:当除数为零时不能直接崩,得让数码管疯狂闪烁报警。代码里插了段骚操作:
DIVIDE: CMP BX, 0 JNZ DO_DIV MOV ERROR_FLAG, 1 ; 触发错误状态 RET DO_DIV: XOR DX, DX DIV BX ; 后续处理...当检测到除零错误时,显示模块会进入狂暴模式——以0.5秒间隔全灭全亮,比直接显示"ERROR"带感多了。
源码包里藏着个彩蛋:长按C键三秒会进入十六进制显示模式,这功能原本是调试时用的后门,后来觉得有趣就保留下来了。实现原理是检测按键持续时间,用8253计时器累加时间戳,这波操作让按键处理代码膨胀了30行。
最后说个血泪教训:Proteus仿真时数码管亮度跟实物差距很大,调显示程序时以为是代码问题,盯着汇编逐句单步走了两小时,结果发现只是仿真器渲染效果问题——物理硬件亮得刺眼,仿真器上却像没睡醒。建议真机调试时备个墨镜,别问我是怎么知道的。