将上面程序合成一个.asm格式的汇编语言总程序
时间: 2025-01-26 15:08:54 浏览: 32
将上述提供的多个部分合成为一个 `.asm` 格式的汇编语言总程序需要整合各个部分的功能,包括定时器 8254 和并行接口 8255 的初始化、中断服务程序、键盘扫描和数码管显示等功能。以下是整合后的完整程序:
```asm
; 文件名:TotalProgram.asm
; 功能描述:综合设计实验,包括定时器8254和并行接口8255的应用
IOYO EQU 0600H ; IOYO起始地址
A8254 EQU IOYO + 00H * 2
B8254 EQU IOYO + 01H * 2
C8254 EQU IOYO + 02H * 2
CON8254 EQU IOYO + 03H * 2
IOY1 EQU 0640H
A8255 EQU IOY1 + 00H * 2
B8255 EQU IOY1 + 01H * 2
C8255 EQU IOY1 + 02H * 2
CON8255 EQU IOY1 + 03H * 2
DDATA SEGMENT
YXDS DW 3E8H ; 运行定时
BUFF DB 6 DUP(0) ; 显示缓冲区,初值为0
XSSX DB 00H ; 显示顺序,0->5,数码管1->6
WM DB 0FEH ; 位码,初值为11111110B,从左到右,数码管1->6
DTABLE DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
KEY_STEP DB 00H ; 键盘扫描步骤
DEBOUNCE DB 00H ; 消抖时间
KEY_CODE DB 00H ; 按键代码
DDATA ENDS
SSTACK SEGMENT STACK
DW 32 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:SSTACK, DS:DDATA
START:
PUSH DS
MOV AX, 0000H
MOV DS, AX
MOV AX, OFFSET IRQ7 ; 取中断入口地址
MOV SI, 003CH ; 中断矢量地址
MOV [SI], AX ; 填IRQ7的偏移矢量
MOV AX, SEG IRQ7 ; 段地址
MOV SI, 003EH
MOV [SI], AX ; 填IRQ7的段地址矢量
POP DS
; 初始化主片8259
MOV AL, 11H
OUT 20H, AL
MOV AL, 08H
OUT 21H, AL
MOV AL, 04H
OUT 21H, AL
MOV AL, 01H
OUT 21H, AL
MOV AL, 6FH
OUT 21H, AL
; 初始化8254
MOV DX, CON8254
MOV AL, 36H ; 计数器0,方式3
OUT DX, AL
MOV DX, A8254
MOV AX, 1000
OUT DX, AL ; 初值低字节
MOV AL, AH
OUT DX, AL ; 初值高字节
MOV AL, 03H
OUT DX, AL
; 初始化8255
MOV DX, CON8255
MOV AL, 80H
OUT DX, AL
MOV BX, 8001H
STI
AA1: JMP AA1
IRQ7:
CLI
; 处理定时器中断
MOV DX, A8254
MOV AL, 04H
OUT DX, AL
; 更新运行定时
MOV AX, YXDS
DEC AX
MOV YXDS, AX
CMP AX, 00H
JNZ YXZS09
; 重置运行定时
MOV YXDS, 3E8H
; 显示字符'M'
MOV AX, 014DH
INT 10H ; 显示字符M
MOV AX, 0120H
INT 10H ; 显示空格
; 流水灯控制
CALL SHOWM
CALL LSDENG
YXZS09:
; 结束中断
MOV AL, 20H
OUT 20H, AL
IRET
SHOWM:
MOV AX, 014DH
INT 10H ; 显示字符M
MOV AX, 0120H
INT 10H ; 显示空格
RET
LSDENG:
MOV DX, A8255 ; 流水灯
MOV AL, BH
OUT DX, AL
ROR BH, 1
MOV DX, B8255
MOV AL, BL
OUT DX, AL
ROL BL, 1
RET
SCAN_KEY:
; 是否有按键按下
MOV DX, B8255
MOV AL, 00H
OUT DX, AL ; 灭数码管
MOV DX, A8255
MOV AL, 00H
OUT DX, AL ; 列线为0
MOV DX, C8255
IN AL, DX
AND AL, 0FH ; 保留低4位
CMP AL, 0FH
JE NO_KEY ; 无键按下
; 消抖动
MOV DEBOUNCE, 0FFH
DB_LOOP:
DEC DEBOUNCE
CMP DEBOUNCE, 00H
JNE DB_LOOP
; 判断哪个按键按下
MOV DX, A8255
MOV AL, 0FEH
OUT DX, AL ; 左边第一列
MOV DX, C8255
IN AL, DX
AND AL, 0FH
CMP AL, 0EEH
JE COM0 ; COM0 按下
CMP AL, 0EDH
JE COM4 ; COM4 按下
CMP AL, 0EBH
JE OM8 ; OM8 按下
CMP AL, 0E7H
JE OMC ; OMC 按下
NO_KEY:
MOV KEY_STEP, 00H
RET
COM0:
MOV KEY_CODE, 01H
JMP KEY_DONE
COM4:
MOV KEY_CODE, 02H
JMP KEY_DONE
OM8:
MOV KEY_CODE, 03H
JMP KEY_DONE
OMC:
MOV KEY_CODE, 04H
KEY_DONE:
; 判断按键是否弹起
MOV DX, B8255
MOV AL, 00H
OUT DX, AL ; 灭数码管
MOV DX, A8255
MOV AL, 00H
OUT DX, AL ; 列线为0
MOV DX, C8255
IN AL, DX
AND AL, 0FH
CMP AL, 0FH
JNE KEY_DONE
; 执行按键功能
CMP KEY_CODE, 01H
JE COM0_FUNC
CMP KEY_CODE, 02H
JE COM4_FUNC
CMP KEY_CODE, 03H
JE OM8_FUNC
CMP KEY_CODE, 04H
JE OMC_FUNC
COM0_FUNC:
; 执行COM0功能
; ...
RET
COM4_FUNC:
; 执行COM4功能
; ...
RET
OM8_FUNC:
; 执行OM8功能
; ...
RET
OMC_FUNC:
; 执行OMC功能
; ...
RET
CODE ENDS
END START
```
### 解释
1. **数据段 (`DDATA`)**: 包含了各种变量,如 `YXDS`(运行定时)、`BUFF`(显示缓冲区)、`XSSX`(显示顺序)、`WM`(位码)等。
2. **堆栈段 (`SSTACK`)**: 定义了一个32字节的堆栈。
3. **代码段 (`CODE`)**:
- **启动部分**: 设置中断向量表,初始化8259、8254和8255。
- **主循环**: 无限循环等待中断。
- **中断服务程序 (`IRQ7`)**: 处理定时器中断,更新运行定时,显示字符 'M',控制流水灯。
- **显示字符函数 (`SHOWM`)**: 显示字符 'M' 和空格。
- **流水灯控制函数 (`LSDENG`)**: 控制流水灯的闪烁。
- **键盘扫描函数 (`SCAN_KEY`)**: 检测按键,消抖动,判断按键位置,执行相应功能。
这个程序整合了定时器8254和并行接口8255的功能,实现了定时中断、字符显示、流水灯控制和键盘扫描。你可以根据具体需求进一步扩展和完善各部分功能。
阅读全文
相关推荐


















