📄 jh2.asm
字号:
C8253 EQU 22BH
;8253控制口
JSQ0 EQU 228H ;通道0
Z8279 EQU 212H ;8279控制口
D8279 EQU 210H ;8279数据口
O8259 EQU 200H ;8259偶地址
J8259 EQU 201H ;8259奇地址
CODE SEGMENT
ASSUME CS:CODE
START PROC FAR
PUSH DS
MOV AX,0
PUSH AX
JMP SSTT
LED DB 3FH,06H,5BH,4FH,66H;0—9 的LED显示
DB 6DH,7DH,07H,7FH,6FH
ap dw 7700h
HOUR DW 11 ;小时
MIN DW 59 ;分钟
SEC DW 40 ;秒
ap1 dw 7300h
HOUR1 DW 0 ;小时
MIN1 DW 0 ;分钟
SEC1 DW 10 ;秒
zd db 1
dn db 0
edd db 0
DISPCODE DB 8 DUP(0) ;用于存放每次的计数值
SSTT:
cli
MOV AX,CS
MOV DS,AX
;----------8255初始化-----------
mov al,80h
mov dx,233h
out dx,al
mov dx,230h
mov al,0ffh
out dx,al
;--------8253初始化-------
MOV DX,C8253
MOV AL,00110110B ;通道0,先读/写计数器低字节,后读/写高字节,方式3,二进制计数
OUT DX,AL
MOV DX,JSQ0;从通道0输出计数初值3000
MOV AX,3000
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,C8253
MOV AL,01110110B ;通道1,先读/写计数器低字节,后读/写高字节,方式3,二进制计数
OUT DX,AL
MOV DX,229h ;从通道0输出计数初值100
MOV AX,100
OUT DX,AL
MOV AL,AH
OUT DX,AL
;------8259初始化------
MOV DX,O8259
MOV AL,13H ;00010011B,边缘触发,单级使用
OUT DX,AL;--ICW1----
MOV DX,J8259
MOV AL,08H ;中断类型码
OUT DX,AL ;---ICW2----
MOV AL,01H ;非特殊完全嵌套方式,非缓冲方式,非自动EOI方式
OUT DX,AL ;---ICW4---
MOV AL,0FEH ;仅保留IR0的中断请求,屏蔽掉IR1—IR7的中断请求
OUT DX,AL ;---OCW1----
;------中断向量表的装填-------08H*4=20H-----
PUSH DS
MOV AX,0
MOV DS,AX
MOV BX,OFFSET INT0
MOV SI,20H
MOV [SI],BX
MOV BX,CS
MOV SI,22H
MOV [SI],BX
POP DS
;----8279初始化-------
MOV DX,Z8279
MOV AL,00H ;8字符显示,左入口,编码扫描键盘,双键所定
OUT DX,AL
MOV AL,38H ;24分频
OUT DX,AL
mov di,offset ap
call xianshi
sti
t4: mov di,offset ap
sti
mov cx,90h
push cx
t2: mov ah,01h
mov dx,212h
in al,dx
and al,0fh
jz t1
mov al,40h
out dx,al
mov dx,210h
in al,dx
cmp al,0ah ;a为调时间
jnz y0
cli
mov ah,0h
lea di, ap
jmp aa
y0: cmp al,0ch ;c为调定时
jnz t4
mov ah,0h
lea di, ap1
aa:
t5: mov dx,212h
pop cx
push cx
mov al,cl
out dx,al
mov dx,210h
mov cx,2h
mov al,0
t: out dx,al
loop t
mov cx,0ffffh
loop $
t1:
call xianshi
cmp ah,1h
jz t2
mov cx,0ffffh
loop $
mov dx,212h
in al,dx
and al,0fh
jz t5
mov al,40h
out dx,al
mov dx,210h
in al,dx
cmp al,13h ;读‘+’号加1
jnz t3
pop cx
push cx
cmp cx,90h
jnz loop22
mov bx,1
ADD 6[di],bx
mov bx,60
CMP 6[di],bx
JNZ t5 ;SEC≠60时跳
mov bx,0
MOV 6[di],bx
jmp t5
LOOP22:
cmp cx,92h
jnz loop33
mov bx,1
ADD 4[di],bx
mov bx, 60
CMP 4[di],bx
JNZ t5;MIN≠60时跳转
mov bx,0
MOV 4[di],bx
jmp t5
LOOP33:
mov bx,1
ADD 2[di],bx
mov bx,12
CMP 2[di],bx
JNZ t5 ;HOUR≠12时跳转
mov bx, 0
MOV 2[di],bx
cmp [di],7700h
jz f11
mov [di],7700h
jmp loop44
f11:mov [di],7300h
LOOP44: jmp t5
t3: cmp al,12h ; 读‘-’号 改另一个
jz tt5
jmp t5
tt5: pop cx
add cx,2
push cx
cmp cx,96h
jnz tt4
jmp t4
tt4: jmp t5
xianshi proc
push di
push ax
mov si,di
MOV BX,OFFSET LED
MOV DI,OFFSET DISPCODE
MOV AX,6[si]
CALL HUANMA
MOV AX,4[si]
CALL HUANMA
MOV AX,2[si]
CALL HUANMA
mov ax,[si]
mov [di],al
mov 1[di],ah
;----------显示部分--------
MOV DX,Z8279
MOV AL,90H
OUT DX,AL ;写显示RAM命令
MOV DX,D8279
MOV DI,OFFSET DISPCODE
MOV CX,8
LOP1:
MOV AL,[DI]
OUT DX,AL
INC DI
LOOP LOP1
pop ax
pop di
ret
xianshi endp
HUANMA PROC
MOV CL,10
DIV CL ;AX/CL,商在AL中,余数在AH中
PUSH AX
MOV AL,AH
LEA BX,LED
XLAT
MOV [DI],AL
INC DI
POP AX
XLAT
MOV [DI],AL
INC DI
RET
HUANMA ENDP
INT0 PROC
PUSH AX
PUSH DX
push cx
push bx
ADD SEC,1
LOOP1:
cmp zd,1
jz mn
mov al,0ffh
mov dx,230h
out dx,al
mov al,1
mov zd,al
mn: mov bl,[edd]
cmp bl,0
jz n1
mov bx,[sec]
cmp dn,bl
jnz n1
mov al,0ffh
mov dx,230h
out dx,al
mov al,0
mov [edd],al
n1:
CMP SEC,60
JNZ LOOP2 ;SEC≠60时跳转
MOV SEC,0
ADD MIN,1
LOOP2:
CMP MIN,60
JNZ LOOP3 ;MIN≠60时跳转
MOV MIN,0
ADD [HOUR],1
mov al,0feh
mov dx,230h
out dx,al
mov al,0
mov zd,al
LOOP3:
CMP HOUR,12
JNZ LOOP4 ;HOUR≠12时跳转
MOV HOUR,0
cmp ap,7700h
jz f1
mov ap,7700h
jmp loop4
f1:mov ap,7300h
LOOP4:
mov ax,hour
cmp ax,hour1
jz m1
jmp m
m1:mov ax,min
cmp ax,min1
jz m2
jmp m
m2:mov ax,sec
cmp ax,sec1
jz m3
jmp m
m3:mov ax,sec
cmp ax,sec1
jz m4
jmp m
m4:mov al,1
mov edd,al
mov ax,sec
mov dn,al
mov al,0fh
mov dx,230h
out dx,al
m: MOV DX,O8259
MOV AL,20H ;普通EOI结束方式
OUT DX,AL ;---OCW2----
pop bx
pop cx
POP DX
POP AX
IRET ;中断返回
INT0 ENDP
MOV AH,4CH
INT 21H
START ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -