微机原理、汇编与接口技术习题答案 第8章习题答案

  • 格式:doc
  • 大小:4.98 MB
  • 文档页数:17

1 微机原理、汇编与接口技术第八章习题答案

8.1

端口地址为380H~383H 4个A端口基本输入、B端口基本输出的方式控制字为90H,方式控制字寄存器的端口地址为383H。

初始化程序段如下:

MOV AL, 90H

MOV DX, 383H

OUT DX, AL

8.2

MOV DX, 383H

MOV AL, 80H ;3个端口基本输出的方式控制字80H

OUT DX, AL

MOV AL, 0EH ;PC7置“0”的置位/复位字0EH

OUT DX, AL

MOV AL, 9 ;PC4置“1”的置位/复位字09H

OUT DX, AL

8.3 2

stack segment stack stack

dw 32 dup(0)

stack ends

data segment

BUF DB 0

data ends

code segment

start pro far

assume ss: stack, cs: code, ds: data

push ds

sub ax,ax

push ax

MOV ES,AX ;ES为中断向量表的段地址 0000H

mov ax,data

mov ds,ax

MOV DX,383H ;A端口方式1输入

MOV AL,0B0H

OUT DX,AL

MOV AL,9 ;PC4置1,允许A端口中断

OUT DX,AL

MOV AX,SEG IS8255 ;填写中断向量表

MOV ES:01C6H,AX

MOV AX,OFFSET IS8255

MOV ES:1C4H,AX

MOV DX,380H ;A端口的端口地址送DX

IN AL,0A1H ;修改中断屏蔽字,允许IQR9中断

IND AL,0FDH

OUT 0A1H,AL 3 JMP $

IN AL,0A1H ;恢复中断屏蔽字,禁止IRQ9中断

OR AL,02H

OUT 0A1H,AL

ret

IS8255: IN AL,DX ;读键值

MOV BUF,AL ;存键值

MOV AL,61H ;指定EOI命令

OUT 0A0H,AL

MOV AL,62H

OUT 20H,AL

POP AX ;修改返址

INC AX

INC AX

PUSH AX

IRET

start endp

code ends

end start

8.4

控制程序的框图 4

stack segment stack stack

dw 32 dup(0)

stack ends

data segment

BUF DB 00H, 10H, 10H, 10H ;SEGPT表中位移量为10H处的显示代码为全灭

SEGPT DB 40H, 79H, 24H, 30H, 19H, 12H, 2,78H

DB 0, 18H, 8, 3, 46H, 21H, 6, 0EH, 7FH

KYTBL DB 17H, 27H, 2BH,2DH, 47H, 4BH, 4DH, 87H, 8BH

DB 8DH, 8EH, 4EH, 2EH, 1EH, 1DH, 1BH

data ends

code segment

start proc far

assume ss: stack, cs: cods, ds: data

push ds

sub ax, ax

push ax

mov ax, data

mov ds, ax 5 MOV DX, 383H

MOV AL, 81H ;A口基本I/O出、PCH出、PCL入

MOV DX, AL

MOV DI, 0 ;存键入数的指针

DISUP: MOV AH, 88H ;位选值, 从PCH输出, 1位为0, 3位为1

MOV BX, 0

DISUP1: MOV CL, BUF [BX] ;取一个显示数

XOR AL, AL

MOV CH, AL ;将显示数扩展为16位

MOV DX, 382H

OUT DX, AL ;关显示,七段显示器的共阴极为高电平

MOV SI, OFFSET SEGPT ;七段显示代码表的偏移首地址

ADD SI, CX ;求得显示数的显示代码的偏移地址

MOV AL, [SI] ;取显示代码

MOV DX, 380H ;输出显示代码到A口

OUT DX, AL

MOV AL, AH

MOV DX, 382H ;输出显示数位到C口(PCH)

OUT DX, AL

CALL D1MS ;1ms延时

CMP AH, 11H ;是最低数位吗?

JE DECKY ;是,转键盘扫描和键译码程序

INC BX ;否,指向下一位数的存储地址

ROR AH, 1 ;移到下一个数位

JMP DISUP1

DECKY: MOV AL, 7FH

MOV DX, 380H

OUT DX, AL ;关显示,七段显示器的七段均为低电平

MOV AL, 0F0H

MOV DX, 382H

OUT DX, AL ;输出,使所有行线为低电平

IN AL, DX ;读入键盘列数据

AND AL, 0FH ;屏蔽无用位(D7~D4)

CMP AL, 0FH ;有键按下吗?

JE DISUP ;无键按下,返回显示程序

CALL D20MS ;有键按下延时20ms,消除键抖动

MOV CX, 4 ;行计数器

MOV AH, 10H

DECKY1: MOV AL, AH

OUT DX, AL ;设置选择的行为低电平

IN AL, DX ;输入列数据

AND AL, 0F0H ;屏蔽无用位

CMP AL, 0F0H ;该行有键按下吗?

JNE DECKY2 ;有,转键译码

SHL AH, 1 ;无,扫描下一行

LOOP DECKY1 ;所有行扫描完成了?否,扫描下一行 6 JMP DISUP ;是,转显示

DECKY2: OR AL, AH ;行和列数值合并为键码

MOV BX, 0

DECKY3: CMP AL, KYTBL [BX] ;查键码表,找到按键吗?

JE DECKY4 ;找到按键转DECKY4

INC BX ;没找到

JMP DECKY3 ;循环查找

DECKY4: MOV BUF [DI], BL ;存按键

INC DI

CMP DI, 4 ;存满4位键入数吗?

JNE DECKY5 ;未存满,不修改指针

MOV DI, 0 ;已存4位,修改指针

DECKY5: IN AL, DX ;检测键释放

AND AL, 0FH

CMP AL, 0FH

JNE DECKY5 ;直到键释放

CALL D20MS ;消去键释放时的抖动等待20ms

JMP DISUP

ret

start endp

D1MS PROC ;延时1ms子程序

RET

D1MS ENDP

D20MS PROC ;延时20ms子程序

RET

D20MS ENDP

code ends

end start

8.5

stack segment stack stack

dw 32 dup(0)

stack ends

code segment

start proc far

assume ss: stack, cs: cods

push ds

sub ax, ax

push ax

mov ax, data

mov ds, ax

MOV DX, 383H

MOV AL, 90H ;A口方式0入,B口和C口方式0出

OUT DX, AL 7 MOV DX, 380H

IN AL, DX ;从A口读入原码

AND AL, AL ;判原码的符号

JNS DN ;为正去DN

AND AL, 7FH ;为负,取其绝对值

MOV DX, 382H

OUT DX, AL ;绝对值从C口输出

NEG AL ;将负数的绝对值求补

DEC DX

OUT DX, AL ;负数的补码从B口输出

RET

DN: INC DX ;正数直接从B口和C口输出

OUT DX, AL

INC DX

OUT DX, AL

ret

start endp

code ends

end start

8.6

8.7

设端口地址为380H~383H。