📄 ds1302.txt
字号:
MOV C,IO
NOP
RRC A
SETB SCLK
NOP
CLR SCLK
DJNZ R2,REDS13021
CLR RST
RET
READ_DS1302_8B:
MOV R2,#8 ;每次发送八位数据
MOV A,#0BFH ;连续读8字节时钟数据的命令
CLR RST
NOP
CLR SCLK
NOP
SETB RST
REDS13028B0: ;写入8位连续读的命令
RRC A
NOP
MOV IO,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ R2,REDS13028B0
MOV R3,#8 ;读8字节数据
MOV R1,#T_BUFFER ;读的时钟数据首地址
REDS13028B1:
MOV R2,#8
CLR A
CLR C ;先清空c
REDS13028B2:
NOP
MOV C,IO
NOP
RRC A
SETB SCLK
NOP
CLR SCLK
DJNZ R2,REDS13028B2
MOV @R1,A
INC R1
DJNZ R3, REDS13028B1 ;8字节数据是否读完
CLR RST
RET
INT0: ;中断运行程序
PUSH A
PUSH B
MOV R5,#20 ;延时10ms
INT00:
MOV R4,#200
INT02:
DJNZ R4,INT02
DJNZ R5, INT00
JNB P3.2,INT011
AJMP INT01
INT011:
CLR EA
;-------------------------------------------------------中断处理部分
MOV A,#8EH
MOV B,#00000000B
ACALL WRITE_DS1302 ;去掉DS1302的写保护
MOV A,#81H ;先把秒时间读出来
ACALL READ_DS1302
SETB ACC.7
MOV B,A ;读出的秒信息加入停止位后写入
MOV A,#80H
ACALL WRITE_DS1302 ;停止计时
;-------------------------------------------------------
INT07:
INC T_REG ;修改指针其值,使其指向所修改的单元
MOV A,T_REG
CJNE A,#15,INT010 ;不等于15,则确定哪一页,等于14了,则说明修改完了,要推出中断和请零
;--------退出前的清理工作
MOV T_REG,#0
MOV DISP,#58H ;调整完了以后显示shijian
MOV A,#81H ;先把秒时间读出来
ACALL READ_DS1302
CLR ACC.7
MOV B,A ;读出的秒信息加入停止位后写入
MOV A,#80H
ACALL WRITE_DS1302 ;打开计时
MOV A,#8EH
MOV B,#10000000B
ACALL WRITE_DS1302 ;加DS1302写保护
SJMP INT012
INT010:
MOV A,T_REG
CLR C
SUBB A,#7
JC INT08 ;小于7,即显示的是年的那页,则跳转,显示缓存为
MOV DISP,#58H ;大于7,则显示时间
SJMP INT09
INT08:
MOV DISP,#60H
INT09: ;读ds1302的时间数据,并闪烁显示与T_REG对应位
ACALL READ_DS1302_8B
ACALL DS1302_CHULI
ACALL DELAY
ACALL DELAY
ACALL SHANSHUO ;由T_REG决定哪页的那一位闪烁
ACALL DISPLAY
;-------------------------判断其中p3.3是否有按下来,此时其不是中断,而是低电位。
JB P3.3,INT30
MOV R5,#20 ;延时10ms后,检测是否p3.3是否被按下
INT31:
MOV R4,#200
DJNZ R4,$
DJNZ R5, INT31
JB P3.3,INT30 ;若为高,则只是抖动,走开
ACALL CHANGE
INT32:
MOV R5,#20 ;延时10ms后,检测是否p3.3是否被防开
INT321:
MOV R4,#200
DJNZ R4,$
DJNZ R5, INT321
JNB P3.3,INT32
;为高,则说明按键已经防开,可以继续工作。
;--------------------判断是否p3.2再次按下
INT30:
JB P3.2,INT09
MOV R5,#20 ;延时10ms后,检测是否p3.2再次被按下
INT0x:
MOV R4,#200
INT0y:
DJNZ R4,INT0y
DJNZ R5, INT0x
JNB P3.2,INT07 ;有按键按下,则T_REG加1,进入处理下一位的循环
SJMP INT09 ;无按键按下,继续循环
;------------------------------------中断处理完成
INT012:
MOV R5,#20
INT0121:
MOV R4,#200
DJNZ R4,$
DJNZ R5,INT0121
JNB P3.2,INT012 ;按键没放开,则继续等待,一直等到是高电位了,再跳出中断
;------------------------
SETB EA
INT01:
POP B
POP A
RETI
SHANSHUO:
MOV R1,#66H ;年十位信息存放地址,也做为首地址
MOV A,R1
MOV R1,T_REG
SUBB A,R1
MOV R1,A
JB SHANSHUOBIT,SHANSHUO1 ;为1则交换reg于存储位数据,为零则将数据位给reg,
MOV A,@R1
MOV DISP_REG,A ;交换显示书数据,原数据存放在disp-reg中,原数据位请零
MOV @R1,#0
SJMP SHANSHUO2
SHANSHUO1:
MOV @R1,DISP_REG
MOV DISP_REG,#0
SHANSHUO2:
CPL SHANSHUOBIT
RET
INT1: ;中断运行程序
PUSH A
MOV R5,#20 ;延时10ms
INT10:
MOV R4,#200
INT12:
DJNZ R4,INT12
DJNZ R5, INT10
JB P3.3,INT11
CLR EA
;------------------------------------
MOV A,#8
ADDC A,DISP
MOV DISP,A
CJNE A,#68H,INT13
MOV DISP,#50H
;------------------------------------
INT13:
MOV R5,#20 ;延时10ms
INT14:
MOV R4,#200
INT15:
DJNZ R4,INT15
DJNZ R5, INT14
JNB P3.3,INT13
POP A
SETB EA
INT11:
RETI
;----------------年信息的处理
YH_CHANGE:
MOV A,#8DH
ACALL READ_DS1302
MOV CHANGE_BUFFER,A ;暂存读数值得
ANL CHANGE_BUFFER,#00001111B
ANL A,#11110000B
SWAP A
INC A
CJNE A,#10,YH_CHANGE1
CLR A ;满10则回到零
SJMP YH_CHANGE2
YH_CHANGE1:
SWAP A
YH_CHANGE2:
ORL A,CHANGE_BUFFER
MOV B,A
MOV A,#8CH
ACALL WRITE_DS1302
RET ;完成年的高位增1操作,结束中断
;--------------------------------------------
YL_CHANGE:
MOV A,#8DH
ACALL READ_DS1302
MOV CHANGE_BUFFER,A ;暂存读数值得
ANL CHANGE_BUFFER,#11110000B
ANL A,#00001111B
INC A
CJNE A,#10,YL_CHANGE1
CLR A ;满10则回到零
YL_CHANGE1:
ORL A,CHANGE_BUFFER
MOV B,A
MOV A,#8CH
ACALL WRITE_DS1302
RET
;------------------------------完成年的低位增1操作,结束中断
;----------------月信息的处理
MH_CHANGE:
MOV A,#89H
ACALL READ_DS1302
MOV CHANGE_BUFFER,A ;暂存读数值得
ANL CHANGE_BUFFER,#00001111B
ANL A,#11110000B
SWAP A
INC A
CJNE A,#2,MH_CHANGE1
CLR A ;满2则回到零
SJMP MH_CHANGE2
MH_CHANGE1:
SWAP A
MH_CHANGE2:
ORL A,CHANGE_BUFFER
MOV B,A
MOV A,#88H
ACALL WRITE_DS1302
RET ;完成月的高位增1操作,结束中断
;--------------------------------------------
ML_CHANGE:
MOV A,#89H
ACALL READ_DS1302
MOV CHANGE_BUFFER,A ;暂存读数值得
ANL CHANGE_BUFFER,#11110000B
ANL A,#00001111B
INC A
CJNE A,#10,ML_CHANGE1
CLR A ;满10则回到零
ML_CHANGE1:
ORL A,CHANGE_BUFFER
MOV B,A
MOV A,#88H
ACALL WRITE_DS1302
RET
;------------------------------完成月的低位增1操作,结束中断
;----------------日信息的处理
DH_CHANGE:
MOV A,#87H
ACALL READ_DS1302
MOV CHANGE_BUFFER,A ;暂存读数值得
ANL CHANGE_BUFFER,#00001111B
ANL A,#11110000B
SWAP A
INC A
CJNE A,#4,DH_CHANGE1
CLR A ;满4则回到零
AJMP DH_CHANGE2
DH_CHANGE1:
SWAP A
DH_CHANGE2:
ORL A,CHANGE_BUFFER
MOV B,A
MOV A,#86H
ACALL WRITE_DS1302
RET ;完成天的高位增1操作,结束中断
;--------------------------------------------
DL_CHANGE:
MOV A,#87H
ACALL READ_DS1302
MOV CHANGE_BUFFER,A ;暂存读数值得
ANL CHANGE_BUFFER,#11110000B
ANL A,#00001111B
INC A
CJNE A,#10,DL_CHANGE1
CLR A ;满10则回到零
DL_CHANGE1:
ORL A,CHANGE_BUFFER
MOV B,A
MOV A,#86H
ACALL WRITE_DS1302
RET
;------------------------------完成年的低位增1操作,结束中断
;----------------星期信息的处理
XQ_CHANGE:
MOV A,#8BH
ACALL READ_DS1302
ANL A,#00000111B
INC A
CJNE A,#8,XQ_CHANGE1
MOV A,#1 ;满10则回到零
XQ_CHANGE1:
MOV B,A
MOV A,#8AH
ACALL WRITE_DS1302
RET ;完成星期增1操作,结束中断
OO_CHANGE:
NOP
RET ;有一位无操作,结束中断
;----------------小时信息的处理
HH_CHANGE:
MOV A,#85H
ACALL READ_DS1302
MOV CHANGE_BUFFER,A ;暂存读数值得
ANL CHANGE_BUFFER,#00001111B
ANL A,#00110000B
SWAP A
INC A
CJNE A,#3,HH_CHANGE1
CLR A ;满10则回到零
SJMP HH_CHANGE2
HH_CHANGE1:
SWAP A
HH_CHANGE2:
ORL A,CHANGE_BUFFER
MOV B,A
MOV A,#84H
ACALL WRITE_DS1302
RET ;完成小时的高位增1操作,结束中断
;--------------------------------------------
HL_CHANGE:
MOV A,#85H
ACALL READ_DS1302
MOV CHANGE_BUFFER,A ;暂存读数值得
ANL CHANGE_BUFFER,#11110000B
ANL A,#00001111B
INC A
CJNE A,#10,HL_CHANGE1
CLR A ;满10则回到零
HL_CHANGE1:
ORL A,CHANGE_BUFFER
MOV B,A
MOV A,#84H
ACALL WRITE_DS1302
RET
;------------------------------完成小时的低位增1操作,结束中断
;----------------分信息的处理
MINH_CHANGE:
MOV A,#83H
ACALL READ_DS1302
MOV CHANGE_BUFFER,A ;暂存读数值得
ANL CHANGE_BUFFER,#00001111B
ANL A,#11110000B
SWAP A
INC A
CJNE A,#6,MINH_CHANGE1
CLR A ;满6则回到零
SJMP MINH_CHANGE2
MINH_CHANGE1:
SWAP A
MINH_CHANGE2:
ORL A,CHANGE_BUFFER
MOV B,A
MOV A,#82H
ACALL WRITE_DS1302
RET ;完成分的高位增1操作,结束中断
;--------------------------------------------
MINL_CHANGE:
MOV A,#83H
ACALL READ_DS1302
MOV CHANGE_BUFFER,A ;暂存读数值得
ANL CHANGE_BUFFER,#11110000B
ANL A,#00001111B
INC A
CJNE A,#10,MINL_CHANGE1
CLR A ;满10则回到零
MINL_CHANGE1:
ORL A,CHANGE_BUFFER
MOV B,A
MOV A,#82H
ACALL WRITE_DS1302
RET
;------------------------------完成分的低位增1操作,结束中断
;----------------秒信息的处理
SH_CHANGE:
MOV A,#81H
ACALL READ_DS1302
MOV CHANGE_BUFFER,A ;暂存读数值得
ANL CHANGE_BUFFER,#00001111B
ANL A,#01110000B
SWAP A
INC A
CJNE A,#6,SH_CHANGE1
MOV A,#10000000B ;满6则回到零 ,仍需要停止计时
SJMP SH_CHANGE2
SH_CHANGE1:
SWAP A
SH_CHANGE2:
ORL A,CHANGE_BUFFER
SETB ACC.7 ;仍需要停止计时
MOV B,A
MOV A,#80H
ACALL WRITE_DS1302
RET ;完成秒的高位增1操作,结束中断
;--------------------------------------------
SL_CHANGE:
MOV A,#83H
ACALL READ_DS1302
MOV CHANGE_BUFFER,A ;暂存读数值得
ANL CHANGE_BUFFER,#11110000B
ANL A,#00001111B
INC A
CJNE A,#10,SL_CHANGE1
CLR A ;满10则回到零
SL_CHANGE1:
ORL A,CHANGE_BUFFER
MOV B,A
MOV A,#82H
ACALL WRITE_DS1302
RET
;------------------------------完成秒的低位增1操作,结束中断
CHANGE:
MOV A,T_REG ;这一部分可能会跑偏
CJNE A,#1,CHANG1
ACALL YH_CHANGE
AJMP CHANGE14
CHANG1:
CJNE A,#2,CHANG2
ACALL YL_CHANGE
AJMP CHANGE14
CHANG2:
CJNE A,#3,CHANG3
ACALL MH_CHANGE
AJMP CHANGE14
CHANG3:
CJNE A,#4,CHANG4
ACALL ML_CHANGE
AJMP CHANGE14
CHANG4:
CJNE A,#5,CHANG5
ACALL DH_CHANGE
AJMP CHANGE14
CHANG5:
CJNE A,#6,CHANG6
ACALL ML_CHANGE
AJMP CHANGE14
CHANG6:
CJNE A,#7,CHANG7
ACALL XQ_CHANGE
AJMP CHANGE14
CHANG7:
CJNE A,#8,CHANG8
ACALL OO_CHANGE
AJMP CHANGE14
CHANG8:
CJNE A,#9,CHANG9
ACALL HH_CHANGE
AJMP CHANGE14
CHANG9:
CJNE A,#10,CHANG10
ACALL HL_CHANGE
AJMP CHANGE14
CHANG10:
CJNE A,#11,CHANG11
ACALL MINH_CHANGE
AJMP CHANGE14
CHANG11:
CJNE A,#12,CHANG12
ACALL MINL_CHANGE
AJMP CHANGE14
CHANG12:
CJNE A,#13,CHANG13
ACALL SH_CHANGE
AJMP CHANGE14
CHANG13:
CJNE A,#14,CHANGE14
ACALL SL_CHANGE
CHANGE14:
RET
;-------------------------------------各时间寄存器的加1子程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -