利用8259,8254,8255实现以秒为单位的计时。(第一次写博客,有什么不懂就留言吧!)
TIMER0 EQU 0600H
TIMER1 EQU 0602H
TIMER2 EQU 0604H
TIMERM EQU 0606H
P8255A EQU 0640H
P8255B EQU 0642H
P8255C EQU 0644H
P8255M EQU 0646H
DATA SEGMENT
DISCODE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0–7的显示代码
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;8–F的显示代码
INDEX DB 6,5,4,3,2,1,0CCH,0CCH
DYNBUFF DB 06H,5BH,4FH,66H,6DH,7DH,00H,00H ;动态显示缓冲
LEDCODE DB 00H,00H,00H,00H,00H,00H,00H,00H ;动态显示位置控制
HOUR DB 12 ;小时
MINUTE DB 34 ;分钟
SECOND DB 26 ;秒
COUNT DB 00
STATUS DB 01H
DATA ENDS
SSTACK SEGMENT PARA STACK ‘STACK’
DW 32 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:SSTACK
START: MOV AX,DATA
MOV DS,AX
;--------------------------------------------------------------- 8255初始化
INITA: MOV DX, 0646H
MOV AL, 10000000B
OUT DX, AL
;--------------------------------------------------------------- 中断芯片
INITB: PUSH DS
MOV AX,0000H
MOV DS,AX
MOV AX,OFFSET MIR7
MOV SI,003CH
MOV [SI],AX
MOV AX,CS
MOV SI,003EH
MOV [SI],AX
MOV AX,OFFSET MIR6
MOV SI,0038H
MOV [SI],AX
MOV AX,CS
MOV SI,003AH
MOV [SI],AX
MOV AX, OFFSET SIR1
MOV SI, 00C4H
MOV [SI], AX
MOV AX, CS
MOV SI, 00C6H
MOV [SI], AX
CLI
POP DS
;--------------------------------------------------------------- 主
MOV AL,11H
OUT 20H,AL ;ICW1
MOV AL,08H
OUT 21H,AL ;ICW2
MOV AL,04H
OUT 21H,AL ;ICW3
MOV AL,01H
OUT 21H,AL ;ICW4
;-------------------------------------------------------------初始化从片8259
MOV AL, 11H
OUT 0A0H, AL ;ICW1
MOV AL, 30H
OUT 0A1H, AL ;ICW2
MOV AL, 02H
OUT 0A1H, AL ;ICW3
MOV AL, 01H
OUT 0A1H, AL ;ICW4
;---------------------------------------------------------------
MOV AL, 0FDH ;OCW1 = 1111 1101B
OUT 0A1H,AL
MOV AL,2BH ;OCW1 = 00101011B
OUT 21H,AL
STI
;AA1: NOP
; JMP AA1
;--------------------------------------------------------------- 定时器芯片
INITC:MOV DX, TIMERM
MOV AL,36H ;0011 0110
OUT DX,AL
MOV DX, TIMER0 ;计数器0
MOV AX,5000
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX, TIMERM
MOV AL,76H ;0111 0110
OUT DX,AL
MOV DX, TIMER1 ;计数器1
MOV AX,18432
OUT DX,AL
MOV AL,AH
OUT DX,AL
;---------------------------------------------------------------
BEGIN:;CALL DISPLY7
AA2: JMP AA2
;---------------------------------------------------------------
MIR7 PROC NEAR
PUSH AX
PUSH DX
MOV AX,0137H
INT 10H
CALL CONVERT1
CALL CONVERT2
CALL DISPLY7
MOV AL,20H
OUT 20H,AL
POP DX
POP AX
IRET
MIR7 ENDP
;---------------------------------------------------------------
MIR6 PROC NEAR
PUSH AX
PUSH DX
MOV AX,0136H
INT 10H
CALL TIME
MOV AL,20H
OUT 20H,AL
POP DX
POP AX
IRET
MIR6 ENDP
SIR1 PROC NEAR
PUSH AX
PUSH DX
MOV AL, 20H
OUT 0A0H, AL
OUT 20H, AL
POP DX
POP AX
IRET
SIR1 ENDP
TIME PROC NEAR ;
PUSH AX
PUSH DX
MOV AL,SECOND;
INC AL
MOV SECOND,AL
CMP AL,60
JB RESULT
MOV SECOND,0
MOV AL, MINUTE
INC AL
MOV MINUTE,AL
CMP AL,60
JB RESULT
MOV MINUTE,0
MOV AL, HOUR
INC AL
MOV HOUR,AL
CMP AL,24
JB RESULT
MOV HOUR,0
RESULT:NOP
POP DX
POP AX
RET
TIME ENDP
DISPLY1 PROC NEAR ;
PUSH AX
PUSH DX
MOV DX,P8255A
MOV AL,11111110B
OUT DX,AL
MOV DX,P8255B
MOV AL,DYNBUFF
OUT DX,AL
POP DX
POP AX
RET
DISPLY1 ENDP
DISPLY2 PROC NEAR ;
PUSH AX
PUSH DX
MOV DX,P8255A
MOV AL,11111101B
OUT DX,AL
MOV DX,P8255B
MOV AL,DYNBUFF+1
OUT DX,AL
POP DX
POP AX
RET
DISPLY2 ENDP
DISPLY3 PROC NEAR ;
PUSH AX
PUSH DX
MOV DX,P8255A
MOV AL,11111011B
OUT DX,AL
MOV DX,P8255B
MOV AL,DYNBUFF+2
OUT DX,AL
POP DX
POP AX
RET
DISPLY3 ENDP
DISPLY4 PROC NEAR ;
PUSH AX
PUSH DX
MOV DX,P8255A
MOV AL,11110111B
OUT DX,AL
MOV DX,P8255B
MOV AL,DYNBUFF+3
OUT DX,AL
POP DX
POP AX
RET
DISPLY4 ENDP
DISPLY5 PROC NEAR ;
PUSH AX
PUSH DX
MOV DX,P8255A
MOV AL,11101111B
OUT DX,AL
MOV DX,P8255B
MOV AL,DYNBUFF+4
OUT DX,AL
POP DX
POP AX
RET
DISPLY5 ENDP
DISPLY6 PROC NEAR ;
PUSH AX
PUSH DX
MOV DX,P8255A
MOV AL,11011111B
OUT DX,AL
MOV DX,P8255B
MOV AL,DYNBUFF+5
OUT DX,AL
POP DX
POP AX
RET
DISPLY6 ENDP
DISPLY7 PROC NEAR ;
PUSH AX
PUSH DX
MOV AL,STATUS
ROL AL,01H
MOV STATUS,AL
TEST AL,00000001B
JNZ DIS
TEST AL,00000010B
JNZ DIS1
TEST AL,00000100B
JNZ DIS2
TEST AL,00001000B
JNZ DIS3
TEST AL,00010000B
JNZ DIS4
TEST AL,00100000B
JNZ DIS5
DIS:CALL DISPLY1
JMP DOWN
DIS1:CALL DISPLY2
JMP DOWN
DIS2:CALL DISPLY3
JMP DOWN
DIS3:CALL DISPLY4
JMP DOWN
DIS4:CALL DISPLY5
JMP DOWN
DIS5:CALL DISPLY6
JMP DOWN
DOWN :NOP
POP DX
POP AX
RET
DISPLY7 ENDP
CONVERT1 PROC NEAR ;
PUSH AX
PUSH BX
XOR AH,AH ;HOUR
MOV AL,HOUR
MOV BL,10
DIV BL
; XLAT
MOV INDEX,AL
MOV INDEX+1,AH
XOR AH,AH ;MINUTE
MOV AL,MINUTE
MOV BL,10
DIV BL
; XLAT
MOV INDEX+2,AL
MOV INDEX+3,AH
XOR AH,AH ;SECOND
MOV AL,SECOND
MOV BL,10
DIV BL
; XLAT
MOV INDEX+4,AL
MOV INDEX+5,AH
POP BX
POP AX
RET
CONVERT1 ENDP
CONVERT2 PROC NEAR ;
PUSH AX
PUSH BX
LEA BX,DISCODE
MOV AL,INDEX
XLAT
MOV DYNBUFF,AL
MOV AL,INDEX+1
XLAT
MOV DYNBUFF+1,AL
MOV AL,INDEX+2
XLAT
MOV DYNBUFF+2,AL
MOV AL,INDEX+3
XLAT
MOV DYNBUFF+3,AL
MOV AL,INDEX+4
XLAT
MOV DYNBUFF+4,AL
MOV AL,INDEX+5
XLAT
MOV DYNBUFF+5,AL
POP BX
POP AX
RET
CONVERT2 ENDP
CODE ENDS
END START