可编程定时器/计数器(8253)实验

实验内容

可编程定时器/计数器(8253)实验_第1张图片
可编程定时器/计数器(8253)实验_第2张图片

第三点参考代码

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	;大于6553565535,防止溢出
	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

你可能感兴趣的:(汇编,反汇编)