通过8255A接口控制8个发光二极管亮、灭的应用,8255A的端口地址为80H~83H。要求L7-L0每隔3s点亮1次,点亮的顺序为:L7→L6→L5→L4→L3→L2→L1→L0→L7……周而复始。 1.写出8255A 的方式控制字和初始程序,并加以注释。 2.写出题意要求的程序。
时间: 2023-11-18 08:25:00 浏览: 172
用P1口做输出口,接八只发光二极管 编写程序,使发光二极管循环点亮,循环点亮时间间隔为1秒,该时间间隔用定时器中断实现
1. 8255A 的方式控制字和初始程序:
8255A 的方式控制字分为3个,分别对应 A 组、B 组和控制字寄存器。其中,A 组和 B 组分别包含了端口 A、端口 B 和端口 C 的控制位,控制字寄存器用于控制 8255A 的工作方式。控制字寄存器的端口地址为 80H。
下面是对控制字寄存器的控制位的解释:
- D0:0表示 A 组端口 C 为输出,1表示为输入。
- D1:0表示 B 组端口 C 为输出,1表示为输入。
- D2:0表示 A 组端口 C 的输出方式为“模式 0”,1表示为“模式 1”。
- D3:0表示 B 组端口 C 的输出方式为“模式 0”,1表示为“模式 1”。
- D4~D5:用于设置 A 组端口 A 的模式,00 表示为“模式 0”,01 表示为“模式 1”,10 表示为“模式 2”,11 表示为“模式 3”。
- D6~D7:用于设置 B 组端口 A 的模式,00 表示为“模式 0”,01 表示为“模式 1”,10 表示为“模式 2”,11 表示为“模式 3”。
以下是控制字寄存器的初始程序:
```
MOV AL, 10010000B ; 设置 A 组端口 A 为“模式 0”,A、B、C 三个端口均为输出
OUT 80H, AL ; 将控制字写入控制字寄存器
```
2. 题意要求的程序:
下面是题意要求的程序:
```
MOV CX, 0000H ; 用 CX 寄存器存储计数器的值,初始值为 0000H
LOOP:
MOV AL, 1 ; 将 AL 寄存器的值设置为 1
SHL AL, CL ; 将 AL 寄存器的值左移 CL 位,以便点亮对应的 LED 灯
OUT 82H, AL ; 将 AL 寄存器的值写入端口 B,以控制 LED 灯的亮灭
INC CL ; 将计数器的值加 1
CMP CL, 8 ; 如果计数器的值等于 8,说明已经点亮了 8 个 LED 灯,则将计数器的值重置为 0,重新开始循环
JZ RESET
JMP DELAY ; 跳转到延时程序
RESET:
MOV CL, 0 ; 将计数器的值重置为 0
JMP DELAY ; 跳转到延时程序
DELAY:
MOV BX, 0FFFFH ; 用 BX 寄存器存储延时的值,初始值为 0FFFFH
DELAY_LOOP:
DEC BX ; 将 BX 寄存器的值减 1,从而实现延时
JNZ DELAY_LOOP
JMP LOOP ; 延时结束后跳转到循环开始处
```
以上程序的思路是:循环点亮 8 个 LED 灯,每隔 3 秒钟点亮一个。程序中使用了一个计数器(CX 寄存器)来记录当前点亮的是哪个 LED 灯。在每次循环中,将 AL 寄存器的值设为 1,左移 CL 位,以便点亮对应的 LED 灯。然后将 AL 寄存器的值写入端口 B,控制 LED 灯的亮灭。接着将计数器的值加 1,如果计数器的值等于 8,则说明已经点亮了 8 个 LED 灯,将计数器的值重置为 0,重新开始循环。每次循环结束后,跳转到延时程序,进行 3 秒钟的延时,然后再次跳转到循环开始处。
阅读全文