172 lines
6.8 KiB
NASM
Executable File
172 lines
6.8 KiB
NASM
Executable File
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 |