📄 time.txt
字号:
RTC EQU 0200H ;定义MC146818起始地址=秒地址
LCDIR EQU 0100H ;指令寄存器地址
LCDDR EQU 0500H ;数据寄存器地址
RAM EQU 20H ;寄存器RAM-20H
PTR EQU 28H ;年月日时分秒位置的指针
ORG 00H
JMP START
ORG 13H
JMP EXT1 ;INT1中断子程序
START: MOV SP,#60H ;设置堆栈
MOV RAM,#01H ;LCD清屏
CALL PUTIR
CALL DELAY1 ;2MS
MOV RAM,#038H ;LCD功能设定,8位,2行显示
CALL PUTIR
MOV RAM,#0FH ;设定显示屏,光标ON,闪烁
CALL PUTIR
MOV RAM,#06H ;加1,光标向右移
CALL PUTIR
MOV PTR,#00 ;位置指针为0,停在年
MOV IE,#084H ;TIMER1 INT1中断使能
MOV DPTR,#RTC+0AH ;A寄存器32.768KHZ
MOV A,#20H ;DV2=0,DV1=1,DV0=0
MOVX @DPTR,A
MOV DPTR,#RTC+0BH ;B寄存器SET=1,更新周期停止
MOV A,#80H
MOVX @DPTR,A
MOV DPTR,#RTC+0EH ;读取RTC 0E地址内容判断是否为3
MOVX A,@DPTR
CJNE A,#01H,START0
JMP START1
START0: MOV RAM,#080H ;不是则写入95/3/13 12:00:00
CALL PUTIR
MOV DPTR,#RTC ;秒地址写入00秒
MOV A,#00H
MOV @DPTR,A
MOV DPTR,@RTC+2 ;00分
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#RTC+4 ;12时
MOV A,#12H
MOVX @DPTR,A
MOV DPTR,#RTC+7 ;13日
MOV A,#13H
MOVX @DPTR,A
MOVX @DPTR,#RTC+8 ;3月
MOV A,#03H
MOVX @DPTR,A
MOV DPTR,#RTC+9 ;95年
MOV A,#095H
MOVX @DPTR,A
MOV DPTR,#RTC+0EH ;RTC OE地址写入1,表示内部有时间值
MOV A,#01H
MOVX @DPTR,A
MOV DPTR,#TAB ;LCD显示内定日期时间
CALL PUTSTR
JMP START2
START1: MOV RAM,#080H ;是1表示RTC内有时间
CALL PUTIR ;光标在1行1格
MOV DPTR,#TAB1
CALL PUTIR ;LCD显示"19 : : "
SRATT2: MOV RAM,#082H ;光标停在年
CALL PUTIR
MOV DPTR,#RTC+0BH ;B寄存UIE=1RTC中断使能
MOV A,#12H
MOV @DPTR,A
LOOP: JNB P1.0,CUR0 ;P1.0为1则光标位置加1
JNB P1.1,INC0 ;P1.1为1则光标位置数加1
JNB P1.2.DEC0 ;P1.2为1光标位置数减1
JMP LOOP
CUR0: JMP CUR1 ;间接跳跃
INC0: JMP INC1
DEC0: JMP DEC1
CUR1: CALL DELAY ;按钮消除抖动
JNB P1.0,$ ;检测按钮是否放开
CALL DELAY ;按钮消除抖动
INC PTR
MOV A,PTR ;读取位置指针
CJNE A,#06H,CUR10 ;是否超过秒位置
MOV PTR,#00H
CUR10: MOV DPTR,#CUR ;指向LCD位置表
MOVC A,@A+DPTR ;依位置指针读取对应的光标地址
MOV RAM,A ;设定LCD光标地址
CALL PUTIR
JMP LOOP
INC1: CALL DELAY ;按钮消除抖动
JNB P1.1,$ ;检测按键是否放开
CALL DELAY
MOV DPTR,#RTC+0BH ;B寄存器SET=1更新周期停止
MOV A,#080H ;进行时间设定
MOVX @DPTR,A
MOV DPTR,#TIM ;依位置指针读取该RTC地址存入20H
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM,A
MOV DPTR,#MAX ;取该时间最大值存入21H
MOV A,PTR
MOVC A@A+DPTR
MOV RAM+1,A
MOV DPTR,#MIN ;取时间最小值存入22H
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM+2,A
MOV DPTR,#RTC ;读取(#RTC+RAM)地址内容
MOV DPL,RAM
MOV A,@DPTR
CJNE A,RAM+1,INC10 ;是否=最大值,不是则跳INC10
MOV A,RAM+2 ;是则存入最小值
JMP INC11
INC10: ADD A,#10H ;最大值+1,十进制调整
DA A
INC11: MOVX @DPTR,A ;写入RTC
MOV B,#10H ;将时间十进制十位个位拆开
DIV AB
ADD A,#'0' ;转换为ASCⅡ码送LCD显示
MOV RAM,A
CALL PUTICHR
MOV A,B
ADD A,#'0'
MOV RAM,A
CALL PUTCHR
MOV DPTR,#CUR ;光标回到原来位置
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM,A
CALL PUTIR
MOV DPTR,#RTC+0BH ;B寄存器UIE=1,RTC中断使能计时
MOV A,#12H
MOVX @DPTR,A
JMP LOOP
DEC1: CALL DELAY ;消除抖动
JNB P1.2,$
CALL DELAY
MOV DPTR,#RTC+0BH ;B寄存器SET=1更新周期停止
MOV A,#080H ;进行时间设定
MOVX @DPTR,A
MOV DPTR,#TIM ;依位置指针读取该RTC地址存入20H
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM,A
MOV DPTR,#MAX ;取该时间最大值存入21H
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM+1,A
MOV DPTR,#MIN ;取该时间最小值存入22H
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM+2,A
MOV DPTR,#RTC ;读取(#RTC+RAM)地址内容
MOV DPL,RAM
MOVX A,@DPTR
MOV RAM+3,A
CJNE A,RAM+2,DEC10 ;是否为最小值,否则跳
MOV A,RAM+1 ;是则存入最大值
JMP DEC12
DEC10: ANL A,#0FH ;检测个位数是否为0
XRL A,#00H
JNZ DEC11 ;不为0跳DEC11
MOV A,RAM+3 ;为0判RTC值减1-十位数减1,个位为9
CLR C
SUBB A,#07H
JMP DEC12
DEC11: MOV A,RAM+3 ;不为0,读取RTC减1
DEC A
DEC12; JMP INC11
PUTIR: CALL BUSY ;写入指令子程序
MOV DPTR,#LCDIR ;检测忙碌标志位
MOV A,RAM ;LCD指令寄存器
MOVX @DPTR,A ;将RAM内容写入指令寄存器
RET
PUTCHR: CALL BUSY ;显示字子程序
MOV DPTR,#LCDDR ;LCD数据寄存器
MOV A,RAM ;将RAM内容写入数据寄存器显示
MOVX @DPTR,A
RET
PUTSTR: MOV R2.#00H ;显示字符串子程序,取字串的指针为0
PUTSTR1:MOV A,R2 ;载入字串指针值
MOVC A,@A+DPTR ;取字串数据码
MOV RAM,A ;写入RAM寄存器
XRL RAM,A ;是否取到结束码0
JZ PUTSTR2 ;是否返回
PUSH DPH ;是则返回
PUSH DPL ;不是则压DPTR入栈,保存字符指针
CALL PUTCHR ;显示字串数据码
INC R2 ;指向下一个数据码
POP DPL ;取回字串指针
POP DPH
JMP PUTSTR1
PUTSTR2:RET
BUSY: MOV DPTR,#LCDIR ;检测忙碌标志
BUSY1: MOVX A,@DPTR ;LCD指令寄存器
ANL A,#080H ;读忙碌标志位BIT7
XRL A,#080H ;BIT7=1?
JZ BUSY1 ;是则在忙碌中
RET
EXT1: PUSH ACC
PUSH PSW
MOV DPTR,#RTC+0CH ;读C寄存器,清中断标志位IRQF
MOVX A,@DPTR
MOV R2,#00
EXT10: MOV DPTR,#CUR ;依R2值读取光标地址
MOV A,R2
MOVC A,@A+DPTR
MOV RAM,A ;设定停在指定位置
CALL PUTIR
MOV DPTR,#TIM ;依R2值读取RTC内部地址
MOV A,R2
MOVC A,@A+DPTR
MOV DPTR,#RTC ;DPTR指向#RTC外部地址
MOV DPL,A ;DPTR=#RTC+OFFSET地址
MOVX A,@DPTR ;读取该地址内容
MOV B,#10H ;十位个位分开
DIV AB
ADD A,#'0' ;十位数转换后送LCD显示
MOV RAM,A
CALL PUTCHR
MOV A,B ;个位数转换后送LCD显示
ADD A,#'0'
MOV RAM,A
CALL PUTCHR
INC R2 ;指向下一组时间
CJNE R2,#06H,EXT10
MOV DPTR,#CUR ;光标回原位置
MOV A,PTR
MOVC A,@A+DPTR
MOV RAM,A
CALL PUTIR
POP PSW
POP ACC
RETI
DELAY: MOV R6,#60 ;延时30MS
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DELAY1: MOV R6,#4 ;延时2MS
D11: MOV R7,#248
DJNZ R7,$
DJNZ R6,D11
RET
TAB: DB '1995 03 13 12:00:00',00H ;内定时间
TAB1: DB '1995 ',00H ;LCD屏幕显示
TIM: DB 09H,08H,07H,04H,02H,00H ;RTC时间地址
CUR: DB 82H,85H,88H,8BH,8EH,91H ;LCD时间地址
MAX: DB 99H,12H,31H,23H,59H,59H ;时间最大值
MIN: DB 00H,01H,01H,00H,00H,00H ;时间最小值
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -