MOV A,R0 MOV R2,#08H WRI_02:
RRC A ;传输数据到DS1302 NOP
CLR SCLK NOP NOP
MOV IO_DATA,C NOP NOP
SETB SCLK NOP NOP
DJNZ R2,WRI_02 CLR SCLK NOP NOP CLR RST NOP NOP RET
;================================================= ;读 DS1302 子程序
;================================================= READ: CLR SCLK NOP NOP
SETB RST NOP NOP
MOV A,R1 MOV R2,#08H READ_01: RRC A
NOP ;先传输地址到DS1302 MOV IO_DATA,C NOP NOP
SETB SCLK NOP NOP
CLR SCLK
NOP NOP
DJNZ R2,READ_01 NOP NOP
SETB IO_DATA CLR A CLR C
MOV R2,#08H READ_02: CLR SCLK NOP NOP
MOV C,IO_DATA NOP NOP
RRC A ;再从DS1302接收数据 NOP NOP
SETB SCLK NOP NOP
DJNZ R2,READ_02 MOV R0,A CLR RST RET
;============================================== ;实时时间、日期数据处理子程序
;============================================== CHULI:
MOV A,40H ;处理秒数据 ANL A,#0FH MOV 50H,A MOV 70H,A MOV A,40H
ANL A,#11110000B SWAP A MOV 51H,A MOV 71H,A
;--------------------------------------------- MOV A,41H ;处理分数据 ANL A,#0FH MOV 52H,A MOV 72H,A
MOV A,41H
ANL A,#11110000B SWAP A MOV 53H,A MOV 73H,A
;--------------------------------------------- MOV A,42H ;处理时数据 ANL A,#0FH MOV 54H,A MOV 74H,A MOV A,42H
ANL A,#11110000B SWAP A MOV 55H,A MOV 75H,A
;---------------------------------------------- MOV A,43H ;处理日数据 ANL A,#0FH MOV 60H,A MOV 76H,A MOV A,43H
ANL A,#11110000B SWAP A MOV 61H,A MOV 77H,A
;--------------------------------------------- MOV A,44H ;处理月数据 ANL A,#0FH MOV 62H,A MOV 78H,A MOV A,44H
ANL A,#11110000B SWAP A MOV 63H,A MOV 79H,A
;--------------------------------------------- MOV A,45H ;处理年数据 ANL A,#0FH MOV 64H,A MOV 7AH,A MOV A,45H
ANL A,#11110000B SWAP A MOV 65H,A
MOV 7BH,A
;---------------------------------------------- MOV A,46H ;处理周数据 MOV 66H,A MOV 7CH,A RET
;============================================= ;实时时间、日期查表取数子程序
;============================================= DISP: ;MOV R0,#TIME_DATA MOV R3,#06H
DISP1: MOV A,@R0 MOV DPTR,#TAB_NU MOVC A,@A+DPTR MOV @R0,A INC R0
DJNZ R3,DISP1 RET
;==================================================== ;时间、日期显示子程序
;==================================================== TIME_DISPLAY:
;MOV R0,#TIME_DATA ;取得显示单元首地址 MOV R1,#07FH ;从第一个数码管开始 MOV R2,#08H ;共8个数码管
DISLP: MOV P0,@R0 ;获得当前单元数据 MOV A,R1
MOV P2,A ;数码显示
JB ACC.5,DISLP1 ;第三位数码管显示 - MOV P0,#0f7H JMP DISLP3
DISLP1: JB ACC.2,DISLP2 ;第六位数码管显示 - MOV P0,#0f7H JMP DISLP3 DISLP2: INC R0
DISLP3: MOV A,R1 ;为下一个数准备 RR A ;下一个单元 MOV R1,A ;保存
LCALL DELAY ;为了保证数码管亮度,延时
DJNZ R2,DISLP ;重复显示,直到全部数据刷新过 RET ;返回
DELAY:
MOV R4,#0AH
L15: MOV R5,#64H L16: DJNZ R5,L16 DJNZ R4,L15 RET
;****************************************************** SET_KEY:
SETB K1 ;增加键 SETB K2 ;减少键 SETB K3 ;选择键
SETB K4 ;定时设定功能键 NOP
JB K4,KEY01 LCALL BEEP_BL
JMP DS_KEY ;进入定时值设定子程序 KEY01: JB K2,KEY02 LCALL BEEP_BL
JMP SET_TIME ;进入时间设定子程序 KEY02: JB K3,KEY03 LCALL BEEP_BL
CPL 20H.0 ;止闹标记取反 KEY03: RET
;----------------------------------------------------- DS_KEY:
CALL DS_DELAY JNB K4,$ LCALL DSSET CALL DS_DELAY RET
;============================================== ;实时时间设定子程序
;K1为加键、K2为减键、K3为选择键
;============================================== SET_TIME:
MOV R1,#8EH ;写保护寄存器 MOV R0,#00H ;允许写入 LCALL WRITE
MOV R1,#80H ;写秒寄存器 MOV R0,#80H ;停止振荡器工作 LCALL WRITE
SETB TR0