📄 calendar.asm
字号:
DATA_IN DATA 0020H
DATA_OUT DATA 0021H
WEISHU DATA 0022H
WEISHU2 DATA 0029H
SHI DATA 0023H
FEN DATA 0024H
MIAO DATA 0025H
YEAR DATA 0026H
MONTH DATA 0027H
DAY DATA 0028H
KEY BIT P3.3 ;7279的KEY按键输出
DAT BIT P1.1 ;7279的DATA串行数据引脚
CLK BIT P1.0 ;7279的CLK同步时钟引脚
CS BIT P2.6 ;7279的CS片选输入端
;*************************************
;************ 主程序 **************
;*************************************
ORG 0000H
LJMP START
ORG 000BH
LJMP INT
ORG 0013H
LJMP INT1
ORG 0100H
START: MOV SP,#2FH
SETB CS
SETB KEY
CLR CLK
CLR DAT ;初始化I/O口
CALL DELAY25 ;延时25mS
MOV R3,#20
SETB EA
SETB ET0
SETB EX1
SETB PX1
MOV TMOD,#01H
MOV TH0,#03CH
MOV TL0,#0B0H
SETB TR0 ;中断初始化
MOV DATA_OUT,#0A4H
CALL SEND ;发复位(清除)指令
;-----------------------------------------
MOV MIAO,#00H ;存放秒数字
MOV FEN,#00H ;存放分数字
MOV SHI,#00H ;存放时数字
MOV DAY,#01H
MOV MONTH,#01H
MOV YEAR,#00H
MOV WEISHU,#03H
MOV WEISHU2,#03H
SETB P1.7 ;判断是否闪烁
SETB P1.5
SETB P1.6
MOV R6,#11111100B ;存放要闪烁的位数,要左移
MOV R4,#11111100B
;----------------------------------------
; 第三个和第六个数码管位一横并闪烁
; 扫描显示时钟
;----------------------------------------
SHIZHONG:MOV DATA_OUT,#88H
CALL SEND
MOV DATA_OUT,#11011011B
CALL SEND
CFSM:MOV DATA_OUT,#95H
CALL SEND
MOV DATA_OUT,#01H
CALL SEND
;--------------------------------
MOV DATA_OUT,#92H
CALL SEND
MOV DATA_OUT,#01H
CALL SEND
;--------------------------------
MOV R5,#87H
MOV A,SHI ;显示时分秒
XS: MOV B,#10
DIV AB
MOV DATA_OUT,R5
CALL SEND
MOV DATA_OUT,A
CALL SEND
DEC R5
MOV DATA_OUT,R5
CALL SEND
DEC R5
MOV DATA_OUT,B
CALL SEND
CJNE R5,#85H,LOP1
MOV A,FEN
DEC R5
SJMP XS
LOP1:CJNE R5,#82H,LOP2
MOV A,MIAO
DEC R5
SJMP XS
LOP2:JNB P1.6,RIQI ;P1.0=0扫描显示日期
JB P1.7,SHIZHONG
SJMP CFSM
DDD0:SJMP SHIZHONG
;----------------------------
; 扫描显示日期
;----------------------------
RIQI:MOV DATA_OUT,#88H
CALL SEND
MOV DATA_OUT,#11011011B
CALL SEND
CFSM2:MOV DATA_OUT,#95H
CALL SEND
MOV DATA_OUT,#01H
CALL SEND
;---;-----------------------------
MOV DATA_OUT,#92H
CALL SEND
MOV DATA_OUT,#01H
CALL SEND
MOV R5,#87H
MOV A,YEAR ;显示年月日
XS2: MOV B,#10
DIV AB
MOV DATA_OUT,R5
CALL SEND
MOV DATA_OUT,A
CALL SEND
DEC R5
MOV DATA_OUT,R5
CALL SEND
DEC R5
MOV DATA_OUT,B
CALL SEND
CJNE R5,#85H,LOP21
MOV A,MONTH
DEC R5
SJMP XS2
LOP21:CJNE R5,#82H,LOP22
MOV A,DAY
DEC R5
SJMP XS2
LOP22:JB P1.6,DDD0;若P1.6=1,扫描时钟显示
JB P1.5,RIQI
SJMP CFSM2
;***********************************
;****** 定时T0中断服务程序 *****
;***********************************
INT: PUSH A
DJNZ R3,OUT
MOV R3,#20
INC MIAO
MOV A,MIAO ;秒+1
CJNE A,#60,OUT ;如果还没到60秒,返回
MOV MIAO,#00H
INC FEN
MOV A,FEN ;到60秒。秒就清零,分+1
CJNE A,#60,OUT ;如果还没到60分,返回
MOV FEN,#00H
INC SHI
MOV A,SHI ;到60分。分就清零,时+1
CJNE A,#24,OUT ;如果还没到24时,返回
MOV SHI,#00H ;到24时。时就清零
;----------------------------------------
INC DAY
MOV A,YEAR ;判断是否为闰年
MOV B,#4
DIV AB
MOV A,B
CJNE A,#0,OUT11 ;是否被四整除?,不整除则跳转
MOV DPTR,#TABLE1
RRT: MOV A,MONTH
MOVC A,@A+DPTR
INC A
CJNE A,DAY,OUT
MOV DAY,#01H
INC MONTH
MOV A,MONTH
CJNE A,#13,OUT
MOV MONTH,#01H
INC YEAR
MOV A,YEAR
CJNE A,#100,OUT
MOV YEAR,#00H
JMP OUT
OUT11:MOV DPTR,#TABLE2
SJMP RRT
OUT:POP A
MOV TH0,#03CH
MOV TL0,#0B0H
RETI
;*************************************
;*********** 按键中断程序 *********
;*************************************
INT1: PUSH A
CALL DELAY25
JB P3.3,OUT2
MOV DATA_OUT,#15H ;读键值指令
CALL SEND
CALL RECEIVE
SETB CS
MOV A,DATA_IN ;键值放在A里面
;-------------------------------
; 在时钟界面下操作
;-------------------------------
;----------S0按下----------
S0: CJNE A,#00H,S1
JNB P1.6,S80C
JB P1.7,S00 ;P1.7=1 :不闪烁,要进入闪烁状态
CPL P1.7 ;P1.7=0 :已经闪烁,要关掉。
JMP OUT2
S00:CPL P1.7
MOV R0,WEISHU
CJNE R0,#00H,S01 ;时闪烁,R0=00H-- 分闪烁,R0=01H---秒闪烁,R0=02H
MOV WEISHU,#03H ;已经闪烁完,则重新再来
MOV R6,#11111100B
S01:MOV DATA_OUT,#88H ;要闪烁的位数
CALL SEND
MOV DATA_OUT,R6
CALL SEND
MOV R0,A
MOV A,R6
RL A
RL A
RL A
MOV R6,A
MOV A,R0
DEC WEISHU
SJMP OUT2
;---------S1按下 加1 ----------
S1:CJNE A,#01H,S2
JNB P1.6,S81C
JNB P1.7,S10 ;P1.7=0闪烁,才进行加1操作
SJMP OUT2 ;否则退出
S10:MOV R1,WEISHU
CJNE R1,#00H,S11 ;如果 时闪烁,R0=00H
INC SHI
MOV R0,SHI
CJNE R0,#24,OUT2 ;若SHI从23加到24,则SHI=00
MOV SHI,#00H
SJMP OUT2
S11:CJNE R1,#01H,S12 ;如果 分闪烁,R0=01H
INC FEN
MOV R0,FEN
CJNE R0,#60,OUT2 ;若FEN从59加到60,则FEN=00
MOV FEN,#00H
JMP OUT2
S12:INC MIAO ;如果 秒闪烁,R0=02H
MOV R0,MIAO
CJNE R0,#60,OUT2 ;若MIAO从59加到60,则MIAO=00
MOV MIAO,#00H
JMP OUT2
;---------跳出中断中转-------
S0C:SJMP S0
OUT2:SJMP OUT21
S80C:SJMP S80
;---------S2按下 减1 ----------
S2:CJNE A,#02H,S8
JNB P1.6,S82C
JNB P1.7,S20 ;P1.7=0有闪烁,才进入减1操作
SJMP OUT2 ;无闪烁才退出
S20:MOV R1,WEISHU
CJNE R1,#00H,S21 ;如果 时闪烁,R0=00H
DEC SHI
MOV R0,SHI
CJNE R0,#0FFH,OUT2 ;若SHI从00到FF,则SHI=23
MOV SHI,#23
SJMP OUT2
S21:CJNE R1,#01H,S22 ;如果 分闪烁,R0=01H
DEC FEN
MOV R0,FEN
CJNE R0,#0FFH,OUT2 ;若FEN从00到FF,则FEN=59
MOV FEN,#59
SJMP OUT2
S22:DEC MIAO ;如果 秒闪烁,R0=02H
MOV R0,MIAO
CJNE R0,#0FFH,OUT2 ;若MIAO从00到FF,则MIAO=59
MOV MIAO,#59
SJMP OUT2
;--------------------------------------
; 在日期界面下操作
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -