微机原理与接口技术(钱晓捷1版)课后习题答案

〔习题8.5〕

8253芯片需要几个I/O地址,各用于何种目的? 〔解答〕

4个,读写计数器0,1和2,及控制字。 〔习题8.6〕

试按如下要求分别编写8253的初始化程序,已知8253的计数器0~2和控制字I/O地址依次为204H~207H。

① 使计数器1工作在方式0,仅用8位二进制计数,计数初值为128。 ② 使计数器0工作在方式1,按BCD码计数,计数值为3000。 ③ 使计数器2工作在方式2,计数值为02F0H。 〔解答〕

mov al,50h mov dx,207h out dx,al mov al,128 mov dx,205h out dx,al

; =80h

mov al,33h mov dx,207h out dx,al mov ax,3000h mov dx,204h out dx,al mov al,ah out dx,al

; 不是3000

mov al,0b4h mov dx,207h out dx,al mov al,02f0h mov dx,206h out dx,al mov al,ah out dx,al

〔习题8.7〕

利用扬声器控制原理,编写一个简易乐器程序。

当按下1~8数字键时,分别发出连续的中音1~7和高音i(对应频率依次为524Hz,588Hz,660Hz,698Hz,784Hz,880Hz,988Hz和1048Hz);

当按下其他键时暂停发音;

当按下ESC键(ASCII码为1BH),程序返回操作系统。 〔解答〕

table

; 数据段

dw 2277,2138,1808,1709,1522,1356,1208,1139 ; 对应中音1~7和高音i的定时器记数值

- -57

again:

next: ; 代码段 mov al,0b6h out 43h,al call readc cmp al,'1' jb next cmp al,'8' ja next sub al,30h sub al,1 xor ah,ah shl ax,1 mov bx,ax

mov ax,table[bx] out 42h,al mov al,ah out 42h,al in al,61h or al,03h out 61h,al jmp again push ax in al,61h and al,0fch out 61h,al pop ax

cmp al,1bh jne again

; 设置定时器2工作方式 ; 等待按键

; 判断是否为数字1~8

; 1~8的ASCII码转换为二进制数

; 再减1,将数字1~8变为0~7,以便查表 ; 乘以2

; 记数值表是16位数据,无法采用xlat指令 ; 取出对应的记数值 ; 设置定时器2的记数值

; 打开扬声器声音

; 使D1D0=PB1PB0=11B,其他位不变 ; 连续发声,直到按下另一个键 ; 不是数字1~8,则关闭扬声器声音 ; 使D1D0=PB1PB0=00b,其他位不变

; 判断是否为ESC键(对应ASCII码1bh) ; 不是ESC,继续;否则程序执行结束

〔习题8.8〕

针对8255芯片工作方式1输出时序,说明数据输出的过程。 〔解答〕

① 中断方式下,处理器响应中断,执行输出OUT指令:输出数据给8255,发出WR信号。查询方式下,通过端口C的状态确信可以输出数据,处理器执行输出指令;

② WR信号一方面清除INTR,另一方面在上升沿使OBF有效,通知外设接收数据。实质上OBF信号是外设的选通信号;

③ WR信号结束后,数据从端口数据线上输出。当外设接收数据后,发出ACK响应; ④ ACK信号使OBF无效,上升沿又使INTR有效(允许中断的情况),发出新的中断请求。 〔习题8.9〕

设定8255芯片的端口A为方式1输入,端口B为方式1输出,则读取口C的数据的各位是什么含义? 〔解答〕

PC0:端口B的中断请求信号 PC1:端口B输出缓冲器满信号 PC2:端口B中断允许控制位 PC3:端口A的中断请求信号

- -58

PC4:端口A中断允许控制位 PC5:端口A输入缓冲器满信号 PC6/PC7:I/O信号 〔习题8.10〕

用8255端口A方式0与打印机接口示例中,如果改用端口B,其他不变,说明应该如何修改接口电路和程序。 〔解答〕

修改电路:将端口B的PB0~PB7接打印机的数据位DATA0~DATA7即可。 修改程序:将输出数据端口改为FFFAH即可。 〔习题8.11〕

用8255端口A方式1与打印机接口,如果改用端口B,其他不变,说明如何修改接口电路和程序。 〔解答〕

修改电路:PA0~PA7改为PB0~PB7;PC6改用PC2,PC7改用PC1,PC3改用PC0。 修改程序:

prints

print1:

print2:

prints

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 ; 调用打印子程序 …… proc push ax ; 保护寄存器 push dx

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

loop print1 pop dx pop ax ret endp

〔习题8.12〕

有一工业控制系统,有四个控制点,分别由四个对应的输入端控制,现用8255的端口C实现该系统的控制,如本题图形。开关K0~K3打开则对应发光二极管L0~L3亮,表示系统该控制点运行正常;开关闭合则对应发光二极管不亮,说明该控制点出现故障。编写

- -59

8255的初始化程序和这段控制程序。 〔解答〕

; 写入方式字

mov al,100×00×1b ; =81H(×表示任意,可以填写为0,也可以为1) mov dx,控制口地址 ; 可以假设为0FFFEH out dx,al

;加入下一段更好,使L0~L3全亮 mov al,0fh

mov dx,端口C地址 ; 可以假设为0FFFCH out dx,al ;控制程序段

mov dx,端口C地址 ; 可以假设为0FFFCH in al,dx ; 读入PC0~PC3 mov cl,4 shl al,cl ; 左移4位 out dx,al ; 控制PC4~PC7

+5V 8255 2K?4 K0 K1 K2 K3 L0 L1 L2 L3 74LS04 +5V 4?300Ω PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 图8-1 习题8.12附图

〔习题8.13〕

编写一个程序,每当在键盘上按下一键时,就显示其接通和断开扫描码,可以利用ESC键退出程序执行。键盘的每个字节代码都引起一次09H号中断,这样大部分按键将产生两次中断,按下按键盘发送接通扫描码,松开按键发送断开扫描码。例如,ESC键是01H和81H。83键标准键盘以后的增加的按键可能有多个。请问主键盘区和数字小键盘区的两个回车的扫描码分别是什么? 〔解答〕

done

; 数据段 byte 0

; 代码段,主程序 mov ax,3509h int 21h push es

- -60

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4