📄 clock.asm
字号:
;DESCRIPION:时钟程序:00H--05H 作为计时数据存储区,06H作为输出数据实际数据存储区,07H作为扫描信号扫描位
;置信息存储区,13H作为读数据的指针信息,09H,10H用作延时计数存储区,11H用
;作中断计数器;R0作为转存
;AUTHORS: WEIHONGLIN
;DATE: 2003.8.6
;VER: 1.0
;程序入口
ORG 0000H
LJMP MAIN
ORG 000bH
LJMP INT
ORG 030H
LJMP MAIN
MAIN:
;*************************初始化程序**********************************
;********定义数据存储区***********
;定义时间存储区
STATE EQU 20H
THH0 EQU 04H
THH1 EQU 05H
TM0 EQU 02H
TM1 EQU 03H
TS0 EQU 00H
TS1 EQU 01H
;输出缓冲,实际值
OUTPUT EQU 06H
;扫描信号
POSITION EQU 07H
;数据指针,指示所要读的数据区
PIN EQU 13H
;中断次数计数
INTIME EQU 11H
SHOW EQU 12H
FEN EQU 20H
SHI EQU 21H
;********初始化程序***************
;初始化栈堆
MOV SP,#50H
;初始化数据存储区
MOV THH0,#2
MOV THH1,#1
MOV TM0,#9
MOV TM1,#5
MOV TS0,#0
MOV TS1,#5
MOV DPTR,#TAB
MOV POSITION,#01B
MOV PIN,#0
;初始化定时器及定时中断
MOV TMOD,#01H
SETB EA
SETB ET0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
;默认使用第二组通用寄存器组
SETB RS0
CLR RS1
MOV FEN,#00001100B
MOV SHI,#00110000B
MOV STATE,#0FFH
LJMP DISPLAY
;*********************延时子程序****************************
;延时3毫秒
DELAY:
MOV 10H,#5H
S1:
MOV 09H,#250
S2:
DJNZ 09H,S2
DJNZ 10H,S1
RET
;*********************正常显示模式**************************
DISPLAY:
;关闭显示
MOV P0,#0FFH
;传递新的扫描显示位置
MOV P1,POSITION
;灭零
MOV A,THH1
CJNE A,#0,SS
ANL P1,#11011111B
;再把显示值传给显示输入端P0,显示
SS:
MOV R0,PIN
MOV OUTPUT,@R0
MOV R0,OUTPUT
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
;得到下一扫描位置
MOV A,POSITION
RL A
;判断显示扫描是否到了最高位
CJNE A,#1000000B,CONTINU1
;是则回复到最低位
MOV POSITION,#01H
MOV PIN,#00H
LJMP DISPLAY
CONTINU1:
;否则给下一次用
MOV POSITION,A
INC PIN
LCALL KEY
LJMP DISPLAY
;*******************调整显示模式***************************
;*****去时显示模式**********
DISPHOUR:
;关闭显示
MOV P0,#0FFH
;传递新的扫描显示位置
MOV P1,POSITION
;再把显示值传给显示输入端P0,显示
MOV R0,PIN
MOV OUTPUT,@R0
MOV R0,OUTPUT
MOV A,R0
MOVC A,@A+DPTR
ANL A,SHI
MOV P0,A
LCALL DELAY
;得到下一扫描位置
MOV A,POSITION
RL A
;判断显示扫描是否到了最高位
CJNE A,#1000000B,CONTINU2
;是则回复到最低位
MOV POSITION,#01H
MOV PIN,#00H
LJMP DISPLAY
CONTINU2:
;否则给下一次用
MOV POSITION,A
INC PIN
LJMP DISPHOUR
;*****去分显示模式**********
DISMINUT:
;关闭显示
MOV P0,#0FFH
;传递新的扫描显示位置
MOV P1,POSITION
;再把显示值传给显示输入端P0,显示
MOV R0,PIN
MOV OUTPUT,@R0
MOV R0,OUTPUT
MOV A,R0
MOVC A,@A+DPTR
ANL A,FEN
MOV P0,A
LCALL DELAY
;得到下一扫描位置
MOV A,POSITION
RL A
;判断显示扫描是否到了最高位
CJNE A,#1000000B,CONTINU3
;是则回复到最低位
MOV POSITION,#01H
MOV PIN,#00H
LJMP DISPLAY
CONTINU3:
;否则给下一次用
MOV POSITION,A
INC PIN
LJMP DISMINUT
;*****去秒显示模式**********
DISPSEC:
;关闭显示
MOV P0,#0FFH
;传递新的扫描显示位置
MOV P1,POSITION
;再把显示值传给显示输入端P0,显示
MOV R0,PIN
MOV OUTPUT,@R0
MOV R0,OUTPUT
MOV A,R0
MOVC A,@A+DPTR
ANL A,FEN
MOV P0,A
LCALL DELAY
;得到下一扫描位置
MOV A,POSITION
RL A
;判断显示扫描是否到了最高位
CJNE A,#1000000B,CONTINU4
;是则回复到最低位
MOV POSITION,#01H
MOV PIN,#00H
LJMP DISPLAY
CONTINU4:
;否则给下一次用
MOV POSITION,A
INC PIN
LJMP DISPSEC
TAB: DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H
;七段码:**0****1****2****3***4***5***6****7***8***9***
INT:
PUSH PSW ;保护现声
PUSH ACC
;由于入栈及置数用去8微秒时间故应3CB0H+8H
MOV TH0,#3CH
MOV TL0,#0B8H
;判断中断次数,当达时,秒个位增一,中断计数区清零
INC INTIME
MOV A,INTIME
CJNE A,#20,LS1
MOV INTIME,#0
INC TS0
CPL P3.0
;秒个位达10则清零且十位加一
MOV A,TS0
CJNE A,#10,LS1
MOV TS0,#0
INC TS1
;秒计数满60则分加一,秒清零
MOV A,TS1
CJNE A,#6,LS1
MOV TS1,#0
INC TM0
;分个位满10则分十位加一且分个位清零
MOV A,TM0
CJNE A,#10,LS1
MOV TM0,#0
INC TM1
;分计数满,分计数清零,时计数加一
MOV A,TM1
CJNE A,#6,LS1
MOV TM1,#0
INC THH0
;因有显示12之后加一进位的情况出现,所以这里要先判断TH1
MOV A,THH1
CJNE A,#1,LS
MOV A,THH0
CJNE A,#3,LS1
MOV THH0,#1
MOV THH1,#0
LJMP LS1
;在时计数高位为零的情况下才执行此代码
LS: MOV A,THH0
CJNE A,#10,LS1
MOV THH0,#0
INC THH1
LS1:
POP ACC
POP PSW
RETI
KEY:
;判断是否有效
MOV A,STATE
CJNE A,#0FFH,NEXT
MOV STATE,P2
MOV P2,#0FFH
RET
NEXT:
CJNE A,P2,DO
RET
DO:
JNB STATE.1,CLRSEC
JNB STATE.2,INCM
JNB STATE.3,INCH
RET
CLRSEC:
MOV TS0,#00H
MOV TS1,#00H
MOV STATE,#0FFH
RET
INCM:
INC TM0
;分个位满10则分十位加一且分个位清零
MOV A,TM0
CJNE A,#10,LX1
MOV TM0,#0
INC TM1
;分计数满,分计数清零,时计数加一
MOV A,TM1
CJNE A,#6,LX1
MOV TM1,#0
MOV STATE,#0FFH
RET
INCH:
INC THH0
;因有显示12之后加一进位的情况出现,所以这里要先判断TH1
MOV A,THH1
CJNE A,#1,LX
MOV A,THH0
CJNE A,#3,LX1
MOV THH0,#1
MOV THH1,#0
LJMP LX1
;在时计数高位为零的情况下才执行此代码
LX: MOV A,THH0
CJNE A,#10,LX1
MOV THH0,#0
INC THH1
LX1:
MOV STATE,#0FFH
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -