📄 8255a0-4.asm
字号:
;-------------------------------------------------------
; 程序说明
;实现功能:通过8255A(方式0)实现对输入最大值在数码管上从0
;开始递增显示到最大值,并循环。按小写字母a,暂停,再按继续,
;按回车程序退回DOS
;本程序在显示上有不足,高位数码管总有闪动。
;
;测试专用,仅供参考,适用于唐都TD-PIT实验箱 胖大海
;-------------------------------------------------------
DATA SEGMENT
IBUF DB 5,0,5 DUP(?) ;输入缓冲区
D_TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;段码表
W_TABLE DB 1111B,1110B,1101B,1011B,0111B ;位码表
INFOR1 DB "Please input circle (1~9999):$" ;提示信息
INFOR2 DB 10,13,"$"
MAXVALUE DW ? ;记录循环最大值
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
DSTRING MACRO MESSAGE ;显示提示信息的宏
PUSH DX
PUSH AX
MOV DX,OFFSET MESSAGE
MOV AH,09H
INT 21H
POP AX
POP DX
ENDM
MOV DX,1043H ;定义控制器端口地址
MOV AL,10000000B ;定义方式字,方式0、B口输出段码(PB0-PB7对应接A-Dp)、
;C口低4位输出位码(PC0-PC3对应接数码管的低位-高位)、
;A口没用到,随便设,这里定义的是输出
OUT DX,AL ;送方式字
MOV DI,0FFH ;初始化DI(判断是否为暂停的参数)。值为00FF循环,FF00暂停
DSTRING INFOR1 ;显示输入数字的提示,范围1~9999
CALL DTOB ;将键盘输入的十进制数转换为二进制数存于MAXVALUE中
MOV BX,0 ;计数从0开始,BX用来记录当前的计数值
MOV CX,0FH
LOOPR: CALL SHOWME ;将二进制数通过8255A显示到数码管上
LOOP LOOPR
IF_STOP:CMP DI,0FFH ;根据DI的内容判断是否暂停循环
JNE LOOPN
INC BX
CMP BX,MAXVALUE ;如果计数值超过定义的最大值,从0开始重新计数
JBE LOOPN
MOV BX,0
LOOPN: MOV AH,11 ;调用DOS的11号功能,判断是否有按键按下
INT 21H
CMP AL,0 ;如果没按键则功能调用返回值AL=0,所以将AL和0比较一下
JE LOOPR ;相等则继续循环显示,反之退出
MOV AH,8 ;如果按键,如果是字母a则DI值右循环8位
INT 21H
CMP AL,61H
JNE CHECK_K
MOV CL,8
ROL DI,CL
JMP IF_STOP
MOV CX,01H
CHECK_K:CMP AL,13 ;如果是回车则停止计算,其它按键不理
JNE LOOPR
MOV AL,0FH ;将数码管关掉,节约电力
MOV DX,1042H
OUT DX,AL
MOV AH,4CH
INT 21H
;-----------------------------------------------------------------
;将键盘输入的十进制数转换为二进制数的子程序DTOB
DTOB PROC NEAR
PUSHF
PUSH AX
PUSH CX
PUSH DX
PUSH SI
MOV DX,OFFSET IBUF
MOV AH,0AH
INT 21H
MOV CL,IBUF+1
MOV CH,0
MOV SI,OFFSET IBUF+2
MOV AX,0
AGAIN: MOV DX,10
MUL DX
AND BYTE PTR[SI],0FH
ADD AL,[SI]
ADC AH,0
INC SI
LOOP AGAIN
MOV MAXVALUE,AX
POP SI
POP DX
POP CX
POP AX
POPF
RET
DTOB ENDP
;-----------------------------------------------------------------
;-----------------------------------------------------------------
;将转换后的数字显示在数码管上
;按求十进制的方法从个位开始依次求出当前计数值各位的值,并显示出来
;每位的显示间有延迟
SHOWME PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV SI,1
MOV AX,BX
MOV CX,10
LOOP4: MOV DX,0
DIV CX
PUSH AX
PUSH BX
MOV BX,OFFSET D_TABLE ;先送段码到B口
MOV AL,DL
XLAT D_TABLE
MOV DX,1041H
OUT DX,AL
MOV BX,OFFSET W_TABLE ;再送位码到C口
MOV AX,SI
XLAT W_TABLE
MOV DX,1042H
OUT DX,AL
MOV BX,0FffFH ;这是通过循环实现延迟
WAIT1: DEC BX
CMP BX,0
JNE WAIT1
POP BX
POP AX
INC SI
OR AX,AX
JNZ LOOP4
POP SI
POP DX
POP CX
POP BX
POP AX
RET
SHOWME ENDP
;-----------------------------------------------------------------
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -