📄 qd.asm
字号:
TITLE QD PROGRAMM ;标题伪指令
DATA SEGMENT ;数据段定义
IOPORT EQU 5400H-280H ;I/O基址变量
;...............定义数据表,用以控制七段数码管
TABLE DB 3FH,06H,5BH,0 ;'0','1','2'的编码
DB 4FH,3 DUP(0) ;'3'的编码
DB 66H,7 DUP(0) ;'4'的编码
DB 6DH,15 DUP(0) ;'5'的编码
DB 7DH,31 DUP(0) ;'6'的编码
DB 07H,63 DUP(0) ;'7'的编码
DB 7FH ;'8'的编码
DATA ENDS
STACK1 SEGMENT PARA STACK ;定义堆栈段
DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA,SS:STACK1 ;定义cs,ds和ss寄存器
START: MOV AX,DATA ;将DATA段的地址送给DS寄存器,以便寻址时使用
MOV DS,AX
;................判断键盘输入条件
SHOW: MOV AH,1 ;DOS 01号功能调用
INT 21H
CMP AL,' ' ;是否是空格
JE QD ;等于转移,按下空格开始新一轮
JMP OUTF ;按下其他键退出程序
;................写控制端
QD: MOV DX,IOPORT+28BH ;将控制寄存器端口地址送入DX
MOV AL,8BH ;将 8BH控制字送入AL
OUT DX,AL ;将控制字送入控制寄存器,使8255工作方式为0,A口输出,B口和C口都是输入
CALL SHOW_ZERO ;先显示0
;................从C口读
MOV DX,IOPORT+28AH ;将C口地址送入DX
IN AL,DX ;将C口读入的数据送入AL
;................判断输入端数据并查表
CMP AL,00H ;检查C口读入的数据是否为0
JNE C ;不为0则跳转到"C"
JMP QD ;为0则继续抢答,直至不为0
C: MOV BX,OFFSET TABLE ;将数码管数据表的地址送入BX
XLAT ;查询TABLE表中偏移量为AL的数据,并送入AL中
;................从A口输出
DIS: MOV DX,IOPORT+288H ;将A口地址送入DX
OUT DX,AL ;将AL中的数据,也就是数码管的显示代码从A口输出
JMP SHOW ;继续下一轮的按键判断
;................退出程序
OUTF: MOV AX,4C00H ;终止当前程序并返回调用程序
INT 21H ;返回DOS
;................子程序,显示0
SHOW_ZERO PROC
MOV AL,3FH ;0是3FH
MOV DX,IOPORT+288H ;将A口地址送入DX
OUT DX,AL ;将0的显示代码从A口输出
RET ;返回主程序
ENDP ;结束子程序
CODE ENDS ;结束代码段
END START ;结束汇编
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -