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