实验内容
第三点参考代码
IO8253A EQU 280H
IO8253B EQU 281H
IO8253C EQU 282H
IO8253D EQU 283H
DATAS SEGMENT
TEMP DW 0, 0, 0, 0
STRING_1 DB 'counter1:', '$'
STRING_2 DB 'counter2:', '$'
STRING_3 DB 'continue?(y/n)', '$'
DATAS ENDS
STACKS SEGMENT
DW 256 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MAIN:
MOV AX, 0
MOV AX,DATAS
MOV DS,AX
LEA DX, STRING_1
MOV AH, 9 ;9号功能显示提示字符串
INT 21H
LEA SI, TEMP
MOV AX, 0
MOV [SI], AX
MOV CX, 0
CALL KEYSCAN
MOV AX, [SI]
MOV [SI+2], AX ;保存T0参数存到
CALL SHOW ;显示AX十进制数值子程序,可注释
LEA DX, STRING_2
MOV AH, 9 ;9号功能显示提示字符串
INT 21H
MOV AX, 0
MOV [SI], AX
MOV CX, 0
CALL KEYSCAN
MOV AX, [SI]
MOV [SI+4], AX ;保存T0参数存到
CALL SHOW
LEA DX, STRING_3
MOV AH, 9
INT 21H
CALL ISY
MOV AX, [SI+6]
CMP AX, 0
JZ STOP
CALL SET
MOV AH, 2
MOV DX, 0DH ;加回车符
INT 21H
MOV DL, 0AH ;加换行符
INT 21H
JMP MAIN
STOP:
MOV AX, 4C00H
INT 21H
ISY PROC NEAR
YORN:
MOV AH, 8
INT 21H
CMP AL, 'y'
JE Y0
CMP AL, 'n'
JE N0
JMP YORN
Y0:
MOV AX, 1
MOV [SI+6], AX
JMP RETURN1
N0:
MOV AX, 0
MOV [SI+6], AX
JMP RETURN1
RETURN1:
MOV AH, 2
MOV DX, 0DH ;加回车符
INT 21H
MOV DL, 0AH ;加换行符
INT 21H
RET
ISY ENDP
;定时器/计数器设置子程序
SET PROC NEAR
S:
LEA SI, TEMP
;TO配置
MOV DX, IO8253D
MOV AL, 00110110B
OUT DX, AL
MOV DX, IO8253A
MOV AX, [SI+2]
OUT DX, AL
MOV AL, AH
OUT DX, AL
;T1配置
MOV DX, IO8253D
MOV AL, 01110100B
OUT DX, AL
MOV DX, IO8253B
MOV AX, [SI+4]
OUT DX, AL
MOV AL, AH
OUT DX, AL
RET
SET ENDP
;键盘读取子程序
KEYSCAN PROC NEAR
KEYBORD:
MOV AH, 8
INT 21H
CMP AL, 0DH
JNE KEY
JMP RETURN
KEY:
CMP AL, 39H ;不是'0'-'9'等待
JA CONTINUE
CMP AL, 30H
JB CONTINUE
SUB AL, 30H ;转换成数字
MOV BL, AL
MOV BH, 0
MOV AH, 0
PUSH BX
MOV AX, [SI] ;每收到一个数字之前的乘10,再加上刚输入的
MOV DX, 0
MOV BX, 10
MUL BX ;双字节乘法
POP BX
ADD AX, BX
MOV [SI], AX ;保存到si指向内存单元
MOV DL, BL
ADD DL, 30H
MOV DH, 0
MOV AH, 2
INT 21H
INC CX
CMP CX, 5
JNE CONTINUE
MOV AX, SI
CMP AX, 65535 ;大于65535取65535,防止溢出
JB RETURN
MOV AX, 65536
MOV [SI], AX
JMP RETURN
RETURN:
MOV AX, [SI]
AND AL, 0FEH ;最低位清零,计数值为偶数输出方波
MOV [SI], AX
MOV AH, 2
MOV DX, 0DH ;加回车符
INT 21H
MOV DL, 0AH ;加换行符
INT 21H
RET
CONTINUE:
JMP KEYBORD
KEYSCAN ENDP
;显示子程序
SHOW PROC NEAR ;显示子程序
S:
MOV BX, 10000
MOV CL, 0
;PUSH DX
L:
MOV DX, 0
DIV BX
MOV CH, AL
PUSH DX
MOV AH, 02H ;显示
ADD CH, 30H
MOV DL, CH
INT 21H
MOV DX, 0
MOV AX, BX
PUSH CX
MOV CX, 10
DIV CX
MOV BX, AX
POP CX
POP AX
INC CL
CMP CL, 5
JNE L
MOV AH, 2H
MOV DX, 0DH ;加回车符
INT 21H
MOV DL, 0AH ;加换行符
INT 21H
;POP DX
RET
SHOW ENDP
CODES ENDS
END START