📄 电子钟.txt
字号:
CODE SEGMENT
ASSUME CS:CODE
INTPORT1 EQU 0020H ;8253控制寄存器地址
INTPORT2 EQU 0021H
INTQ3 EQU INTREEUP3
CONTPORT EQU 00DFH
DATAPORT EQU 00DEH
KZZ EQU 73H ;8255控制字寄存器地址
BDZ EQU 71H ;B口地址
ORG 1000H
START: JMP Tint1
DATA0 DB 40H,77H,00H,00H,00H,00H,00H,00H
DATA1 DB 40H,73H,00H,00H,00H,00H,00H,00H
RIQI DB 00H,00H,00H,00H,00H,00H,00H,00H
NAOZ0 DB 40H,77H,40H,00H,00H,40H,00H,00H
NAOZ1 DB 40H,73H,40H,00H,00H,40H,00H,00H
DATA DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
Tint1: MOV DX,004BH ;8253定时器初始化
MOV AL,0B6H ;设置定时器2工作于方式3
OUT DX,AL
MOV DX,004AH ;写计数初值 0C350
MOV AL,50H ;计数初值低位
OUT DX,AL
MOV AL,0C3H ;计数初值高位
OUT DX,AL
CLD ;写中断 8259
MOV AX,0H
MOV DS,AX
MOV AX,0H
MOV ES,AX
MOV DI,002CH ;IRQ3向量地址
LEA AX,INTQ3
STOSW
MOV AX,CS
STOSW
MOV AL,13H ;初始化命令字
MOV DX,INTPORT1 ;ICW1 1
OUT DX,AL
MOV AL,08H ;ICW2
MOV DX,INTPORT2
OUT DX,AL
MOV AL,00001101B ;ICW4
OUT DX,AL
MOV AL,0F7H ;操作字命令字OCW1,开放IRQ3
OUT DX,AL
MOV BYTE PTR DS:[0620H],0CH ;存放功能按键值
MOV BYTE PTR DS:[0621H],03H ;设置闰年标志位
MOV BYTE PTR DS:[0600H],00H ;设置上下午标志位
MOV BYTE PTR DS:[0601H],00H ;存放20次中断计数
MOV BYTE PTR DS:[0602H],57 ;S
MOV BYTE PTR DS:[0603H],59 ;M
MOV BYTE PTR DS:[0604H],11 ;H
MOV BYTE PTR DS:[0605H],12 ;日
MOV BYTE PTR DS:[0606H],12 ;月
MOV BYTE PTR DS:[0607H],07 ;年低字节
MOV BYTE PTR DS:[0608H],20 ;年高字节
MOV BYTE PTR DS:[0612H],00H ;闹钟秒
MOV BYTE PTR DS:[0609H],00H ;闹钟分
MOV BYTE PTR DS:[0610H],01H ;闹钟时
MOV BYTE PTR DS:[0611H],01H ;闹钟上下午
STI
WATING: JMP WATING
INTREEUP3:MOV AH,BYTE PTR DS:[0612H]
CMP BYTE PTR DS:[0602H],AH ; 闹钟判断
JNE KAISHI
MOV AH,BYTE PTR DS:[0609H]
CMP BYTE PTR DS:[0603H],AH ; 闹钟判断
JNE KAISHI
MOV AH,BYTE PTR DS:[0610H]
CMP BYTE PTR DS:[0604H],AH ;
JNE KAISHI
MOV AH,BYTE PTR DS:[0611H]
CMP BYTE PTR DS:[0600H],AH ;
JNE KAISHI
JMP NAOLING
KAISHI:JMP SJXS
GONGYONG: ADD BYTE PTR DS:[0601H],01H ;此代码上下午公用,计时的主体
CMP BYTE PTR DS:[0601H],19 ;20*50000 用于产生一秒
JA MIAO
JMP INTRE1 ;小于等于时转移
MIAO: MOV BYTE PTR DS:[0601H],00H ;秒
MJY:ADD BYTE PTR DS:[0602H],01H
CMP BYTE PTR DS:[0602H],59
JA FEN
JMP INTRE1
FEN: MOV BYTE PTR DS:[0602H],00H ;分
FJY:ADD BYTE PTR DS:[0603H],01H
CMP BYTE PTR DS:[0603H],59
JA SHI
JMP INTRE1
SHI:MOV BYTE PTR DS:[0603H],00H ;时
SJY: ADD BYTE PTR DS:[0604H],01H
CMP BYTE PTR DS:[0604H],12
JE SX2
JMP INTRE1
SX2:MOV BYTE PTR DS:[0604H],00H
SXW:ADD BYTE PTR DS:[0600H],01H ;置上下午标志位
CMP BYTE PTR DS:[0600H],01H
JA RI
JMP INTRE1
RI: MOV BYTE PTR DS:[0600H],00H ;日
RJY:ADD BYTE PTR DS:[0605H],01H
CMP BYTE PTR DS:[0606H],2 ;月为2时为28天,闰年时为29天
JE XXXT
CMP BYTE PTR DS:[0606H],4 ;月为4、6、9、11时30天
JE XT
CMP BYTE PTR DS:[0606H],6
JE XT
CMP BYTE PTR DS:[0606H],9
JE XT
CMP BYTE PTR DS:[0606H],11
JE XT
CMP BYTE PTR DS:[0605H],31
JBE INTRE1
XT:CMP BYTE PTR DS:[0605H],30
JBE INTRE1
XXT:
CMP BYTE PTR DS:[0605H],29
JBE INTRE1
MOV BYTE PTR DS:[0621H],00
JMP TAO
XXXT:CMP BYTE PTR DS:[0621H],04
JE XXT
CMP BYTE PTR DS:[0605H],28
JBE INTRE1
TAO:MOV BYTE PTR DS:[0605H],01H ;月的第一天
YJY:ADD BYTE PTR DS:[0606H],01H
CMP BYTE PTR DS:[0606H],12
JBE INTRE1
MOV BYTE PTR DS:[0606H],01H
NJY:ADD BYTE PTR DS:[0607H],01H ;年低字节
ADD BYTE PTR DS:[0621H],01H ;闰年标志位加1,当加到4时清零
CMP BYTE PTR DS:[0621H],05
JBE FR
FR:CMP BYTE PTR DS:[0607H],99
JBE INTRE1
MOV BYTE PTR DS:[0607H],00H ;年高字节
NGJY:ADD BYTE PTR DS:[0608H],01H
CMP BYTE PTR DS:[0608H],20
JBE INTRE1
MOV BYTE PTR DS:[0608H],19
INTRE1: MOV AL,20H ;中断结束
;如果ICW4为00001011B
MOV DX,INTPORT1 ;OCW2命令可以不写,因为20H命令字就是EOI置1
OUT DX,AL
STI
IRET
CONVERS:AAM ;改变DATA数组值
MOV BH,0H
MOV BL,AL
MOV AL,[BX+DATA]
MOV [DI],AL
INC DI
MOV BH,0H
MOV BL,AH
MOV AL,[BX+DATA]
MOV [DI],AL
RET
SJXS:MOV DX,00DFH ;时间显示
IN AL,DX
AND AL,01H
JZ PDGN
MOV CX,0FFFH
D:LOOP D ; 为数模信号转换提供输出延时
MOV DX,00DEH
IN AL,DX ; 时间
CMP AL,0CH ;〉=C的按键是功能键
JB TSJ ;小于0C时跳过存储功能键,转调时间
MOV BYTE PTR DS:[0620H],AL ;将按键值存入功能判断单元
TSJ: CMP AL,01H
JNE TSJ0
JMP MJY ;秒加一
TSJ0:CMP AL,02H
JNE TSJ1
JMP FJY ;分加一
TSJ1:CMP AL,03H
JNE TSJ2
JMP SJY ;时加一
TSJ2:CMP AL,04H
JNE TRQ
JMP SXW ;调上下午
TRQ: CMP AL,05H ;调日期
JNE TRQ0
JMP RJY ;日加一
TRQ0:CMP AL,06H
JNE TRQ1
JMP YJY ;月加一
TRQ1:CMP AL,07H
JNE TNZ
JMP NJY
TNZ: CMP AL,08H ;设闹钟
JNE TNZ0
JMP NZFJY ;分加一
TNZ0:CMP AL,09H
JNE TNZ1
JMP NZSJY ;时加一
TNZ1:CMP AL,0AH
JNE NZT
JMP NZSXW ;设上下午
NZT:CMP AL,0BH ;闹钟停止
JNE PDGN
JMP NAOLINGT
PDGN:CMP BYTE PTR DS:[0620H],0CH ;按下C键显示时间
JE PDSHX
CMP BYTE PTR DS:[0620H],0DH ;按下D键显示日期
JNE NZH
JMP XSRQ
NZH:CMP BYTE PTR DS:[0620H],0EH ;按下E键后显示闹钟
JNE PDSHX
JMP XSNZ
PDSHX:CMP BYTE PTR DS:[0600H],01H ;判断上下午标志位
JNE SHWU
JMP XIAWU ;01时跳转执行下午
SHWU: CLI
MOV SI,0602H
LEA DI,DATA0+2
MOV AL,[SI]
CALL CONVERS
MOV SI,0603H
LEA DI,DATA0+4
MOV AL,DS:[SI]
CALL CONVERS
MOV SI,0604H
LEA DI,DATA0+6
MOV AL,DS:[SI]
CALL CONVERS
CALL LEDDISP ;调用显示
JMP GONGYONG
RET
XIAWU: CLI
MOV SI,0602H
LEA DI,DATA1+2
MOV AL,[SI]
CALL CONVERS
MOV SI,0603H
LEA DI,DATA1+4
MOV AL,DS:[SI]
CALL CONVERS
MOV SI,0604H
LEA DI,DATA1+6
MOV AL,DS:[SI]
CALL CONVERS
CALL LEDDISP
JMP GONGYONG
RET
LEDDISP:MOV AL,90H
MOV DX,00DFH ;CONTPORT
OUT DX,AL
MOV SI,0 ;SI初始化
MOV DX,00DEH
CMP BYTE PTR DS:[0600H],01H ;判断上下午标志位,置位时,执行下午代码
JE LEDXIAWU
LEDSHWU:MOV AL,[SI+DATA0] ;上午时间显示
OUT DX,AL
INC SI
CMP SI,8
JB LEDSHWU
JMP LEDD
LEDXIAWU:MOV AL,[SI+DATA1] ;下午时间显示
OUT DX,AL
INC SI
CMP SI,8
JB LEDXIAWU
LEDD: RET ;公用的返回
XSRQ: CLI ;显示日期主体程序
MOV SI,0605H
LEA DI,RIQI
MOV AL,[SI]
CALL CONVERS
MOV SI,0606H
LEA DI,RIQI+2
MOV AL,DS:[SI]
CALL CONVERS
MOV SI,0607H
LEA DI,RIQI+4
MOV AL,DS:[SI]
CALL CONVERS
MOV SI,0608H
LEA DI,RIQI+6
MOV AL,DS:[SI]
CALL CONVERS
CALL LEDDRIQI
JMP GONGYONG
RET
LEDDRIQI:MOV AL,90H
MOV DX,00DFH ;CONTPORT
OUT DX,AL
MOV SI,0
MOV DX,00DEH
LEDRQ:MOV AL,[SI+RIQI] ;日期显示
OUT DX,AL
INC SI
CMP SI,8
JB LEDRQ
RET
XSNZ: CMP BYTE PTR DS:[0611H],01H ;判断上下午标志位(显示闹钟)
JE NZXW ;置位时跳转执行下午
CLI ;闹钟上午
MOV SI,0609H
LEA DI,NAOZ0+3
MOV AL,[SI]
CALL CONVERS
MOV SI,0610H
LEA DI,NAOZ0+6
MOV AL,DS:[SI]
CALL CONVERS
CALL LEDNAOZ
JMP GONGYONG
RET
NZXW: CLI ;闹钟下午
MOV SI,0609H
LEA DI,NAOZ1+3
MOV AL,[SI]
CALL CONVERS
MOV SI,0610H
LEA DI,NAOZ1+6
MOV AL,DS:[SI]
CALL CONVERS
CALL LEDNAOZ
JMP GONGYONG
RET
LEDNAOZ:MOV AL,90H
MOV DX,00DFH ;CONTPORT
OUT DX,AL
MOV SI,0
MOV DX,00DEH
CMP BYTE PTR DS:[0611H],01H ;判断上下午标志位,置位时,执行下午代码
JE LEDNZXW
LEDNZSW:MOV AL,[SI+NAOZ0] ;上午时间显示
OUT DX,AL
INC SI
CMP SI,8
JB LEDNZSW
JMP LEDD1
LEDNZXW:MOV AL,[SI+NAOZ1] ;下午时间显示
OUT DX,AL
INC SI
CMP SI,8
JB
LEDNZXW
LEDD1: RET
NZFJY:ADD BYTE PTR DS:[0609H],01H ;闹钟分+1
CMP BYTE PTR DS:[0609H],59
JA NZS
JMP GONGYONG
NZS: MOV BYTE PTR DS:[0609H],00H ;闹钟时+1
NZSJY:ADD BYTE PTR DS:[0610H],01H
CMP BYTE PTR DS:[0610H],12
JA NZSX
JMP GONGYONG
NZSX: MOV BYTE PTR DS:[0610H],01H
NZSXW:ADD BYTE PTR DS:[0611H],01H ;置闹钟上下午标志位
CMP BYTE PTR DS:[0611H],01H
JA QINGL
JMP GONGYONG
QINGL: MOV BYTE PTR DS:[0611H],00H ;闹钟上下午标志清零
JMP GONGYONG
RET
NAOLING:MOV AL,80H ;8255方式0
MOV DX,KZZ
OUT DX,AL
MOV AL,0000H ;送数据至B口
MOV DX,BDZ
OUT DX,AL
JMP KAISHI
RET
NAOLINGT:MOV AL,80H
MOV DX,KZZ
OUT DX,AL
MOV AL,0FFFFH
MOV DX,BDZ
OUT DX,AL
JMP KAISHI
RET
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -