📄 timer.txt
字号:
ORG 0000H
AJMP MAIN
ORG 0060H
MAIN: MOV A,#10H
MOV 2FH,A;设初始显示的状态;时间 年份
FF1: ACALL READ
ACALL ZHUANHUAN
MOV A,#0
MOV R0,#50H
MOV R1,#70H
MOV R2,#7
FF2: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,FF2
;根据读键修改时钟值
READ_KEY:
MOV DPTR,#9FFFH;读键
MOV A, #00H
MOVX @DPTR,A
MOV DPTR,#8FFFH
MOV A, #00H
MOVX @DPTR,A
ACALL KEYREAD;调用子程
MOV A,22H
MOV DPTR,#9FFFH
MOV A, #00H
MOVX @DPTR,A
MOV DPTR,#9FFFH
MOV A, #00H
MOVX @DPTR,A
MOV DPTR,#8FFFH
MOV A, #00H
MOVX @DPTR,A
MOV A,22H
JZ DIS
JB 22H.0, DISPLAY_ME;显示时钟/日期
JB 22H.1, HOUR_YEAR;调整月/年
JB 22H.2, MINU_MONTH;调整分/月
JB 22H.3, SECON_DAY;调整日期
HOUR_YEAR:
JB 2FH.4, HOUR
JB 2FH.5, YEAR
HOUR: MOV A,52H
ADD A,#1
DA A
ANL A,#3FH
CJNE A,#24H,KK1
MOV A,#0
KK1: MOV 52H,A
AJMP MODIFY
YEAR: MOV A,56H
ADD A,#1
DA A
MOV 56H,A
AJMP MODIFY
MINU_MONTH:
JB 2FH.4, MINU
JB 2FH.5, MONTH
MINU: MOV A,51H
ADD A,#1
DA A
CJNE A,#60H,KK3
MOV A,#0
KK3: MOV 51H,A
AJMP MODIFY
MONTH: MOV A,55H
ADD A,#1
DA A
ANL A,#1FH
CJNE A,#13H,KK4
MOV A,#1
KK4: MOV 55H,A
AJMP MODIFY
SECON_DAY:
JB 2FH.4, SECOND
JB 2FH.5, DAY
SECOND:
AJMP FF1
DAY: MOV A,53H
ADD A,#1
DA A
ANL A,#3FH
CJNE A,#32H,KK5
MOV A,#01H
KK5: MOV 53H,A
AJMP MODIFY
DISPLAY_ME:
JB 2FH.4, D_M_2
JB 2FH.5, D_M_1
D_M_1:
MOV 2FH,#10H
AJMP DIS
D_M_2:
MOV 2FH,#20H
AJMP DIS
DIS:
JB 2FH.4, DISPLAY_1
JB 2FH.5, DISPLAY_2
DISPLAY_1:
ACALL DISPLAY1
AJMP MAIN_END
DISPLAY_2:
ACALL DISPLAY2
AJMP MAIN_END
MODIFY: ACALL WRITE
MAIN_END:AJMP FF1
;读键子程
NEW_KEY EQU 22H
OLD_KEY EQU 23H
KEYREAD:
CLR PSW.5
KEY_AGAIN:
ACALL KEY_INPUT
JNB PSW.5, KEY_OVER
ACALL KEY_DELAY
ACALL KEY_INPUT
JNB PSW.5, KEY_OVER
MOV A, NEW_KEY
CJNE A, OLD_KEY, KEY_OVER
UPKEY:
ACALL KEY_INPUT
JB PSW.5, UPKEY
ACALL KEY_INPUT
JB PSW.5, UPKEY
;
MOV R0,NEW_KEY
RET
KEY_INPUT:
MOV A, #00H ;显示0
MOV DPTR, #9000H
MOVX @DPTR, A ;ZIXING
;上面为清除显示
CLR F0
MOV R1, #00H
MOV R2, #04H
MOV R3, #01H
KEY_LOOP:
MOV A, R3
MOV DPTR, #8000H
MOVX @DPTR, A
MOVX A, @DPTR
MOV R4, #04H
KEY_LOOP1:
RRC A
JNC NEXT_KEY
MOV OLD_KEY,NEW_KEY
MOV A, R1
MOV DPTR, #KEY_TABLE_BCD
MOVC A, @A+DPTR
MOV NEW_KEY, A
SETB F0
AJMP KEY_OVER_OK
NEXT_KEY:
INC R1
DJNZ R4,KEY_LOOP1
MOV A, R3
RL A
MOV R3, A
DJNZ R2, KEY_LOOP
AJMP KEY_OVER_OK
KEY_OVER:
MOV 22H,#00H
KEY_OVER_OK:
RET
KEY_DELAY:
MOV R0, #0FFH
DJNZ R0,$
RET
KEY_TABLE_BCD:
DB 08H,08H,08H,08H
DB 04H,04H,04H,04H
DB 02H,02H,02H,02H
DB 01H,01H,01H,01H
READ:MOV R1,#7;I2C总线的读操作
MOV R0,#70H
ACALL START
MOV A ,#0A2H
ACALL WRITEBITE
ACALL YINGDA
MOV A,#02H
ACALL WRITEBITE
ACALL YINGDA
MOV A,#0A3H
ACALL START
ACALL WRITEBITE
ACALL YINGDA
PRO1:ACALL READBITE
MOV @R0,A
INC R0
DJNZ R1,PRO2
AJMP PROEND
PRO2: ACALL SENDACK
AJMP PRO1
PROEND:ACALL SENDNACK
ACALL STOP
RET
WRITE:;I2C总线的写操作
MOV R1,#7
MOV R0,#50H
ACALL START
MOV A,#0A2H
ACALL WRITEBITE
ACALL YINGDA
MOV A,#02H
ACALL WRITEBITE
ACALL YINGDA
PROC3:MOV A,@R0
ACALL WRITEBITE
ACALL YINGDA
INC R0
DJNZ R1,PROC3
ACALL STOP
RET
DISPLAY1:MOV R5, #08H;显示时间子程
MOV R2, #01H
MOV R0, #60H
DISP1:MOV DPTR,#8FFFH
MOV A, R2
MOVX @DPTR,A
MOV A, @R0
DISP2:MOV DPTR,#SHOWTABLE
MOVC A, @A+DPTR
MOV DPTR,#9FFFH
MOVX @DPTR,A
ACALL DEL0
ACALL DEL0
MOV A, R2
RL A
MOV R2, A
INC R0
DJNZ R5, DISP1
RET
DISPLAY2:MOV R5, #08H;显示日期子程
MOV R2, #01H
MOV R0, #68H
DISP3:MOV DPTR,#8FFFH
MOV A, R2
MOVX @DPTR,A
MOV A, @R0
DISP4:MOV DPTR,#SHOWTABLE
MOVC A, @A+DPTR
MOV DPTR,#9FFFH
MOVX @DPTR,A
ACALL DEL0
MOV A, R2
RL A
MOV R2, A
INC R0
DJNZ R5, DISP3
RET
SHOWTABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
ZHUANHUAN:;将读入的时间数据转换为供显示的数据
MOV A,70H;秒转换
MOV 60H,A
ANL 60H,#0FH
SWAP A
MOV 61H,A
ANL 61H,#07H
MOV A ,#0AH
MOV 62H,A
MOV A,71H;分转换
MOV 63H,A
ANL 63H,#0FH
SWAP A
MOV 64H,A
ANL 64H,#07H
MOV A,#0AH
MOV 65H,A
MOV A,72H;小时转换
MOV 66H,A
ANL 66H,#0FH
SWAP A
MOV 67H,A
ANL 67H,#03H
MOV A,73H;日转换
MOV 68H,A
ANL 68H,#0FH
SWAP A
MOV 69H,A
ANL 69H,#03H
MOV A ,#0AH
MOV 6AH,A
MOV A,75H;月转换
MOV 6BH,A
ANL 6BH,#0FH
SWAP A
ANL A,#01H
MOV 6CH,A
MOV A ,#0AH
MOV 6DH,A
MOV A,76H;年转换
MOV 6EH,A
ANL 6EH,#0FH
SWAP A
MOV 6FH,A
ANL 6FH,#0FH
RET
DEL0:MOV R7,#0;延时子程0,供显示用
TM0:DJNZ R7,TM
RET
DEL:MOV R7,#4;延时子程1 供读写时序用
TM: DJNZ R7,TM
RET
START: SETB P1.1
NOP
SETB P1.0 ;起始条件建立
ACALL DEL
CLR P1.1
ACALL DEL
CLR P1.0 ;钳住总线,准备发数据
NOP
RET
STOP: CLR P1.1
NOP
SETB P1.0 ;发送结束条件
ACALL DEL
SETB P1.1 ;结束总线
ACALL DEL
RET
SENDACK:CLR P1.1;发送应答信号
NOP
NOP
SETB P1.0
ACALL DEL
CLR P1.0
ACALL DEL
RET
SENDNACK:SETB P1.1;数据传送结束后的非应答信号
ACALL DEL
SETB P1.0
ACALL DEL
CLR P1.0
ACALL DEL
RET
YINGDA:SETB P1.1;单片机响应应答信号
ACALL DEL
SETB P1.0
ACALL DEL
ACALL DEL
CLR PSW.5;将PSW.5作为标志位
MOV C,P1.1
JC SS1
SETB PSW.5
SS1: CLR P1.0
NOP
NOP
RET
READBITE:MOV R6,#8;向8563写入一字节的内容
CLR A
SS2: SETB P1.1
NOP
SETB P1.0
ACALL DEL
MOV C ,P1.1
RLC A
CLR P1.0
DJNZ R6 ,SS2
RET
WRITEBITE:MOV R6,#8;从8563读出一字节的内容
SS3: RLC A
JC ST1
CLR P1.1
AJMP SS4
ST1: SETB P1.1
SS4: ACALL DEL
SETB P1.0
ACALL DEL
CLR P1.0
DJNZ R6,SS3
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -