电子钟程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.MODEL SMALL
.8086
.STACK
============赋初始值==================
DSEG SEGMENT
SECOND DB 00 ;秒
MINUTE DB 58 ;分钟
O_CLOCK DB 10 ;时
DAY DB 5 ;星期
SECOND_L DB 1FH ;秒的低位位选
SECOND_H DB 2FH ;高位
MINUTE_L DB 37H ;分的位选
MINUTE_H DB 3BH ;
O_CLOCK_L DB 3DH ;时的位选
O_CLOCK_H DB 3EH ;
_DAY DB 37H ;礼拜的位选
CLEAR_1 DB 0FFH ;位清零
CLEAR_2 DB 00H ;段清零
ADDRESS_A DW 0200H ;A口地址位选
ADDRESS_B DW 0202H ;B口地址段选
ADDRESS_C DW 0204H ;C口地址按钮输入
ADDRESS_CONTROL DW 0206H ;控制地址
CRT0_COUNT DW 1000 ;计数器0的初始值
TIME_COUNT DB 00 ;记录中断的次数每中断次数达4,置零,用于判断两秒时间LED_CODE DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH ;0到9显示段选数据
MOV DX,1E06H ;8255控制字
MOV AL,81H
OUT DX,AL
MOV DX,1C06H ;8253控制字
MOV AL,76H ;0
OUT DX,AL
MOV DX,1C02H
MOV AX,1000
OUT DX,AL
MOV AL,AH
OUT DX,AL
MODELL_Z0 DB 0FEH ;模式选择字
O_CLOCK_SET_Z1 DB 0FDH ;时钟设置字
MINUTE_SET_Z2 DB 0FBH ;分钟设置字
SECOND_SET_Z3 DB 0F7H ;秒设置字
DAY_SET_Z4 DB 0EFH ;天设置字
NUM_BUTTON DB 0 ;屏蔽字
DSEG ENDS
====================代码段========================
.CODE
ASSUME DS:DSEG
START:MOV AX,DSEG
MOV DS,AX
XOR AX,AX
MOV ES,AX
MOV SI,0008H
MOV AX,OFFSET WORD PTR INTERRUPT ; 取中断服务程序的IP地址
MOV ES:[SI],AX ;
MOV AX,CS ; 取中断服务程序的段地址
INC SI
INC SI
MOV ES:[SI],AX ; 将中断服务程序的段地址及ip放在中断类型码2的位置 CALL ININT8255
CALL ININT8253
CYCLE: CALL SET
JMP CYCLE
============按键检测设置程序========================
SET FAR PROC
PUSHF
PUSH AX
PUSH DX
PUSH BX
MOV DX,ADDRESS_C
IN AL,DX
XOR AL,0FFH
TEST AL,1
JZ H0
CALL DELAY10MS ;延时按键去除抖动
IN AL,DX
XOR AL,0FFH
TEST AL,1
JZ H0
H7: IN AL,DX
JZ H7
MOV AL,NUM_BUTTON
INC AL
MOV NUM_BUTTON,AL
H0: MOV AL,NUM_BUTTON
CMP AL,0
JNZ H1
CALL DISPLAY
H1: MOV AL,NUM_BUTTON
CMP AL,1
JNZ H2
CALL SECOND_SET
H2: MOV AL,NUM_BUTTON
CMP AL,2
JNZ H3
CALL MINUTE_SET
H3: MOV AL,NUM_BUTTON
CMP AL,3
JNZ H4
CALL O_CLOCK_SET
H4: MOV AL,NUM_BUTTON
CMP AL,4
JNZ H5
CALL DAY_SET
H5: MOV AL,NUM_BUTTON
CMP AL,5
JNZ H6
MOV AL,0
MOV NUM_BUTTON,AL
H6:POP BX
POP DX
POP AX
POPF
RET
SET ENDP
====================秒设置子程序======================== SECOND_SET FAR PROC
PUSHF
PUSH AX
MOV AL,1
MOV TIME_COUNT,AL
MOV DX,ADDRESS_C IN AL,DX
XOR AL,0FFH
TEST AL,2
JZ SECOND_END
CALL DELAY10MS
IN AX,DX
XOR AL,0FFH
TEST AL,2
JZ SECOND_END
SECOND1: IN AL,DX
TEST AL,2
JZ SECOND1
MOV AL,SECOND
INC AL
MOV SECOND,AL
CMP AL,60
JB SECOND_END
MOV AL,0
MOV SECOND,AL
SECOND_END: CALL DISPLAY
POP DX
POP AX
POPF
RET
SECOND_SET ENDP
=================分钟设置子程序================ MINUTE_SET FAR PROC
PUSHF
PUSH AX
PUSH DX
MOV AL,1
MOV TIME_COUNT,AL
MOV DX,ADDRESS_C ; IN AL,DX
XOR AL,0FFH
TEST AL,2
JZ MINUTE_END
CALL DELAY10MS
IN AL,DX
XOR AL,0FFH
JZ MINUTE_END
MINUTE1:IN AL,DX
TEST AL,2
JZ MINUTE1
MOV AL,MINUTE
INC AL
MOV MINUTE,AL
CMP AL,60
JB MINUTE_END
MOV AL,0
MOV MINUTE,AL
MINUTE_END: CALL DISPLAY
POP DX
POP AX
POPF
RET
MINUTE_SET ENDP
====================小时设置子程序======================== O_CLOCK_SET FAR PROC
PUSHF
PUSH AX
PUSH DX
MOV AL,1
MOV TIME_COUNT,AL
MOV DX,ADDRESS_C
IN AL,DX
XOR AL,0FFH
TEST AL,2
JZ O_CLOCK_END
CALL DELAY10MS
IN AX,DX
XOR AL,0FFH
TEST AL,2
JZ O_CLOCK_END
O_CLOCK1:IN AL,DX
TEST AL,2
JZ O_CLOCK1
MOV AL,O_CLOCK
INC AL
MOV O_CLOCK,AL
CMP AL,24
JB O_CLOCK_END
MOV AL,0
MOV O_CLOCK,AL
O_CLOCK_END: CALL DISPLAY
POP DX
POP AX
POPF
RET
O_CLOCK_SET ENDP
====================星期设置子程序================ DAY_SET FAR PROC
PUSHF
PUSH AX
PUSH DX
MOV AL,3
MOV TIME_COUNT,AL
MOV DX,ADDRESS_C IN AL,DX
XOR AL,0FFH
TEST AL,2
JZ DAY_END
CALL DELAY10MS
IN AX,DX
XOR AL,0FFH
TEST AL,2
JZ DAY_END
DAY1:IN AL,DX
TEST AL,2
JZ DAY1
MOV AL,DAY
INC AL
MOV DAY,AL
CMP AL,8
JB DAY_END
MOV AL,1
MOV DAY,AL
DAY_END: CALL DISPLAY
POP DX
POP AX
POPF
RET
DAY_SET ENDP
===============显示子程序=============== DISPLAY FAR PROC
PUSH AX
K0: MOV AL,TIME_COUNT
CMP AL,4
JC K1
MOV BYTE PTR TIME_COUNT,0
K1: MOV AL,TIME_COUNT
CMP AL,2
JC K2
CALL DISPLAY_DAY
JMP K3
K2: CALL DISPLAY_TIME
K3: POP AX
POPF
RET
DISPLAY ENDP
====================星期显示子程序======================== DISPLAY_DAY FAR PROC
PUSHF
PUSH DX
PUSH AX
MOV DX,ADDRESS_A ;位清零
MOV AL,CLEAR_1
OUT DX,AL
MOV DX,ADDRESS_B ;段清零
MOV AL,CLEAR_2
OUT DX,AL ;
XOR BX,BX ;星期显示
MOV BL,DAY
MOV AL,LED_CODE+[BX]
OUT DX,AL
MOV AL,_DAY
MOV DX,ADDRESS_A
OUT DX,AL
POP AX
POP DX
POPF
RET
DISPLAY_DAY ENDP
====================时分秒显示子程序======================== DISPLAY_TIME FAR PROC
PUSHF
PUSH BX
PUSH AX
MOV DX,ADDRESS_A ;位清零
MOV AL,CLEAR_1
OUT DX,AL
MOV DX,ADDRESS_B ;段清零
MOV AL,CLEAR_2
OUT DX,AL ;
XOR AX,AX
MOV AL,SECOND ;秒显示 MOV BL,10
DIV BL
XOR BX,BX
MOV BL,AL
MOV AL,LED_CODE+[BX] ;高位
OUT DX,AL
MOV DX,ADDRESS_A
MOV AL,SECOND_H
OUT DX,AL
MOV DX,ADDRESS_A ;清零
MOV AL,CLEAR_1
OUT DX,AL
MOV DX,ADDRESS_B
MOV AL,CLEAR_2
OUT DX,AL ;
MOV BL,AH
MOV AL,LED_CODE+[BX] ;低位
OUT DX,AL
MOV DX,ADDRESS_A
MOV AL,SECOND_L
OUT DX,AL
MOV DX,ADDRESS_A ;清零
MOV AL,CLEAR_1
OUT DX,AL
MOV DX,ADDRESS_B
MOV AL,CLEAR_2
OUT DX,AL ;
XOR AX,AX ;分钟显示 MOV AL,MINUTE
MOV BL,10
DIV BL
XOR BX,BX
MOV BL,AL
MOV AL,LED_CODE+[BX] ;高位
OUT DX,AL
MOV DX,ADDRESS_A
MOV AL,MINUTE_H
OUT DX,AL
MOV DX,ADDRESS_A ;清零
MOV AL,CLEAR_1
OUT DX,AL
MOV DX,ADDRESS_B
MOV AL,CLEAR_2
OUT DX,AL ;
MOV BL,AH
MOV AL,LED_CODE+[BX] ;低位
OUT DX,AL
MOV DX,ADDRESS_A
MOV AL,MINUTE_L
OUT DX,AL
MOV DX,ADDRESS_A ;清零
MOV AL,CLEAR_1
OUT DX,AL
MOV DX,ADDRESS_B
MOV AL,CLEAR_2
OUT DX,AL ;
XOR AX,AX ;时钟显示 MOV AL,O_CLOCK
MOV BL,10
DIV BL
XOR BX,BX
MOV BL,AL
MOV AL,LED_CODE+[BX] ;高位
OUT DX,AL
MOV DX,ADDRESS_A
MOV AL,O_CLOCK_H
OUT DX,AL
MOV DX,ADDRESS_A ;清零
MOV AL,CLEAR_1
OUT DX,AL
MOV DX,ADDRESS_B
MOV AL,CLEAR_2
OUT DX,AL ;
MOV BL,AH
MOV AL,LED_CODE+[BX] ;低位
OUT DX,AL
MOV DX,ADDRESS_A
MOV AL,O_CLOCK_L
OUT DX,AL
MOV DX,ADDRESS_A ;清零
MOV AL,CLEAR_1
OUT DX,AL
MOV DX,ADDRESS_B
MOV AL,CLEAR_2
OUT DX,AL ;
POP DX
POP AX
POP BX
POPF
RET
DISPLAY_TIME ENDP
=========================初始化8255===================
ININT8255 FAR PROC
PUSH DX
PUSH AX
PUSHF
MOV DX,1E06H ;8255控制寄存器端口地址送DX
MOV AL,81H
OUT DX,AL ;方式控制字送控制寄存器
POPF
POP AX
POP DX
RET
ININT8255 ENDP
=========================初始化8253===================
ININT8253 FAR PROC
PUSH DX
PUSH AX
PUSHF
MOV DX,0406H ;选计数器0,双字节计数器,方式3方波,二进制计数 MOV AL,34H
OUT DX,AL ;计数值写入计数器0
MOV DX,0400H
MOV AX,1000
OUT DX,AL
MOV AL,AH
OUT DX,AL
POPF
POP AX
POP DX
RET
ININT8253 ENDP
======================中断===================
INTERRUPT FAR PROC
PUSHF
PUSH AX
MOV AL,NUM_BUTTON CMP AL,0
JNBE NEXT4
MOV AL,TIME_COUNT INC AL
MOV TIME_COUNT,AL MOV AL,SECOND
INC AL
MOV SECOND,AL
CMP AL,60
JC NEXT1
MOV AL,0
MOV SECOND,AL
MOV AL,MINUTE
INC AL
MOV MINUTE,AL NEXT1: MOV AL,MINUTE
CMP AL,60
JC NEXT4
MOV AL,0
MOV MINUTE,AL
MOV AL,O_CLOCK
INC AL
MOV O_CLOCK,AL NEXT2: MOV AL,O_CLOCK
CMP AL,24
JC NEXT4
MOV AL,0
MOV O_CLOCK,AL
MOV AL,DAY
INC AL
MOV DAY,AL NEXT3: MOV AL,DAY
CMP AL,8
JC NEXT4
MOV AL,1
MOV DAY,AL
NEXT4: POP AX
POPF
IRET
INTERRUPT ENDP
======================延时10MS程序======================== DELAY10MS FAR PROC
PUSHF
PUSH CX
PUSH BX
MOV BX,10
LP1:MOV CX,10
LP2:LOOP LP2
DEC BX
JNZ LP1
POP BX
POP CX
POPF
RET
DELAY10MS ENDP
CODE ENDS
END。