设微机系统外扩一片8255A,相应的实验电路如下图所示。要求利用微机日时钟1CH中断,实现发光二级管LED点亮1秒钟后,再熄灭1秒,循环往复。当主机键盘按下任意键时,程序结束。(要求给出完整的源程序)
时间: 2024-02-22 12:54:55 浏览: 41
下面是8255A实现发光二极管LED点亮1秒钟后熄灭1秒循环往复的完整源程序,使用汇编语言编写:
```
; 定义常量
LED_ON EQU 0 ; 发光二极管LED点亮
LED_OFF EQU 1 ; 发光二极管LED熄灭
INT_NUM EQU 1CH ; 日时钟中断号
; 定义变量
LED_Status DB LED_OFF ; 发光二级管LED的状态,初始为熄灭状态
Count DW 0 ; 计数器,用于计算时间
; 定义子程序
Delay: ; 延时子程序,1秒钟,使用计数器0实现
MOV CX, 0F42H ; 计数器初值,65536-4MHz
MOV DX, 0F43H
MOV AL, 00110110B ; 工作模式3,计数器0的输出为高电平
OUT DX, AL ; 写入控制端口
DelayLoop:
IN AL, DX ; 等待计数器0的计数完成
AND AL, 80H
JZ DelayLoop
RET
LED_On: ; 发光二级管LED点亮子程序
MOV AL, 00H ; 将8255A端口A的值设置为0,点亮LED
OUT 60H, AL
RET
LED_Off: ; 发光二级管LED熄灭子程序
MOV AL, 0FFH ; 将8255A端口A的值设置为FFH,熄灭LED
OUT 60H, AL
RET
; 程序入口
START:
MOV AX, @DATA ; 初始化数据段寄存器
MOV DS, AX
; 初始化8255A端口A为输出模式
MOV DX, 61H
IN AL, DX
OR AL, 03H
OUT DX, AL
MOV DX, 62H
IN AL, DX
AND AL, 0F0H
OR AL, 0AH
OUT DX, AL
; 初始化计数器1为工作模式2,用于产生1秒钟的中断
MOV DX, 43H
MOV AL, 00110110B ; 工作模式2,16位计数器,使用内部时钟源
OUT DX, AL
MOV AX, 1F40H ; 计数器初值,65536-1MHz
OUT 40H, AL
MOV AL, AH
OUT 40H, AL ; 写入计数器初值的高8位
MOV AX, 1F40H ; 计数器重载值,1秒钟
OUT 40H, AL
MOV AL, AH
OUT 40H, AL ; 写入计数器重载值的高8位
; 初始化中断向量表
MOV AX, SEG INT_PROC
MOV DS, AX
MOV AX, OFFSET INT_PROC
MOV WORD PTR [INT_NUM*4], AX
MOV AX, @DATA
MOV DS, AX
; 开启中断
STI
; 循环执行发光二极管LED点亮和熄灭操作
Loop:
CMP BYTE PTR [LED_Status], LED_OFF
JZ LED_On
CALL Delay
MOV BYTE PTR [LED_Status], LED_OFF
JMP Loop
LED_On:
CALL LED_On
CALL Delay
MOV BYTE PTR [LED_Status], LED_ON
JMP Loop
; 中断处理程序
INT_PROC:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
; 判断是否为计数器1的中断
MOV DX, 43H
IN AL, DX
CMP AL, 0D1H
JNE EndOfInt
; 重置计数器1,并将计数器0的值清零
MOV DX, 61H
IN AL, DX
AND AL, 0FEH
OUT DX, AL
MOV AX, 0
MOV DX, 40H
OUT DX, AL
OUT DX, AL
; 计数器0计数1秒钟
MOV DX, 43H
MOV AL, 00110110B ; 工作模式3,计数器0的输出为高电平
OUT DX, AL
MOV AX, 1F40H ; 计数器初值,65536-1MHz
OUT 40H, AL
MOV AL, AH
OUT 40H, AL ; 写入计数器初值的高8位
MOV AX, 1F40H ; 计数器重载值,1秒钟
OUT 40H, AL
MOV AL, AH
OUT 40H, AL ; 写入计数器重载值的高8位
; 恢复现场
EndOfInt:
POP DX
POP CX
POP BX
POP AX
IRET
; 程序结束
MOV AH, 4CH
INT 21H
END START
```
该程序会在8255A的端口A上控制一个发光二极管LED的点亮和熄灭,利用计数器0和计数器1实现1秒钟的延时和中断,以及中断处理程序中重置计数器0的值。