first commit

This commit is contained in:
2025-05-27 16:03:52 +08:00
commit 2d22d07f60
223 changed files with 5842 additions and 0 deletions

172
Lab/Lab6/material/code.asm Executable file
View File

@@ -0,0 +1,172 @@
DATA SEGMENT
LED DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
OLD_OFF DW 0 ; 旧的中断偏移地址
OLD_SEG DW 0 ; 旧的中断段地址
CNT DW 0 ; 计数器
TMP DB 0 ; 临时变量
BUFFER DB 100 (0) ; 缓冲区大小为100字节初始化为0
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA, CS:CODE
START:
MOV AX, DATA
MOV DS, AX
; 保存旧的中断向量
MOV AX, 350BH ; 获取原来的中断号为0BH的中断向量
INT 21H ; 将中断向量的偏移地址存在BX段地址存在ES
MOV OLD_OFF, BX ; 分别将原来中断向量的偏移地址和段地址保存
MOV BX, ES
MOV OLD_SEG, BX
CLI
; 设置新的中断向量
MOV DX, SEG A_D ; 将新中断向量的段地址存入DX
MOV DS, DX ; 再装到DS
MOV DX, OFFSET A_D ; 将新中断向量的偏移地址存入DX
MOV AX, 250BH ; 装填到中断向量表里中断号为0BH的中断向量
INT 21H
; 重新加载数据段地址
MOV AX, DATA
MOV DS, AX
; 设置中断屏蔽
IN AL, 21H ; 读取中断屏蔽寄存器
AND AL, 11110111B ; 将第3位设置为1
OUT 21H, AL ; 将修改后的值写入中断屏蔽寄存器
STI ; 设置中断标志,允许跳转到中断程序
; 初始化8255
MOV DX, 283H ; 设置8255芯片的命令口
MOV AL, 10000000B ; 全输出
OUT DX, AL
; 启动ADC0809
MOV DX, 288H ; 设置ADC0809的命令口
OUT DX, AL ; 向ADC0809发送脉冲模式启动命令
MOV CX, 100 ; 转换次数
MOV SI, 0 ; 转换成功标志位,置零
LOOP1:
STI ; 设置中断标志,允许跳转到中断程序
IN AL, DX ; 从ADC0809读取转换结果
CMP SI, 1 ; 判断转换成功
JNE LOOP1 ; 如果转换未成功,则重新判断
CALL DELAY ; 延时
CLI ; 清除中断标志,禁止跳转到其他中断程序
MOV DX, 288H ; 重新打开ADC0809
OUT DX, AL
DEC CX
JZ FINISH ; 如果转换次数为0跳转到FINISH
JMP LOOP1
FINISH:
CLI ; 关中断
MOV AX, 250BH ; 恢复原来的中断向量
MOV DX, OLD_OFF
MOV DS, DX
MOV DS, OLD_SEG
INT 21H
MOV AX, 4C00H
INT 21H
A_D PROC FAR
PUSH AX ; 保护现场
PUSH DX
PUSH CX
MOV SI, 1 ; 设定转换标志位
MOV DX, 288H
IN AL, DX
MOV TMP, AL ; 保存数据
MOV DI, CNT
CMP DI, 100
JE DISPLAY
MOV BUFFER[DI], AL
INC DI
MOV CNT, DI
MOV CX, 6 ; 刷新6次
DISPLAY:
; 显示高四位
MOV AL, 0
MOV DX, 281H
OUT DX, AL
MOV AL, TMP
SHR AL, 4 ; 右移4位
MOV BX, OFFSET LED
XLAT ; 使用BX寄存器作为LED数组的索引将LED数组中下标为BX的值传给AL
MOV DX, 280H ; 段码
OUT DX, AL
MOV AL, 00000010B ; 倒数第2位显示AD转换结果的高4位
MOV DX, 281H ; 位码
OUT DX, AL
CALL DELAY2
; 显示低四位
MOV AL, 0
MOV DX, 281H
OUT DX, AL
MOV AL, TMP
AND AL, 00001111B
MOV BX, OFFSET LED
XLAT ; 使用BX寄存器作为LED数组的索引将LED数组中下标为BX的值传给AL
MOV DX, 280H ; 段码
OUT DX, AL
MOV AL, 00000001B ; 倒数第1位显示AD转换结果的低4位
MOV DX, 281H ; 位码
OUT DX, AL
CALL DELAY2
LOOP DISPLAY
STI
MOV AL, 20H ; 发送EOI指令
OUT 20H, AL
POP CX
POP DX
POP AX
IRET
A_D ENDP
DELAY PROC NEAR
PUSH CX
PUSH BX
MOV CX, 0FFFFH
LOOP2:
MOV BX, 01FH
LOOP3:
DEC BX
JNZ LOOP3
DEC CX
JNZ LOOP2
POP BX
POP CX
RET
DELAY ENDP
DELAY2 PROC NEAR
PUSH CX
PUSH BX
MOV CX, 0FFFFH
LOOP4:
MOV BX, 5
LOOP5:
DEC BX
JNZ LOOP5
DEC CX
JNZ LOOP4
POP BX
POP CX
RET
DELAY2 ENDP
CODE ENDS
END START