16 32位微机原理、汇编语言及接口技术第十一章课后习题答案

更新时间:2023-11-11 17:36:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

习题11.4

习题11.6

连接只改PA→PB,其余不变

只要把涉及输出到端口A的代码改为输出到端口B即可。 PC7做选通信号,为输出,即C端高部分为输出 PC2为Busy,为输入,即C端低部分为输入 C端整个定为方式0 B端输出,方式0

A端任意,这里为方式0输出

假设8255A端口A、B、C和控制端口地址分别为FFF8H、FFFAH、FFFCH和FFFEH。 ;8255A的初始化 mov dx,0fffeh ;控制端口地址:FFFEH mov al,10000001B ;方式控制字:10000001=81H out dx,al ;B端口方式0输出,C端口上方式0输出、下方式0输入, ; 端口任意(方式0,出) mov al,00001111B ;端口C的复位置位控制字,使PC7=1 out dx,al ;使PC7=1,即置STROBE*=1(只有输出数据时才为低脉冲) ;输出打印数据子程序,入口参数AH=打印数据 ;查询 printc proc push ax push dx prn: mov dx,0fffch ;读取端口C in al,dx ;查询打印机状态 and al,04h ;00000100,PC2=BUSY=0? jnz prn ;PC2=1,打印机忙,则循环等待 ;打印子程序:输出

printc mov dx,0fffAh mov al,ah out dx,al ;打印子程序:打印 mov dx,0fffeh mov al,00001110B out dx,al nop nop

mov al,00001111B out dx,al ;打印子程序:返回 pop dx pop ax ret endp

;PC2=0,打印机不忙,则输出数据 ;将打印数据从端口B输出 ;从PC7送出控制低脉冲 ;置STROBE*=0 ;产生一定宽度的低电平

;置PC7=1,即STROBE*=1

;最终,STROBE*产生低脉冲信号

习题11.7

方式1输出下:

端口A的ACK*即PC6,OBF*即PC7,INTR即PC3 对应端口B的ACK*即PC2,OBF*即PC1,INTR即PC0 数据端口变换为PB

mov dx,0fffeh mov al,84h out dx,al mov al,04h ;使INTEB(PC2)为0,禁止中断

out dx,al …… mov cx,counter ;打印字节数送CX mov bx,offset buffer ;取字符串首地址 call prints ;调用打印子程序 prints proc push ax ;保护寄存器 push dx

print1: mov al,[bx] ;取一个数据 mov dx,0fffah out dx,al ;从端口B输出 mov dx,0fffch print2: in al,dx test al,02h ;检测(PC1)为1否? jz print2 inc bx loop print1 pop dx pop ax ret prints endp

习题11.8

L0~L3对应PC4~PC7,L亮否可以通过给PC4~PC7置位复位实现,即C端口的高部分为输出;

根据K0~K3(PC0~PC3),确定L0~L3(对应PC4~PC7)亮否,所以C端低部分为输入; 又C端的8位都被正常使用,所以A端口和B端口均为方式是0 ;写入方式字 mov al,100×00×1b ;=81h mov dx,控制口地址 ;0fffeh out dx,al ;加入下一段更好,使L0~L3全亮 mov al,0fh mov dx,端口C地址 ;0fffch out dx,al ;PC4~PC7为高,经反向驱动为0,与阳极间形成通路,LED亮 ;控制程序段 mov dx,端口C地址 ;0fffch in al,dx ;读入PC0~PC3 mov cl,4 shl al,cl ;左移4位,PC0~PC3→PC4~PC7 out dx,al ;控制PC4~PC7。

因为有反向驱动,PC0为0,对应PC4为0,二极管左右均为高,不发光,符合题目要求。

习题11.10

当按下或释放一个键时,往往会出现按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的现象就是机械按键的抖动

方法解决

硬件:消抖电路

软件:程序延时,以避开抖动的时间

习题11.11

重键指两个或多个键同时闭合

简单情况:不予识别,认为是错误的按键 通常情况:只承认先识别出来的键

连锁法:直到所有键都释放后,读入下一个键

巡回法:等被识别的键释放以后,就可以对其他闭合键作识别,而不必等待全部键释放 正常的组合键:都识别出来

习题11.12

最初设置行线端口为端口B(输出)、列线端口为端口A(输入),三个端口和控制端口对应地址为218H~21BH 端口A、B工作在方式0 ;设置端口B为行(输出),端口A为列(输入) mov al,90h ;1 00 1×0 0× 90H mov dx,21BH out dx,al ;第1段:是否有键按下 key1: mov al,00 mov dx,219h ;假设219h表示行线端口 out dx,al ;使所有行线为低电平 mov dx, 218h ;假设218h为列线端口 in al,dx ;读取列值 cmp al,0ffh ;判定是否有列线为低电平 jz key1 ;无闭合键,循环等待 call delay ;有,延迟20ms清除抖动 ;第2段:识别按键(反转法) key2: mov al,00 mov dx,219h ;设置行线接输出端口,列线接输入端口 out dx,al ;设置行线全为低 mov dx,218h in al,dx ;读取列值 cmp al,0ffh

jz key2 ;无闭合键,循环等待 push ax ;有闭合键,保存列值 push ax ;行列反转,设置端口B为行(输入),端口A为列(输出) mov al,82h ;1 00 0×0 1× 82H mov dx,21BH out dx,al ;设置行线接输入端口,列线接输出端 mov dx,218h pop ax out dx,al mov dx,219h in al,dx pop bx mov ah,bl ;第3段:查找键代码 mov si,offset table mov di,offset char mov cx,64 key3: cmp ax,[si] jz key4 inc si inc si inc di loop key3 jmp key1 ;第4段:等待按键释放 key4: mov al,[di] …… call delay …… ;行列值表和键代码表 ;键盘的行列值表 table dw 0fefeh dw 0fdfeh dw 0fbfeh …… ;键盘的键代码表 char db …… db …… …… ;输出列值 ;读取行值 ;组合行列值 ;此时,al=行值,ah=列值 ;table为键行列值表 ;char为键代码表 ;CX=键的个数 ;与键值比较 ;相同,说明查到 ;不相同,继续比较,行值,列值两个,所以加2 ;全部比较完,仍无相同,说明是重键 ;获取键代码送AL ;判断按键是否释放,没有则等待 ;按键释放,延时消除抖动 ;后续处理 ;键0的行列值(键值)高8为列值,低8为行值;见key2末尾 ;键1的行列值 ;键2的行列值 ;其他键的行列值 ;键0的代码值 ;键1的代码值 ;其他键的代码值

本文来源:https://www.bwwdw.com/article/bmkv.html

Top