1、微机原理实验报告1.设计任务:根据微机原理课程所学相关知识及实验教程相关内容,在基于proteus 平台,使用汇编语言,以 8086 为核心的情况下,配合可编程并行接口器件 8255A,LED 数码管等器件实现可进行简单四位数加减乘除法及清零、乘方、对数、二进制转换等扩展功能的十进制计算器。2.需求分析:操控核心为微处理器 8086 芯片,可编程并行接口芯片 8255A对输入扫描的矩阵按键,显示模块 LED 数码管,其他辅助器件如74LS138 译码器、74LS373 等。3.总体方案(选择与论证)流程:第一步,确定键盘是否有输入(使用程序不断进行扫描) 。第二步,如果有输入就调用子程序进行判
2、断,是数值则进行存储并同时进行显示,是运算符号等就调用相应的子程序进行操作。第三步,继续扫描键盘是否有输入,从而实现 4 位十进制数以内的加减乘除法或者扩展功能运算。第四步,运算完成后将运算的结果储存并显示到 LED 显示器上。4.硬件设计实验中根据需求需以下器件:微处理器 8086 芯片当 引 脚 接 高 电 平 时 , CPU 工 作 于 最 小 模 式 。 此 时 , 引 脚 信 号 24 31 的 含 义及 其 功 能 如 下 : ( 1) IO/M/( memory I/O select) : 存 储 器 、 I/O 端 口 选 择 控 制 信 号 。 信号 指 明 当 前 CPU
3、是 选 择 访 问 存 储 器 还 是 访 问 I/O 端 口 。 为 高 电 平 时 访 问 存 储 器 ,表 示 当 前 要 进 行 CPU 与 存 储 器 之 间 的 数 据 传 送 。 为 低 电 平 时 , 访 问 I/O 端 口 ,表 示 当 前 要 进 行 CPU 与 I/O 端 口 之 间 的 数 据 传 送 。 ( 2) WR/( write) : 写 信 号 , 输 出 , 低 电 平 有 效 。 信 号 有 效 时 , 表 明 CPU正 在 执 行 写 总 线 周 期 , 同 时 由 信 号 决 定 是 对 存 储 器 还 是 对 I/O 端 口 执 行 写 操 作 。(
4、 3) INTA/( interrupt acknowledge) : 可 屏 蔽 中 断 响 应 信 号 , 输 出 , 低电 平 有 效 。 CPU 通 过 信 号 对 外 设 提 出 的 可 屏 蔽 中 断 请 求 做 出 响 应 。 为 低 电 平 时 ,表 示 CPU 已 经 响 应 外 设 的 中 断 请 求 , 即 将 执 行 中 断 服 务 程 序 。 ( 4) ALE( address lock enable) : 地 址 锁 存 允 许 信 号 , 输 出 , 高 电 平 有效 。 CPU 利 用 ALE 信 号 可 以 把 AD15 AD0 地 址 /数 据 、 A19/
5、S6 A16/S3 地 址 /状 态 线 上 的 地 址 信 息 锁 存 在 地 址 锁 存 器 中 。 ( 5) DT/( data transmit or receive) : 数 据 发 送 /接 收 信 号 , 输 出 , 三态 。 DT/信 号 用 来 控 制 数 据 传 送 的 方 向 。 DT/为 高 电 平 时 , CPU 发 送 数 据 到 存 储器 或 I/O 端 口 ; DT/为 低 电 平 时 , CPU 接 收 来 自 存 储 器 或 I/O 端 口 的 数 据 。 ( 6) DEN/( data enable) : 数 据 允 许 控 制 信 号 , 输 出 , 三
6、 态 , 低 电 平 有 效 。信 号 用 作 总 线 收 发 器 的 选 通 控 制 信 号 。 当 为 低 电 平 时 , 表 明 CPU 进 行 数 据 的 读/写 操 作 。 ( 7) HOLD( bus hold request) : 总 线 保 持 请 求 信 号 , 输 入 , 高 电 平 有 效 。在 DMA 数 据 传 送 方 式 中 , 由 总 线 控 制 器 8237A 发 出 一 个 高 电 平 有 效 的 总 线 请 求信 号 , 通 过 HOLD 引 脚 输 入 到 CPU, 请 求 CPU 让 出 总 线 控 制 权 。 ( 8) HLDA( hold ackno
7、wledge) : 总 线 保 持 响 应 信 号 , 输 出 , 高 电 平 有 效 。HLDA 是 与 HOLD 配 合 使 用 的 联 络 信 号 。 在 HLDA 有 效 期 间 , HLDA 引 脚 输 出 一 个 高电 平 有 效 的 响 应 信 号 , 同 时 总 线 将 处 于 浮 空 状 态 , CPU 让 出 对 总 线 的 控 制 权 ,将 其 交 付 给 申 请 使 用 总 线 的 8237A 控 制 器 使 用 , 总 线 使 用 完 后 , 会 使 HOLD 信 号变 为 低 电 平 , CPU 又 重 新 获 得 对 总 线 的 控 制 权 。 可编程并行接口芯片
8、 8255A微机系统的信息交换有两种方式:并行通信接口方式和串行通信接口方式。接口电路在 CPU 和 I/O 设备之间起着信号的变换和传输的作用。8255A 可为 86 系列CPU 与外部设备之间提供并行输入/输出的通道。由于它是可编程的,可以通过软件来设置芯片的工作方式,因此,用 8255A 连接外部设备时,通常不用再附加外部电路,使用教方便。并行接口是在多根数据线上,以数据字节/字与 I/O 设备交换信息。在输入过程中,输入设备把数据送给接口,并且使状态线“输入准备好”有效。接口把数据存放在“输入缓冲寄存器”中,同时使“输入回答”线有效,作为对外设的响应。外设在收到这个回答信号后,就撤消数
9、据和“输入准备好”信号。数据到达接口中后,接口会在“状态寄存器”中设置输入准备好标志,或者向 CPU 发一个中断请求。CPU 可用查询方式或中断方式从接口中读取数据。接口中的数据被读取后,接口会自动清除状态寄存器中的标志,且撤消对 CPU 的中断请求。在输出过程中,每当输出寄存器可以接收数据,接口就会将状态寄存器中“输出准备好”状态置 1 或向 CPU 发一个中断请求,CPU 可用查询或中断方式向接口输出数据。当 CPU 输出的数据到达接口后,接口会清除“输出准备好”状态,把数据送往外设,并向外设发一个“数据输出准备好”信号。外设受到驱动后,便接收数据,并向接口电路发一个“输出回答”信号,接口
10、收到该回答信号后,又将状态寄存器中“输出准备好”置位,以便 CPU 输出下一个数据。定义工作方式控制字:LED 数码管LED 为发光二极管构成的显示器件,亦称数码管。由 7 个字符段和一个小数点段组成,每段对应一个发光二极管,当发光二极管点亮时,相应的字符段点亮。LED 有共阴极和共阳极两种供应状态。共阴极显示时,将 LED 显示的 COM 接地,将八个字符段端 a、b、c、d、e、f、g、dp 依次与一个 8 位 I/O 口的最低到最高位连接,当 I/O 给 LED 的哪个字符段送入一个高电平时,该段就被点亮,从而可从这 7 个字符段中被点亮的构成相应的字符显示出来。同理,COM 阳极即将
11、COM 端接Vcc,其显示原理与 COM 阴极的基本相同,但 I/O 口送入低电平是相应的段才被点亮。5.软件设计程序流程图:(1)总程序流程图:计算键值扫描加法运算减法运算显示乘法运算存储除法运算数值?运算符?“ = ” ?清零“ + ” ?“ - ” ?“ * ” ?(2)键盘扫描程序流程图:开始初始化延时 12ms键扫描保存键值键闭合?键释放?结束键闭合?YYYNNN6.具体代码实现DATA SEGMENTX DB ?,?,?,? ;存放数据的每一位X1 DW ? ;存放第一个数据值X2 DW ? ;存放第二个数据值Y DW ? ;存放运算结果S DB ? ;存放运算符号值E DB ?
12、;按下等号键标记CC DB ? ;存放运算数据位数H DB 0 ;存放按键行号L DB 0 ;存放按键列号Z1 DB ?Z2 DB ?Z3 DB ?Z4 DB ?DISCODE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H ;段码表DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AL,90H ;设置为 A 口输入,B 口输出,C 口输出OUT 46H,ALMOV DI,OFFSET X+3 ;DI 指向 X
13、的高位KKK: CALL KEY ;扫描按键JMP KKK;以下为按键扫描子程序,程序返回后,在变量 H 和 L 中存放当前按键的行列号KEY PROCCHECK: CALL DISP ;等待按键按下的同时进行显示MOV AL,0F0H ;所有行输出低电平OUT 44H,ALIN AL,40HCMP AL,0FFH ;读列值JZ CHECK ;若都为高电平则无键按下,等待MOV CX,100LOOP $ ;延时消抖IN AL,DX ;重读列值CMP AL,0FFHJZ CHECK ;无键按下一直等待MOV H,0 ;有键按下,先把行列号变量清 0MOV L,0MOV BL,01HMOV BH,
14、0FEH ;扫描法读键值:从第一行开始测试,即 PC0 输出低电平NEXT: MOV AL,BHOUT 44H,ALNEXTH: IN AL,40H ;读列值,判断是第几列有键按下TEST AL,BL ;从第一列开始判断JZ WAIT0ROL BL,1CMP BL,80H ;当前行状态下没有任何列有键按下,则转为对下一行的测试JZ NEXTLINC H ;每判断一列,列号加 1JMP NEXTH ;再对下一列进行判断NEXTL: MOV H,0MOV BL,01HROL BH,1 ;对下一行测试,让下一个PC 口输出低电平CMP BH,0EFHJZ EXITINC LJMP NEXTWAIT0
15、: IN AL,40H ;若有键按下,则等该按键松开后再计算键值CMP AL,0FFHJNZ WAIT0MOV CX,100LOOP $ ;延时消抖IN AL,40HCMP AL,0FFHJNZ WAIT0CALL KEYVALUE ;调计算键值子程序EXIT: RETKEY ENDP;以下为计算键值子程序,通过行列号计算键值(键值=列号*4+行号);键值存放在 DL 寄存器中KEYVALUE PROCMOV DL,LMOV DH,HSHL DL,1SHL DL,1 ;列号乘 4ADD DL,DHCMP DL,9 ;按下的是数字键JNG NUM_CALLCMP DL,16JL CONT_CAL
16、L ;按下的是运算键CMP DL,16JZ OUTP_CALL ;按下的是等于键CMP DL,17JZ CLR_CALL ;按下的是清除键NUM_CALL: CALL NUMBER ;调数字键处理子程序JMP EXIT1CONT_CALL: MOV S,DL ;存放运算键的键值MOV E,0CALL COUNT ;调运算键处理子程序,计算第一个加数JMP EXIT1OUTP_CALL: CALL OUTP ;调等号键处理子程序JMP EXIT1CLR_CALL: CALL CLEAR ;调清除键处理子程序EXIT1: RETKEYVALUE ENDP;以下为清除键处理子程序,按下清除键后,X
17、变量全部清 0CLEAR PROCMOV X3,0MOV X2,0MOV X1,0MOV X0,0CALL BITPRETCLEAR ENDP;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入 X2 变量;并根据运算符号,调用相应的运算子程序OUTP PROCPUSH AXPUSH DXPUSH BXINC ECALL COUNT ;调运算键处理子程序,计算第二个运算数据CMP S,10JZ ADD_CALL ;运算符为加号,则调用加法子程序CMP S,11JZ LOG_CALL ;运算符为对数,则调用对数子程序CMP S,12JZ JCE_CALL ;运算符为阶乘号,则
18、调用阶乘子程序CMP S,13JZ DIVP_CALL ;运算符为除号,则调用除法子程序CMP S,14JZ K_CALLCMP S,15CALL ERJMP STORE1ADD_CALL: CALL ADDPJMP STORE1LOG_CALL: CALL LOGJMP STORE1JCE_CALL: CALL JCEJMP STORE1DIVP_CALL: CALL DIVPJMP STORE1K_CALL:CALL KSTORE1: MOV AX,Y ;以下程序将各运算子程序返回的运算结果,按位分解,送入 X 变量MOV DX,0MOV BX,1000DIV BXMOV X0, ALMO
19、V AX,DXMOV BL,100DIV BLMOV X1,ALMOV AL,AHMOV AH,0MOV BL,10DIV BLMOV X2,ALMOV X3,AHPOP BXPOP DXPOP AXRETOUTP ENDP;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入 X1 变量;或者将第二个运算数据的数值计算出来并存入 X2 变量;将运算符的值存入 S 变量COUNT PROCPUSH AXPUSH BXPUSH DXMOV DX,0CALL BITP ;测试 X 中的数据是多少位CMP CC,4 ;输入的数据是 4 位数 ?JZ C4CMP CC,3 ;输入的数据是
20、 3 位数 ?JZ C3CMP CC,2 ;输入的数据是 2 位数 ?JZ C2JMP C1 ;输入的数据是 1 位数 ?C4: MOV AX,0MOV AL,X0MOV BX,1000MUL BXMOV DX,AXC3: MOV AL,X1MOV BL,100MUL BLADD DX,AXC2: MOV AL,X2MOV BL,10MUL BLADD DX,AXC1: MOV AL,X3MOV AH,0ADD DX,AXCMP E,1JNZ X1_SMOV X2,DX ;按下的是等号,则将第二个运算数据的值存入 X2 变量JMP EXIT3X1_S: MOV X1,DX ;按下的是运算符号,
21、则将第一个运算数据的值存 X1 变量MOV X3,0 ;清空 X 变量MOV X2,0MOV X1,0MOV X0,0EXIT3: POP DXPOP BXPOP AXRETCOUNT ENDP;以下为数字键处理子程序;该程序,将输入的数据按位存放在 X 变量中,并由 CC 记录数据的位数NUMBER PROCCMP E,1JNZ CONTINUEMOV E,0CALL CLEARCONTINUE: CMP CC,0 ;目前数据为 0 位,即没有数据,则转到 SSSJZ SSS;若已有数据,以下程序将 X 左移 8 位。;例如:先输入“1” ,当再输入 2 时,;先要将“1 ”从个位移到十位,
22、然后再将 “2”存放到个位PUSH AXPUSH DXMOV AL,X3MOV AH,X2MOV DL,X1MOV DH,X0MOV CX,8LL: SHL AX, 1RCL DX,1LOOP LLMOV X3,ALMOV X2,AHMOV Z3,AHMOV X1,DLMOV Z2,DLMOV X0,DHMOV Z1,DHPOP DXPOP AXSSS: MOV DI,DL ;将当前键入的数据存放到X 的最低位MOV Z4,DLINC CC ;数据位数加 1CMP CC,4 ;判断数据位数JNG EXIT2MOV CC,0 ;如果数据超过 4 位,重新从最低位开始存放MOV X2,0MOV X
23、1,0MOV X0,0EXIT2: CALL DISP ;调显示子程序,显示输入的数据RETNUMBER ENDP;加法子程序ADDP PROCPUSH AXMOV AX,X1ADD AX,X2MOV Y,AXPOP AXRETADDP ENDP;对数子程序LOG PROCPUSH AXPUSH BXPUSH CXPUSH DXMOV AX,X1MOV BX,0MOV CX,2MOV DX,0LO:DIV CXCMP AX,0JZ G2INC BXJMP LOG2:MOV Y,BXPOP DXPOP CXPOP BXPOP AXRETLOG ENDP;阶乘子程序JCE PROCPUSH AXP
24、USH BXPUSH CXPUSH DXMOV AX,X1MOV DX,AXSUB DX,1MOV CX,DXMOV BX,DXCHENG:MUL DXDEC BXMOV DX,BXLOOP CHENGMOV Y,AXPOP DXPOP CXPOP BXPOP AXRETJCE ENDP;除法子程序DIVP PROCPUSH AXPUSH BXPUSH DXMOV DX,0MOV AX,X1MOV BX,X2DIV BXMOV Y,AXPOP DXPOP BXPOP AXRETDIVP ENDP;次方子程序K PROCPUSH AXPUSH DXPUSH CXMOV AX,X1MOV DX,A
25、XMOV CX,X2DEC CXN:MUL DXMOV DX,X1LOOP NMOV Y,AXPOP CXPOP DXPOP AXRETK ENDP;二进制转换成十进制子程序ER PROCPUSH AXPUSH BXPUSH CXMOV BL,8MOV AL,Z1MUL BLMOV CX,AXMOV BL,4MOV AL,Z2MUL BLADD CX,AXMOV BL,2MOV AL,Z3MUL BLADD CX,AXMOV AL,Z4MOV BL,1MUL BLADD CX,AXMOV Y,CXPOP CXPOP BXPOP AXRETER ENDP;显示子程序 ,将 X 中的数值按位显示出
26、来DISP PROCPUSH BXPUSH AXMOV BH,0LEA SI,DISCODECALL BITP ;测试 X 位数CMP CC,4JZ QIANCMP CC,3JZ BAICMP CC,2JZ SHICMP CC,1JMP GJMP NONEQIAN: MOV AH,11100000B ;从第 4 位开始显示MOV AL,AHOUT 44H,ALMOV BL,X0MOV AL,SI+BXOUT 42H,ALCALL DELYMOV AL,0OUT 42H,ALBAI: MOV AH,11010000B ;从第 3 位开始显示MOV AL,AHOUT 44H,ALMOV BL,X1MOV AL,SI+BXOUT 42H,ALCALL DELYMOV AL,0OUT 42H,ALSHI: MOV AH,10110000B ;从第 2 位开始显示MOV AL,AHOUT 44H,ALMOV BL,X2MOV AL,SI+BXOUT 42H,ALCALL DELYMOV AL,0OUT 42H,ALG: MOV AH,01110000B ;从第 1 位开始显示MOV AL,AHOUT 44H,ALMOV BL,X3MOV AL,SI+BXOUT 42H,ALCALL DELYJMP EXIT4