first commit
This commit is contained in:
172
Lab/Lab6/material/code.asm
Executable file
172
Lab/Lab6/material/code.asm
Executable 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
|
||||
Reference in New Issue
Block a user