在8088应用系统中,使用8255A的A口扩展2位独立式按键,由C口直接驱动两位高亮LED发光管,如图。当K0键按下时L1点亮L2熄灭,K1键按下时L2点亮L1熄灭,无键按下时各发光管均熄灭。K0键具有较高优先级。 ① 写出8255对应的端口号。 ② 编写8255初始化程序。 ③ 编写程序完成上述功能。要求分别使用C端口置1置0控制字控制和对C口按字节访问方式分别完成控制输出。
时间: 2024-03-23 16:43:43 浏览: 73
① 8255对应的端口号:
8255的端口地址由用户进行设置,因此这里只是给出一个例子,假设控制端口地址为0x80。
- 端口A:0x80
- 端口B:0x81
- 控制端口:0x82
② 8255初始化程序:
使用C端口置1置0控制字控制方式:
```
MOV AL, 10000000B ; 设置端口A为输出
OUT 82H, AL ; 输出控制字到控制端口
MOV AL, 00000000B ; 设置端口B为输入
OUT 82H, AL ; 输出控制字到控制端口
```
使用对C口按字节访问方式控制:
```
MOV AL, 11111100B ; 设置端口A为输出,端口B为输入
OUT 82H, AL ; 输出控制字到控制端口
```
③ 完成上述功能的程序:
使用C端口置1置0控制字控制方式:
```
MOV DX, 80H ; 将控制端口地址存入DX
MOV AL, 10000000B ; 设置端口A为输出
OUT DX, AL ; 输出控制字到控制端口
START:
IN AL, 81H ; 读取端口B的值
AND AL, 00000011B ; 只取最后两位,其余位置0
CMP AL, 00000001B ; 检查K0是否按下
JE K0_PRESSED ; 如果按下,跳转到K0_PRESSED
CMP AL, 00000010B ; 检查K1是否按下
JE K1_PRESSED ; 如果按下,跳转到K1_PRESSED
JMP NO_KEY_PRESSED ; 如果没有按键按下,跳转到NO_KEY_PRESSED
K0_PRESSED:
MOV AL, 11111101B ; 点亮L1,熄灭L2
OUT 80H, AL ; 输出到端口A
JMP START
K1_PRESSED:
MOV AL, 11111110B ; 点亮L2,熄灭L1
OUT 80H, AL ; 输出到端口A
JMP START
NO_KEY_PRESSED:
MOV AL, 11111111B ; 熄灭L1和L2
OUT 80H, AL ; 输出到端口A
JMP START
```
使用对C口按字节访问方式控制:
```
MOV DX, 80H ; 将控制端口地址存入DX
MOV AL, 11111100B ; 设置端口A为输出,端口B为输入
OUT DX, AL ; 输出控制字到控制端口
START:
IN AL, 81H ; 读取端口B的值
AND AL, 00000011B ; 只取最后两位,其余位置0
CMP AL, 00000001B ; 检查K0是否按下
JE K0_PRESSED ; 如果按下,跳转到K0_PRESSED
CMP AL, 00000010B ; 检查K1是否按下
JE K1_PRESSED ; 如果按下,跳转到K1_PRESSED
JMP NO_KEY_PRESSED ; 如果没有按键按下,跳转到NO_KEY_PRESSED
K0_PRESSED:
MOV AL, 11111101B ; 点亮L1,熄灭L2
OUT 81H, AL ; 输出到端口B
JMP START
K1_PRESSED:
MOV AL, 11111110B ; 点亮L2,熄灭L1
OUT 81H, AL ; 输出到端口B
JMP START
NO_KEY_PRESSED:
MOV AL, 11111111B ; 熄灭L1和L2
OUT 81H, AL ; 输出到端口B
JMP START
```
阅读全文