2025-05-27 16:03:52 +08:00

172 lines
6.8 KiB
NASM
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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