微机课设

时间:2024.5.15

 

课程设计报告

( 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 口均被置成输入方式。

PA0PA7:端口A 输入输出线,一个8 位的数据输出锁存器/缓冲器, 一个 8 位的数据输入锁存器。

PB0PB7:端口B 输入输出线,一个8 位的I/O 锁存器, 一个 8 位的输入输出缓冲器。

PC0PC7:端口C 输入输出线,一个8 位的数据输出锁存器/缓冲器, 一个 8 位的数据输入缓冲器。端口C 可以通过工作方式设定而分成2 个4 位的端口, 每个 4 位的端口包含一个4 位的锁存器,分别与端口A 和端口B 配合使用,可作为控制信号输出或状态信号输入端口。

CS:片选信号线,当这个输入引脚为低电平时,表示芯片被选中,允许8255 与CPU 进行通讯。

RD:读信号线,当这个输入引脚为低电平时,允许8255 通过数据总线向CPU 发送数据或状态信息,即CPU 从8255 读取信息或数据。

WR:写入信号,当这个输入引脚为低电平时,允许CPU 将数据或控制字写8255。

D0D7:三态双向数据总线,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

更多相关推荐:
微机原理课程设计总结,手抄版

微机原理课程设计总结以前从没有学过关于汇编语言的知识,起初学起来感觉很有难度。当知道要做课程设计的时候心里面感觉有些害怕和担心,担心自己不会或者做不好,但是但是当真的要做的时候也只好进自己最大的努力去做,做到自…

微机原理与接口技术及其课程设计心得体会

微机原理与接口技术及其课程设计心得体会本学期的微机原理和接口技术及其课程设计都已经结束。在这个过程中,我们有所付出,也有所回报,让我感受颇多。对于《微机原理与接口技术》这门课程而言,初学时,感觉摸不着头绪。面对…

微机原理课程设计总结

南京航空航天大学微机原理课程设计数据采集系统中断法微机原理课程设计数据采集系统中断法南京航空航天大学微机原理课程设计数据采集系统中断法一课设目的进一步掌握微机原理知识了解微机在实时采集数据的应用学习掌握编程和程...

微机原理课程设计总结

微机原理课程设计总结以前从没有学过关于汇编语言的知识,起初学起来感觉很有难度。当知道要做课程设计的时候心里面感觉有些害怕和担心,担心自己不会或者做不好。但是当真的要做的时候也只好进自己作大的努力去做,做到自己最…

计算机网络课设总结

课设总结通过此次短暂的课程设计,我深有感触。从一开始的构思再到今天写下这份总结。期间时间虽短但是也学到了不少的知识。在实训的刚开始构想只有大体的思路,忽略了一些细节,因此在我真正做设计网络方案时发现有很多错误,…

计算机组成原理课程设计个人总结

这次课程设计是在已学计算机组成原理基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。因此,要求学生能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的…

计算机硬件课程设计总结

信息A0911班01号颜娇指导老师张伟艳硬件类课程设计总结与心得在这次为期一礼拜的实训课程中最基本的是让我又学会了一种软件的基本用法并且也对一些基本的物理知识得到扩展知道了一些基本工具之间的差别在这一星期内我们...

小学微机课工作总结

小学微机课工作总结,内容附图。

微机课设

太原理工大学现代科技学院微机原理与接口技术课程设计姓名班级自动学号目录题目1设计目的1设计要求1主要技术指标1课程设计课题的分析1实验代码3实验现象9课程设计的心得与体会11题目计算机仿真电子琴一设计目的本课程...

微机课程设计

河南理工大学单片机应用与仿真训练设计报告四路定时控制器姓名学号专业班级指导老师所在学院万方科技学院20xx年6月5日目录目录1摘要21概述311单片机内部资源312四路定时器的基本功能313系统的原理314实际...

新微机课设1

微机原理与接口技术课程设计大纲课程编号课程名称微机原理与接口技术课程设计周数学分一周1个学分先修课程数字电路模拟电路微机原理与接口技术适应专业电子信息工程电气工程及其自动化等开课单位电子信息工程系电子信息教研室...

计算机PR课程设计小结

平时作品论文本次设计制作的多媒体作品的主要内容是上海的影像大致上分为两个板块介绍上海风景和人文风景上又分为了现代与古典两个部分而在现代和古典中分别用日景和夜景的图片描述人文的部分没有使用静态的图片而是动态的影像...

微机课设总结(21篇)