课程设计报告
( 20## -- 20## 年度第 1 学期)
名 称:微机原理及应用
题 目:8255/273实现六位简单计算器
院 系:控制与计算机工程学院
班 级: 自动化1201
学 号:
学生姓名:
指导教师:杨国田
设计周数:一周
同 组 人:
成 绩:
日期: 20##年 1 月 15日
一、设计思想阐述
将可编程外围接口芯片8255A 与键盘和六个数码管连接,通过对8255A 编程及对键盘的操作实现计算功能。键盘码包括数字0~9、运算符号“+” “-” “*” “/”“=”和清零“复位”键。 首先利用程序不断扫描件键盘是否有输入,如果没有就一直扫描,如果有就停止扫描,完成输入。通过键盘依次输入第一个运算数字、运算符号、第二个运算数字、“=”,在六个数码管上显示运算结果,期间数字输入有误可按“复位”键之后重新输入。
二、系统工作原理介绍
1、相关芯片介绍
1.1 8086处理器
8086是Intel系列的16位微处理器。现截取引脚说明如下:
当引脚接高电平时,CPU工作于最小方式(单处理器系统方式,适合于较小规模的应用)。此时,引脚功能如下:
(1)AD15~AD0:分时复用的存储器或端口的地址和数据总线。传送地址时为单向的三态输出,而传送数据时为双向三态输入/输出。
(2)IO/M存储器/输入、输出控制信号(输出、三态):它用于区分CPU当前是访问存储器还是访问输入/输出端口。高电表示访问存储器,说明当前要进行CPU与存储器之间的数据传送。低电平表示访问输入/输出设备。表示当前要进行CPU与I/O端口之间的数据传送。在DMA时,它被置为浮空。
(3)WR/LOCK(输出,低电平有效,三态): 信号有效,即为低电平时,表示CPU正在执行存储器或I/O写操作,在写周期中,WR在T2、T3、Tw期间都有效。在DMA时,WR被置为浮空。
(4)INTA:可屏蔽中断响应信号,输出,低电平有效。 CPU通过信号对外设提出的可屏蔽中断请求做出响应。为低电平时,表示CPU已经响应外设的中断请求,即将执行中断服务程序。
(5)ALE:地址锁存允许信号,输出,高电平有效。 CPU利用ALE信号可以把AD15 ~AD0地址/数据、A19/S6~A16/S3地址/状态线上的地址信息锁存在地址锁存器中。
(5)DT:数据发送/接收信号,输出,三态。 DT/信号用来控制数据传送的方向。DT/为高电平时,CPU发送数据到存储器或I/O端口;DT/为低电平时,CPU接收来自存储器或I/O端口的数据。
(6)DEN:数据允许控制信号,输出,三态,低电平有效。信号用作总线收发器的选通控制信号。当为低电平时,表明CPU进行数据的读/写操作。
(7)HOLD:总线保持请求信号,输入,高电平有效。在DMA数据传送方式中,由总线控制器8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入到CPU,请求CPU让出总线控制权。
(8)HLDA:总线保持响应信号,输出,高电平有效。HLDA是与HOLD配合使用的联络信号。在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。
(9)RD:读控制信号,三态,输出。当RD=0时,表示CPU执行存储器或I/O端口的读操作。是对内存单元还是对I/O端口读取数据,取决于M/IO信号。在执行DMA操作时,RD被浮空。
(10)READY:“准备好”信号线,输入。该引脚接受被寻址的内存或I/O端口发给CPU的响应信号,高电平时表示内存或I/O端口已准备就绪,CPU可以进行数据传输。CPU在T3状态开始对READY信号采样。若检测到READY为低电平,表示内存或 I/O端口尚未准备就绪,则CPU在T3状态之后自动插入等待状态Tw,直到READY信号变为高电平,内存或I/O端口已准备就绪,CPU才可以进行数据传输。
1.2 8255A芯片
8255A芯片是Intel 8086/8088 系列的可编程外设接口电路(Programmable Peripheral Interface)简称 PPI,型号为8255(改进型为8255A及8255A-5),具有24条输入/输出引脚、可编程的通用并行输入/输出接口电路。它是一片使用单一+5V电源的40脚双列直插式大规模集成电路。8255A的通用性强,使用灵活,通过它CPU可直接与外设相连接。
8255A在使用前要写入一个方式控制字,选择A、B、C三个端口各自的工作方式,共有三种;
方式0 :基本的输入输出方式,即无须联络就可以直接进行的 I/O方式。其中A、B、C口的高四位或低四位可分别设置成输入或输出。
方式1 :选通I/O,此时接口和外围设备需联络信号进行协调,只有A口和B口可以工作在方式1,此时C口的某些线被规定为A口或B口与外围设备的联络信号,余下的线只有基本的I/O功能,即只工作在方式0.
方式2: 双向I/O方式,只有A口可以工作在这种方式,该I/O线即可输入又可输出,此时C口有5条线被规定为A口和外围设备的双向联络线,C口剩下的三条线可作为B口方式1的联络线,也可以和B口一起方式0的I/O线。
8255A是一个并行输入、输出器件,具有24个可编程设置的I/O口,包括3组8位的I/O为PA口、PB口、PC口,又可分为2组12位的I/O口:A组包括A口及C口高4位,B组包括B口及C组的低4位。
A口可以设置为方式0、方式1、方式2,B口与C口只能设置为方式0或方式1。
现截取引脚说明如下:
RESET:复位输入线,当该输入端外于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O 口均被置成输入方式。
PA0~PA7:端口A 输入输出线,一个8 位的数据输出锁存器/缓冲器, 一个 8 位的数据输入锁存器。
PB0~PB7:端口B 输入输出线,一个8 位的I/O 锁存器, 一个 8 位的输入输出缓冲器。
PC0~PC7:端口C 输入输出线,一个8 位的数据输出锁存器/缓冲器, 一个 8 位的数据输入缓冲器。端口C 可以通过工作方式设定而分成2 个4 位的端口, 每个 4 位的端口包含一个4 位的锁存器,分别与端口A 和端口B 配合使用,可作为控制信号输出或状态信号输入端口。
CS:片选信号线,当这个输入引脚为低电平时,表示芯片被选中,允许8255 与CPU 进行通讯。
RD:读信号线,当这个输入引脚为低电平时,允许8255 通过数据总线向CPU 发送数据或状态信息,即CPU 从8255 读取信息或数据。
WR:写入信号,当这个输入引脚为低电平时,允许CPU 将数据或控制字写8255。
D0~D7:三态双向数据总线,8255 与CPU 数据传送的通道,当CPU 执行输入输出指令时,通过它实现8 位数据的读/写操作,控制字和状态信息也通过数据总线传送。
8255 的读写控制:
8255 的读/写控制逻辑电路接受CPU 发来的控制口号RD、WR、RESET 和地址信号A1~A0。然后根据命令端口,控制信号的要求,将端口的数据读出选信CPU 或者将CPU送来的数据写入端口,各端口的工作状态。通过用输出指令对8255A 的控制字寄存器编程,写入设定工作方式的控制字,可以让3个数据口以不同的方式工作,端口A 可工作于3 种方式的任一种,端口B 只能工作于方式0 和方式1,端口C 除了用于输入输出端口外,还能配合A 口和B 口工作,为这两个端口的输入输出操作提供联系信号。
1.3 74LS138译码器
(1)当选通端S1、S2、S3为有效时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。比如:A2A1A0=110时,则Y6输出端输出低电平信号。
(2)若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。
(3)可用在8086的译码电路中,扩展内存。
1.4 74LS273
(1)MR为使能端,为低电平时,可传送数据。
(2)D0-D7是数据输入端,Q0-Q7是锁存数据输出端。
(3)CLK是时钟输入端,在一个信号的上升沿,锁存数据在使用74LS273时,应注意由于8086的数据是下降沿有效的,应在CLK输入端加一个反相器。
2、
TPC-1 型16位微机实验培训系统介绍
2.1 系统说明
TPC-1系统是一个16位微机实验培训系统试验台。该实验台由一块PC总线驱动板、一根60芯扁平电缆和一个实验箱组成,实验前,三者已经安装完成,其中PC总线驱动板位于微机内部,其引出线在计算机后面,60芯扁平电缆由此引出后,连接到实验箱,所有硬件实验都要通过该实验箱进行,相应的软件在PC机上调试、运行。实验箱所需电源由PC机内部提供,打开PC主机电源,实验箱指示灯亮即可进行实验。
实验台上 I/O地址为 200~23F共 64个,分 8个插孔引出,它们分别是 200~207;
208~20F;210~217;218~21F;220~227;228~22F;230~237;238~23F;实验时只要用导线将任一插孔信号引到相应电路的端即可。
一般PC机内部RAM为640K,占用存储器空间为00000H-9FFFFH,而A0000H-BFFFFH为保留区。因此,TPC-1系统实际使用的存储空间为这一部分的保留区,然而其他系统会以这部分保留区作为图像处理的存储空间,为了避免冲突,我们使用DOS系统。
2.2 工作原理
关于六位计算器设计需要使用的相关芯片主要有一片D8255A、两片74LS273、由三个两位七段数码管组成的六位数码管以及两片段驱动芯片、三片位驱动芯片和一片总线驱动芯片。其中驱动芯片主要起隔离和保护的作用。
主要的工作原理如下:
以微机的处理器代替8086芯片作为6位计算器的处理器,处理器通过60芯扁平线缆对系统进行寻址和访问。系统总线分别连接到两片74LS273锁存器和D8255A的D端口上。这里我们选择200~207连接到D8255A的片选接口,而208~20F接到了74LS27上作为寻址接口。因此,D8255A的A、B、C、D口的地址分别为200、201、202、203;而两片74LS273中段寄存器的地址为208,位寄存器的地址为209。
2.2.1 键盘
键盘为4x6共24键分布,以8255的A口和B口作为键盘的行列扫描和输入端口,其中D8255A的PA0~PA7作为行扫描,PB0~PB2作为列扫描,如下图所示。在运行时,D8255A的A、B口同时对键盘进行扫描,当某一按键按下时,对应的端口将输入低电平,此时低电平信号回送到处理器中识别为相应的按键信号,便完成了键盘的输入过程。
2.2.2 数码管
键盘输入的信号经过处理器处理之后,将寻址到208,209两个寄存器中存储,其中段寄存器接收到关于a,b,c,d,e,f,g,dp的信号并通过段驱动器分别送到三个数码管的相应接口;同时,位寄存器接收到的6位信号通过位驱动送到数码管的接口上。这样,相对应的LED管便会被点亮,从而完成了输出显示的过程。
通过仿真软件(proteus),我们将系统中涉及到的主要芯片及原理复现出来,如下:
3六位计算器设计流程图
4、 键盘原理
计算机对键盘进行两次扫描。
第一次扫描将PC0~PC3输出为低电平,PA0~PA3作为输入线,检测其是否有一个低电平。若没有任一低电平,则继续执行第一次扫描;若有低电平,则应用程序检测是否为扰动。(延时10~20ms后再去判断是否还为低电平,若低电平消失则表明为扰动,若低电平仍在,则确认有键按下。)接着执行第二次逐行扫描。先扫描第0行,使C口输出为PC0=0,PC1=1,PC2=1,PC3=1,然后从A口读入,判断是否有低电平,若有,则可识别出0行哪一列有按键按下,若没有则重新使C口输出,使PC0=1,PC1=0,PC2=1,PC3=1,再次从A口读入。按照此方法进行判断,直至扫描秒完所有4行,总可以找到按下的按键。再根据获得的行和列的数据进行计算,算得键值,从而根据键号去执行该键对应的子程序。(键值=行号*4+列号)
5、仿真电路图
三、个人总结
整整五天的微机原理课设过后,真真正正的体会到了自己需要学习的东西还有太多太多。
从开始阶段的资料收集,到真正开始涉及到设计的每一步的过程中,我们处处发现自己对这门课程的了解实在太少。首先就是对课内所学内容的理解不够深入透彻,导致在设计的过程中无法与书本知识相联系。其次就是对于实际的情况与书本的结合不够了解,现实中很简单的问题在实际设计过程中却困难重重。而且在整个制作过程中,我们遇到了很多错误,出现错误时,在更改的过程,体会其中的种种困难,了解到了难点的地方,这对于我们学习计算机硬件方面的课程有着很大的帮助,同时对于之前的几次试验我们操作机器的实验理解、总结也更加的深刻了。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
这个课程设计,在做的过程中遇到过很多难题,还是要感谢老师和同学的大力辅导和帮助,还有一些有关书籍的帮忙,我们通过课程设计学习到了很多很多与微机相关的知识,这是在课堂中无法获得的。
四、参考文献
[1]李继灿,新编16/32位微型计算机原理及应用,清华大学出版社,第5版,2013
[2]杨国田,TPC-1型16位微机实验培训系统指导书,华北电力大学校内版
附录
程序
DATA SEGMENT
NUMB0 DB 6 DUP(0) ;存放第一个数据值
NUMB1 DB 6 DUP(0) ;存放第二个数据值
RESULT DB 12 DUP(0) ;存放运算结果
S DB 0 ;存放运算符号值
E DB 0 ;按下等号键标记
CC DB 0 ;存放运算数据位数
H DB 0 ;存放按键行号
L DB 0 ;存放按键列号
DISCODE DB 40H,79H,24H,30H,
19H,12H,02H,78H,
00H,10H,0FFH,0FFH,
0FFH,0FFH,0FFH,86H
;段码表
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,90H ;设置为A口输入,B口输出,C口输出
OUT 46H,AL
KKK: CALL KEY ;扫描按键
JMP KKK ;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号
KEY PROC
CHECK: CALL DISP ;等待按键按下的同时进行显示
MOV AL,0F0H ;所有行输出低电平
OUT 44H,AL
IN AL,40H
CMP AL,0FFH ;读列值
JZ CHECK ;若都为高电平则无键按下,等待
MOV CX,50
LOOP $ ;延时消抖
IN AL,DX ;重读列值
CMP AL,0FFH
JZ CHECK ;无键按下一直等待
MOV H,0 ;有键按下,先把行列号变量清0
MOV L,0
MOV BL,01H
MOV BH,0FEH ;扫描法读键值:从第一行开始测试,即PC0输出低电平
NEXT: MOV AL,BH
OUT 44H,AL
NEXTH: IN AL,40H ;读列值,判断是第几列有键按下
TEST AL,BL ;从第一列开始判断
JZ WAIT0
ROL BL,1
CMP BL,10H ;当前行状态下没有列有键按下,则转为对下一行的测试
JZ NEXTL
INC H ;每判断一列,列号加1
JMP NEXTH ;再对下一列进行判断
NEXTL: MOV H,0
MOV BL,01H
ROL BH,1 ;对下一行测试,让下一个PC口输出低电平
CMP BH,0EFH
JZ EXIT
INC L
JMP NEXT
WAIT0: IN AL,40H ;若有键按下,则等该按键松开后再计算键值
CMP AL,0FFH
JNZ WAIT0
MOV CX,50
LOOP $ ;延时消抖
IN AL,40H
CMP AL,0FFH
JNZ WAIT0
CALL KEYVALUE ;调计算键值子程序
EXIT: RET
KEY ENDP
;以下为计算键值子程序,通过行列号计算键值(键值=行号*4+列号)键值存放在DL寄存器中
KEYVALUE PROC
PUSH BX
PUSH AX
MOV DL,L
MOV DH,H
SHL DL,1
SHL DL,1 ;列号乘4
ADD DL,DH
CMP DL,9 ;按下的是数字键
JNG NUM_CALL
CMP DL,14
JL CONT_CALL ;按下的是运算键
CMP DL,14
JZ OUTP_CALL ;按下的是等于键
CMP DL,15
JZ CLR_CALL ;按下的是清除键
NUM_CALL: CALL NUMBER ;调数字键处理子程序
JMP EXIT1
CONT_CALL:
MOV S,DL ;存放运算键的键值
MOV E,0
MOV CX,6
LEA SI,NUMB0
LEA DI,NUMB1
LL:
MOV AL,[DI]
MOV [SI],AL
MOV AL,0
MOV [DI],AL
INC DI
INC SI
LOOP LL
JMP EXIT1
OUTP_CALL: CALL OUTP ;调等号键处理子程序
JMP EXIT1
CLR_CALL: CALL CLEAR ;调清除键处理子程序
EXIT1:
POP AX
POP BX
RET
KEYVALUE ENDP
;以下为清除键处理子程序,按下清除键后,变量全部清0
CLEAR PROC
MOV CX,6
MOV SI,0
AA:
MOV NUMB0[SI],0
MOV NUMB1[SI],0
MOV RESULT[SI],0
MOV RESULT[SI+6],0
INC SI
LOOP AA
MOV CC,0
RET
CLEAR ENDP
;以下为等号键处理子程序,根据运算符号,调用相应的运算子程序;
OUTP PROC
PUSH AX
PUSH DX
PUSH BX
INC E
CMP S,10
JZ ADD_CALL ;运算符为加号,则调用加法子程序
CMP S,11
JZ SUB_CALL ;运算符为减号,则调用减法子程序
CMP S,12
JZ MUL_CALL ;运算符为乘号,则调用乘法子程序
CMP S,13
JZ DIV_CALL ;运算符为除号,则调用除法子程序
ADD_CALL: CALL ADDP
JMP STORE1
SUB_CALL: CALL SUBP
JMP STORE1
MUL_CALL: CALL MULP
JMP STORE1
DIV_CALL: CALL DIVP
STORE1:
MOV SI,0
MOV CX,6
BB:
MOV AL,RESULT[SI]
MOV NUMB1[SI],AL
INC SI
LOOP BB
POP BX
POP DX
POP AX
RET
OUTP ENDP
;以下为数字键处理子程序
;该程序,将输入的数据按位存放在NUMB1变量中,并由CC记录数据的位数
NUMBER PROC
PUSH BX
PUSH AX
CMP E,1
JNZ CONTINUE
MOV E,0
CALL CLEAR
CONTINUE:
CALL BITP
CMP CC,0 ;目前数据为0位,即没有数据,则转到SSS
JZ SSS
MOV SI,5
EE:
MOV AL,NUMB1[SI-1]
MOV NUMB1[SI],AL
DEC SI
CMP SI,0
JNZ EE
SSS:
MOV NUMB1[0],DL ;将当前键入的数据存放到NUMB1的最低位
INC CC ;数据位数加1
CMP CC,6 ;判断数据位数
JNG EXIT2
MOV CC,0 ;如果数据超过6位,重新从最低位开始存放
MOV NUMB1[5],0
MOV NUMB1[4],0
MOV NUMB1[3],0
MOV NUMB1[2],0
MOV NUMB1[1],0
MOV NUMB1[0],0
EXIT2:
POP AX
POP BX
RET
NUMBER ENDP
;加法程序
ADDP PROC
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV BX,0
MOV CX,6
MOV DX,0 ;初始化
ADD2:
MOV AX,0
MOV AL,NUMB0[BX]
ADD AL,NUMB1[BX] ; 先两数相加
AAA ;十进制转换
MOV DH,AH
MOV AH,0
ADD AL,DL ;再加低位进位
AAA
ADD DH,AH
MOV DL,DH ;保护进位
MOV RESULT[BX],AL
INC BX
LOOP ADD2
CMP DL,1
JZ YC ;溢出
JMP GG
YC: MOV CX,5
MOV SI,5
PP1:MOV RESULT[SI],0H
DEC SI
LOOP PP1
MOV RESULT[0],0FH
GG:
POP AX
POP BX
POP CX
POP DX
RET
ADDP ENDP
;减法程序
SUBP PROC
PUSH DX
PUSH CX
PUSH BX
PUSH AX
LEA SI,NUMB0+5
LEA DI,NUMB1+5
MOV CX,6
AP: MOV AL,[SI]
CMP AL,[DI]
JNZ XP
DEC SI
DEC DI
LOOP AP ;从高位找出第一位不相同的数的下标
XP: MOV AL,[SI]
CMP AL,[DI]
JA FUZHI
JB CHG
FUZHI: ;正常赋值
LEA SI,NUMB0
LEA DI,NUMB1
JMP SUB2
CHG: ;交换赋值
LEA SI,NUMB1
LEA DI,NUMB0
SUB2: ;减法开始
MOV BX,0
MOV CX,6
MOV DX,0
MOV AH,0 ;初始化
SUB1:
MOV AH,0
MOV DH,0
MOV AL,[SI]
SUB AL,[DI]
AAS ;两数相减
CMP AH,0FFH ;判断是否有借位
JNZ HH ;无则跳转
MOV DH,1 ;有则给DH赋1,即借位符
HH: MOV AH,0
SUB AL,DL ;减去后一位的借位
AAS
CMP AH,0FFH ;判断此次运算是否有借位
JNZ II ;无则跳转
MOV DH,1 ;有则给DH赋1,即借位符
II: MOV DL,DH ;将借位放入DL保护
MOV RESULT[BX],AL
INC BX
INC SI
INC DI
LOOP SUB1 ;减法结束
POP AX
POP BX
POP CX
POP DX
RET
SUBP ENDP
;乘法程序
MULP PROC
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV SI,0
MUL2: ;乘法开始,亦是大循环开始
MOV AX,0 ;初始化
MOV BX,0
MOV CX,6
MOV DX,0
MOV DI,SI
WP: MOV AH,0 ;小循环开始
MOV AL,NUMB0[BX]
MUL NUMB1[SI]
AAM
MOV DH,AH ;DH保护进位
MOV AH,0
ADD AL,DL ;加上后一位的进位
AAA
ADD DH,AH ;DH保护进位
MOV AH,0
ADD AL,RESULT[DI] ;加上结果里已有的数
AAA
MOV RESULT[DI],AL
ADD DH,AH ;DH保护进位
MOV DL,DH ;DL保护进位
INC BX
INC DI
LOOP WP ;小循环结束
ADD RESULT[DI],DL ;小循环做完后,保护最高位
INC SI
CMP SI,6
JNE MUL2 ;大循环结束
MOV SI,12
DP: DEC SI ;判定溢出
CMP RESULT[SI],0
JZ DP
CMP SI,5
JA YC1 ;溢出
JMP FF
YC1:MOV CX,5 ;溢出赋值段
MOV SI,5
PP: MOV RESULT[SI],0H
DEC SI
LOOP PP
MOV RESULT[0],0FH ;溢出赋值段结束
FF: POP AX
POP BX
POP CX
POP DX
RET
MULP ENDP
;除法程序
DIVP PROC
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV SI,5
MOV CX,6 ;初始化
LP: CMP NUMB1[SI],0
JNZ WT
DEC SI
LOOP LP ;确定除数有几位
WT: MOV DX,SI
CMP DX,0FFFFH
JZ YC2 ;除数位0,则溢出
CMP DX,5
JZ CMP1 ;当除数为6位时,不用移位,直接相减
MOV CX,5
SUB CX,DX
PUSH DX
LP1: MOV BX,DX
LP2: MOV AL,NUMB1[BX]
MOV NUMB1[BX+1],AL
DEC BX
CMP BX,0FFFFH
JNZ LP2 ;移位
INC DX
LOOP LP1
POP DX
MOV CX,5
SUB CX,DX
MOV BX,0
LP3: MOV NUMB1[BX],0
INC BX
LOOP LP3 ;低位赋0
CMP1: LEA SI,NUMB0+5
LEA DI,NUMB1+5
MOV CX,6
CMP2: MOV AL,[SI]
CMP AL,[DI] ;比较NUMB0与NUMB1的大小
JA JF ;大于,相减
JB FZ ;小于,往右移一位
DEC SI
DEC DI
DEC CX
JNZ CMP2
JF: LEA SI,NUMB0 ;减法开始
LEA DI,NUMB1
PUSH DX
MOV BX,0
MOV CX,6
MOV DX,0
MOV AH,0
DIV1:
MOV AH,0
MOV DH,0
MOV AL,[SI]
SUB AL,[DI]
AAS
CMP AH,0FFH
JNZ JJ
MOV DH,1
JJ: MOV AH,0
SUB AL,DL
AAS
CMP AH,0FFH
JNZ MM
MOV DH,1
MM: MOV DL,DH
MOV NUMB0[BX],AL
INC BX
INC SI
INC DI
LOOP DIV1
POP DX
MOV BX,5
SUB BX,DX
INC RESULT[BX] ;每减一次,对应RESULT的数加1
JMP CMP1 ;减法结束
FZ: INC DX ;移位过程的初始化
CMP DX,6
JZ ZT ;停止符号
MOV BX,1
YW1: MOV AL,NUMB1[BX] ;将除数向右移一位
MOV NUMB1[BX-1],AL
INC BX
CMP BX,6
JNZ YW1
MOV NUMB1[5],0
JMP CMP1 ;移位结束
YC2: MOV CX,5
MOV SI,5
PP2:MOV RESULT[SI],0H
DEC SI
LOOP PP2
MOV RESULT[0],0FH
ZT:
POP AX
POP BX
POP CX
POP DX
RET
DIVP ENDP
;显示子程序 ,将NUMB1中的数值按位显示出来
DISP PROC
PUSH BX
PUSH AX
MOV BH,0
LEA SI,DISCODE
CALL BITP ;测试NUMB1位数
MOV AL,80H
OUT 46H,AL
CMP CC,6
JZ SHIWAN
CMP CC,5
JZ WAN
CMP CC,4
JZ QIAN
CMP CC,3
JZ BAI
CMP CC,2
JMP SHI
SHIWAN: MOV AH,00000001B ;从第6位开始显示
MOV AL,AH
OUT 42H,AL
MOV BL,NUMB1[5]
MOV AL,[SI+BX]
OUT 40H,AL
CALL DELY
WAN: MOV AH,00000010B ;从第5位开始显示
MOV AL,AH
OUT 42H,AL
MOV BL,NUMB1[4]
MOV AL,[SI+BX]
OUT 40H,AL
CALL DELY
QIAN: MOV AH,00000100B ;从第4位开始显示
MOV AL,AH
OUT 42H,AL
MOV BL,NUMB1[3]
MOV AL,[SI+BX]
OUT 40H,AL
CALL DELY
BAI: MOV AH,00001000B ;从第3位开始显示
MOV AL,AH
OUT 42H,AL
MOV BL,NUMB1[2]
MOV AL,[SI+BX]
OUT 40H,AL
CALL DELY
SHI: MOV AH,00010000B ;从第2位开始显示
MOV AL,AH
OUT 42H,AL
MOV BL,NUMB1[1]
MOV AL,[SI+BX]
OUT 40H,AL
CALL DELY
GGG: MOV AH,00100000B ;从第1位开始显示
MOV AL,AH
OUT 42H,AL
MOV BL,NUMB1[0]
MOV AL,[SI+BX]
OUT 40H,AL
CALL DELY
EXIT4:
MOV AL,90H
OUT 46H,AL
POP AX
POP BX
RET
DISP ENDP
;分析数据位数子程序
BITP PROC
CMP NUMB1[5],0 ;如果NUMB1[5]不为0,则数据为6位数
JNZ SIXBIT
CMP NUMB1[4],0 ;如果NUMB1[4]不为0,则数据为5位数
JNZ FIVEBIT
CMP NUMB1[3],0 ;如果NUMB1[3]不为0,则数据为4位数
JNZ FOURBIT
CMP NUMB1[2],0 ;如果NUMB1[2]不为0,则数据为3位数
JNZ THREEBIT
CMP NUMB1[1],0 ;如果NUMB1[1]不为0,则数据为2位数
JNZ TOWBIT
CMP NUMB1[0],0 ;如果NUMB1[0]不为0,则数据为1位数
JNZ ONEBIT
JMP ZER0BIT ;否则,没有数据
SIXBIT: MOV CC,6
JMP EXIT5
FIVEBIT: MOV CC,5
JMP EXIT5
FOURBIT: MOV CC,4
JMP EXIT5
THREEBIT: MOV CC,3
JMP EXIT5
TOWBIT: MOV CC,2
JMP EXIT5
ONEBIT: MOV CC,1
JMP EXIT5
ZER0BIT: MOV CC,0
EXIT5: RET
BITP ENDP
;延时子程序
DELY PROC
PUSH CX
MOV CX,100
LOOP $
POP CX
RET
DELY ENDP
CODE ENDS
END START