1.ds1302模块介绍
VCC1: 后备电源。
VCC2:主电源,在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由VCC1或VCC2两者中的较大者供电。当VCC2大于VCC1+0.2V时,VCC2给DS1302供电。当VCC2小于VCC1时,DS1302由VCC1供电。
X1,X2: 振荡源,外接32.768kHz晶振。
RST: 复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送. RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
I/O: 串行数据输入输出端(双向)。
SCLK: 输入端,只有在SCLK为低电平时,才能将RST置为高电平。
2.DS1302汇编代码
//************************DS1302读函数部分***********************
DS_READ:
MOV R7,#08H
MOV A,DS1302_CMD
SETB DS1302_CE
RCMD: RRC A
MOV DS1302_IO,C
CLR DS1302_SCLK
SETB DS1302_SCLK
DJNZ R7,RCMD
MOV R7,#08H
MOV A,#01H
MOV B,#00H
CLR DS1302_IO //开始接收数据标志位
RDATA: SETB DS1302_SCLK
CLR DS1302_SCLK
JNB DS1302_IO,ZERO
ORL B,A
ZERO: RL A
DJNZ R7,RDATA
CLR DS1302_CE
MOV DS1302_DAT,B
RET
//***********************************************************
//************************DS1302写函数部分***********************
DS_WRITE:
MOV R7,#08H
MOV A,DS1302_CMD
SETB DS1302_CE
WCMD: RRC A
MOV DS1302_IO,C
SETB DS1302_SCLK
CLR DS1302_SCLK
DJNZ R7,WCMD
MOV R7,#08H
MOV A,DS1302_DATA
WDATA: RRC A
MOV DS1302_IO,C
SETB DS1302_SCLK
CLR DS1302_SCLK
DJNZ R7,WDATA
CLR DS1302_CE
RET
//***********************************************************
//************************DS1302初始化***********************
DS_INIT:
CLR DS1302_SCLK
CLR DS1302_CE
RET
//***********************************************************
//**********************DS1302时间设置函数**************************
DS_TIMESET:
MOV DS1302_CMD,#8EH//设置写保护指令
MOV DS1302_DATA,#00H//关闭写保护
LCALL DS_WRITE
MOV DS1302_CMD,#80H//秒
MOV DS1302_DATA,#00H
LCALL DS_WRITE
MOV DS1302_CMD,#82H//分
MOV DS1302_DATA,#00H
LCALL DS_WRITE
MOV DS1302_CMD,#84H//时
MOV DS1302_DATA,#12H
LCALL DS_WRITE
MOV DS1302_CMD,#86H//日
MOV DS1302_DATA,#23H
LCALL DS_WRITE
MOV DS1302_CMD,#88H//月
MOV DS1302_DATA,#12H
LCALL DS_WRITE
MOV DS1302_CMD,#8CH//年
MOV DS1302_DATA,#23H
LCALL DS_WRITE
RET
//***********************************************************
其中DS1302_SCLK、DS1302_CE、DS1302_IO引脚为自己接线定义
3.完整代码部分
DS1302_CMD EQU 60H //DS1302_CMD¸ºÔðдÃüÁî¸øDS1302
DS1302_DATA EQU 61H //DS1302_DATA¸ºÔðдÊý¾Ý¸øDS1302
DS1302_DAT EQU 50H //DS1302_DAT´æ·Å¶Á³öÀ´µÄÊý¾Ý
DS1302_CE BIT P1.0
DS1302_SCLK BIT P1.1
DS1302_IO BIT P1.2
LCD1602_RS BIT P2.0
LCD1602_RW BIT P2.1
LCD1602_E BIT P2.2
LCD1602_DATA EQU P0
LCD1602_DAT DATA 21H
LCD_ALL_FLAG DATA 20H
LCD_FLAG BIT LCD_ALL_FLAG.0
LCD_LINE_BIT BIT LCD_ALL_FLAG.1
CHOOSEBUTTON BIT P3.2
ADDBUTTON BIT P3.3
DECBUTTON BIT P3.4
ALARMBUTTON BIT P3.5
BEEP BIT P2.5
ALARM_SECOND EQU 51H
ALARM_MINUTE EQU 52H
ALARM_HOUR EQU 53H
JUDGE_SECOND EQU 54H
JUDGE_MINUTE EQU 55H
JUDGE_HOUR EQU 56H
// R0:ÄÖÖÓÖ¸Õë R1:ÓÃÓÚ¼Ó¼õʱ¼ä°´Å¥ÖеļÆÊý R2: R3: R4: R5:¼Ó¼õʱ¼ä°´Å¥ÖеÄÖ¸Õë R6: R7:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: LCALL LCD1602_INIT
LCALL DS_INIT
LCALL DS_TIMESET
MOV DPTR,#TABLE
LOOP:
LCALL READTIME_LOOP
LCALL SET_TIMER
LCALL SET_ALARM
LCALL JUDGE_ALARM
LJMP LOOP
//***********************µ½µãÁËûÓÐ*********************
JUDGE_ALARM:
JNB P1.7,JUDGE
RET
JUDGE: LCALL READTIME_LOOP
LCALL JUDGE_TIME
LJMP JUDGE_ALARM
//*******************************************************
//***********************ÉèÖÃÄÖÖÓ************************
SET_ALARM:
LCALL DELAY10MS
JNB ALARMBUTTON,ALARM_TIME
RET
ALARM_TIME:
LCALL DELAY10MS
JNB ALARMBUTTON,ALARM_TIME
MOV R1,#ALARM_SECOND
MOV R5,#01H
LCALL ALARM_WORD //LCD1602ÏÔʾSET ALARM
ALARM1: LCALL DELAY10MS
JNB CHOOSEBUTTON,ALARM_CHANGE
JNB ADDBUTTON,ALARM_ADD
JNB DECBUTTON,ALARM_DEC
JNB ALARMBUTTON,SURE_SET
CJNE R5,#04H,ALARM1
LCALL LCD1602_INIT
LJMP SET_ALARM
ALARM_CHANGE:
LCALL DELAY10MS
JNB CHOOSEBUTTON,ALARM_CHANGE
INC R5
INC R1
LCALL ALARM_WORD
LJMP ALARM1
SURE_SET:
LCALL DELAY10MS
JNB ALARMBUTTON,SURE_SET
CLR P1.7
MOV R5,#04H
LJMP ALARM1
ALARM_ADD:
LCALL DELAY10MS
JNB ADDBUTTON,ALARM_ADD
CJNE R5,#03H,ADD_59
LJMP ADD_24
ADD_59: MOV A,@R1
ANL A,#0FH
CJNE A,#09H,ADD_ALARM_ONE
MOV A,@R1
ANL A,#0F0H
CJNE A,#50H,ADD_ALARM_TEN
MOV @R1,#00H
LCALL ALARM_WORD
LJMP ALARM1
ALARM_DEC:
LCALL DELAY10MS
JNB DECBUTTON,ALARM_DEC
CJNE R5,#03H,DEC_59
LJMP DEC_24
DEC_59: MOV A,@R1
ANL A,#0FH
CJNE A,#00H,DEC_ALARM_ONE
MOV A,@R1
ANL A,#0F0H
CJNE A,#00H,DEC_ALARM_TEN
MOV @R1,#59H
LCALL ALARM_WORD
LJMP ALARM1
ADD_ALARM_ONE:
INC @R1
LCALL ALARM_WORD
LJMP ALARM1
ADD_ALARM_TEN:
SWAP A
INC A
SWAP A
MOV @R1,A
LCALL ALARM_WORD
LJMP ALARM1
DEC_ALARM_ONE:
DEC @R1
LCALL ALARM_WORD
LJMP ALARM1
DEC_ALARM_TEN:
ORL A,#09H
SWAP A
DEC A
SWAP A
MOV @R1,A
LCALL ALARM_WORD
LJMP ALARM1
ADD_24:
MOV A,@R1
ANL A,#0F0H
CJNE A,#20H,ADD_9
MOV A,@R1
ANL A,#0FH
CJNE A,#03H,ADD_ALARM_ONE
MOV @R1,#00H
LCALL ALARM_WORD
LJMP ALARM1
ADD_9: MOV A,@R1
ANL A,#0FH
CJNE A,#09H,ADD_ALARM_ONE
MOV A,@R1
ANL A,#0F0H
CJNE A,#20H,ADD_ALARM_TEN
DEC_24: MOV A,@R1
ANL A,#0FH
CJNE A,#00H,DEC_ALARM_ONE
MOV A,@R1
ANL A,#0F0H
CJNE A,#00H,DEC_ALARM_TEN
MOV @R1,#23H
LCALL ALARM_WORD
LJMP ALARM1
//*****************************************************
//**********************LCDÏÔʾÄÖÖÓ********************
ALARM_WORD:
LCALL LCD1602_INIT
MOV LCD1602_DAT,#80H
LCALL LCD1602_WRITECMD
MOV LCD1602_DAT,#'S'
LCALL LCD1602_WRITEDATA
MOV LCD1602_DAT,#'E'
LCALL LCD1602_WRITEDATA
MOV LCD1602_DAT,#'T'
LCALL LCD1602_WRITEDATA
MOV LCD1602_DAT,#' '
LCALL LCD1602_WRITEDATA
MOV LCD1602_DAT,#'A'
LCALL LCD1602_WRITEDATA
MOV LCD1602_DAT,#'L'
LCALL LCD1602_WRITEDATA
MOV LCD1602_DAT,#'A'
LCALL LCD1602_WRITEDATA
MOV LCD1602_DAT,#'R'
LCALL LCD1602_WRITEDATA
MOV LCD1602_DAT,#'M'
LCALL LCD1602_WRITEDATA
MOV LCD1602_DAT,#':'
LCALL LCD1602_WRITEDATA
MOV LCD1602_DAT,#8FH
LCALL LCD1602_WRITECMD
MOV A,R5
MOVC A,@A+DPTR
MOV LCD1602_DAT,A
LCALL LCD1602_WRITEDATA
MOV LCD1602_DAT,#0C4H
LCALL LCD1602_WRITECMD
MOV R0,#ALARM_HOUR
MOV R2,#03H
WORD1: MOV A,@R0
LCALL LCD1602_WRITEHEXDATA
CJNE R2,#01H,WORDMARK
WORD2: DJNZ R2,WORD1
RET
WORDMARK:
MOV LCD1602_DAT,#':'
LCALL LCD1602_WRITEDATA
DEC R0
LJMP WORD2
//**********************************************************
//*******************µ½µãÁËûµÄ×Ó³ÌÐò***********************
JUDGE_TIME:
LCALL READTIME_LOOP
MOV R0,#JUDGE_SECOND
MOV R2,#03H
MOV R5,#81H
LCALL DELAY10MS
JNB ALARMBUTTON,J_RETURN
J_LOOP: MOV DS1302_CMD,R5
LCALL DS_READ
MOV @R0,DS1302_DAT
INC R0
INC R5
INC R5
DJNZ R2,J_LOOP
MOV R0,#JUDGE_SECOND
MOV A,@R0
CJNE A,ALARM_SECOND,JUDGE_TIME
INC R0
MOV A,@R0
CJNE A,ALARM_MINUTE,JUDGE_TIME
INC R0
MOV A,@R0
CJNE A,ALARM_HOUR,JUDGE_TIME
LCALL BEEP_OPEN
J_RETURN:
LCALL DELAY10MS
JNB ALARMBUTTON,J_RETURN
SETB P1.7
RET
BEEP_OPEN:
CLR BEEP
LCALL DELAY10MS
LCALL READTIME_LOOP
JB ALARMBUTTON,BEEP_OPEN
SETB BEEP
CLR P1.7
RET
//**************************************************************
//*********************ÉèÖÃʱ¼ä×Ó³ÌÐò***************************
SET_TIMER:
LCALL DELAY10MS
JNB CHOOSEBUTTON,SET_TIME
RET
SET_TIME:
MOV DS1302_CMD,#8EH
MOV DS1302_DATA,#00H
LCALL DS_WRITE //¹Ø±Õд±£»¤
MOV DS1302_CMD,#81H
LCALL DS_READ
MOV A,DS1302_DAT
ORL A,#80H
MOV DS1302_DATA,A
MOV DS1302_CMD,#80H
LCALL DS_WRITE //¹Ø±Õ¼Æʱ
LCALL DELAY10MS
JNB CHOOSEBUTTON,SET_TIME
MOV R1,#00H
MOV R5,#81H
INC R1
TIME1: MOV LCD1602_DAT,#8FH
LCALL LCD1602_WRITECMD
MOV A,R1
MOVC A,@A+DPTR
MOV LCD1602_DAT,A
LCALL LCD1602_WRITEDATA
LCALL DELAY10MS
JNB CHOOSEBUTTON,CHANGEWHAT
JNB ADDBUTTON,ADDTIME
JNB DECBUTTON,DECTIME
CJNE R1,#07H,TIME1
LJMP START
CHANGEWHAT:
LCALL DELAY10MS
JNB CHOOSEBUTTON,CHANGEWHAT
INC R1
INC R5
INC R5
LJMP TIME1
ADDTIME:
CJNE R1,#01H,MINUTE1
LJMP ADD_SECOND
MINUTE1:CJNE R1,#02H,HOUR1
LJMP ADD_MINUTE
HOUR1: CJNE R1,#03H,DATE1
LJMP ADD_HOUR
DATE1: CJNE R1,#04H,MOUTH1
LJMP ADD_DATE
MOUTH1: CJNE R1,#05H,YEAR1
LJMP ADD_MOUTH
YEAR1: CJNE R1,#06H,TIME1
LJMP ADD_YEAR
DECTIME:
CJNE R1,#01H,MINUTE2
LJMP DEC_SECOND
MINUTE2:CJNE R1,#02H,HOUR2
LJMP DEC_MINUTE
HOUR2: CJNE R1,#03H,DATE2
LJMP DEC_HOUR
DATE2: CJNE R1,#04H,MOUTH2
LJMP DEC_DATE
MOUTH2: CJNE R1,#05H,YEAR2
LJMP DEC_MOUTH
YEAR2: CJNE R1,#06H,TIME1
LJMP DEC_YEAR
//****************************************************************
//*************************µ÷ÕûÃë×Ó³ÌÐò***************************
ADD_SECOND:
LCALL DELAY10MS
JNB ADDBUTTON,ADD_SECOND
MOV DS1302_CMD,R5
LCALL DS_READ
MOV A,DS1302_DAT
MOV B,A
ANL A,#0FH
CJNE A,#09H,ADD_SECOND_ONE
MOV A,B
ANL A,#0F0H
CJNE A,#0D0H,ADD_SECOND_TEN
ANL A,#80H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
ADD_SECOND_ONE:
LJMP ADD_ONE
ADD_SECOND_TEN:
LJMP ADD_TEN
DEC_SECOND:
LCALL DELAY10MS
JNB DECBUTTON,DEC_SECOND
MOV DS1302_CMD,R5
LCALL DS_READ
MOV A,DS1302_DAT
MOV B,A
ANL A,#0FH
CJNE A,#00H,DEC_SECOND_ONE
MOV A,B
ANL A,#0F0H
CJNE A,#80H,DEC_SECOND_TEN
ORL A,#0D9H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
DEC_SECOND_ONE:
LJMP DEC_ONE
DEC_SECOND_TEN:
MOV A,B
ANL A,#0F0H
ORL A,#09H
LJMP DEC_TEN
//***********************************************************
//**********************µ÷Õû·ÖÖÓ×Ó³ÌÐò***********************
ADD_MINUTE:
LCALL DELAY10MS
JNB ADDBUTTON,ADD_MINUTE
MOV DS1302_CMD,R5
LCALL DS_READ
MOV A,DS1302_DAT
MOV B,A
ANL A,#0FH
CJNE A,#09H,ADD_MINUTE_ONE
MOV A,B
ANL A,#0F0H
CJNE A,#50H,ADD_MINUTE_TEN
ANL A,#00H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
ADD_MINUTE_ONE:
LJMP ADD_ONE
ADD_MINUTE_TEN:
LJMP ADD_TEN
DEC_MINUTE:
LCALL DELAY10MS
JNB DECBUTTON,DEC_MINUTE
MOV DS1302_CMD,R5
LCALL DS_READ
MOV A,DS1302_DAT
MOV B,A
ANL A,#0FH
CJNE A,#00H,DEC_MINUTE_ONE
MOV A,B
ANL A,#0F0H
CJNE A,#00H,DEC_MINUTE_TEN
ORL A,#0D9H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
DEC_MINUTE_ONE:
LJMP DEC_ONE
DEC_MINUTE_TEN:
MOV A,B
ANL A,#0F0H
ORL A,#09H
LJMP DEC_TEN
//***********************************************************
//************************µ÷ÕûСʱ×Ó³ÌÐò*********************
ADD_HOUR:
LCALL DELAY10MS
JNB ADDBUTTON,ADD_HOUR
MOV DS1302_CMD,R5
LCALL DS_READ
MOV A,DS1302_DAT
MOV B,A
ANL A,#0F0H
CJNE A,#20H,MAX_10
MOV A,B
ANL A,#0FH
CJNE A,#03H,ADD_HOUR_ONE
MOV A,#00H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
MAX_10: MOV A,B
ANL A,#0FH
CJNE A,#09H,ADD_HOUR_ONE
MOV A,B
ANL A,#0F0H
CJNE A,#20H,ADD_HOUR_TEN
MOV A,#00H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LJMP TIME1
ADD_HOUR_ONE:
LJMP ADD_ONE
ADD_HOUR_TEN:
LJMP ADD_TEN
DEC_HOUR:
LCALL DELAY10MS
JNB DECBUTTON,DEC_HOUR
MOV DS1302_CMD,R5
LCALL DS_READ
MOV A,DS1302_DAT
MOV B,A
ANL A,#0FH
CJNE A,#00H,DEC_HOUR_ONE
MOV A,B
ANL A,#0F0H
CJNE A,#00H,DEC_HOUR_TEN
MOV A,#23H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
DEC_HOUR_ONE:
LJMP DEC_ONE
DEC_HOUR_TEN:
MOV A,B
ORL A,#09H
LJMP DEC_TEN
//***********************************************************
//***********************µ÷ÕûÈÕÆÚ×Ó³ÌÐò**********************
ADD_DATE:
LCALL DELAY10MS
JNB ADDBUTTON,ADD_DATE
MOV DS1302_CMD,R5
LCALL DS_READ
MOV A,DS1302_DAT
MOV B,A
ANL A,#0F0H
CJNE A,#30H,MAX_9
MOV A,B
ANL A,#0FH
CJNE A,#01H,ADD_DATE_ONE
MOV A,#00H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
MAX_9: MOV A,B
ANL A,#0FH
CJNE A,#09H,ADD_DATE_ONE
MOV A,B
ANL A,#0F0H
CJNE A,#30H,ADD_DATE_TEN
ADD_DATE_ONE:
LJMP ADD_ONE
ADD_DATE_TEN:
LJMP ADD_TEN
DEC_DATE:
LCALL DELAY10MS
JNB DECBUTTON,DEC_DATE
MOV DS1302_CMD,R5
LCALL DS_READ
MOV A,DS1302_DAT
MOV B,A
ANL A,#0FH
CJNE A,#00H,DEC_DATE_ONE
MOV A,B
ANL A,#0F0H
CJNE A,#00H,DEC_DATE_TEN
MOV A,#31H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
DEC_DATE_ONE:
LJMP DEC_ONE
DEC_DATE_TEN:
MOV A,B
ORL A,#09H
LJMP DEC_TEN
//*******************************************************
//********************µ÷ÕûÔ·Ý×Ó³ÌÐò*********************
ADD_MOUTH:
LCALL DELAY10MS
JNB ADDBUTTON,ADD_MOUTH
MOV DS1302_CMD,R5
LCALL DS_READ
MOV A,DS1302_DAT
MOV B,A
ANL A,#0F0H
CJNE A,#10H,MAX_TEN
MOV A,B
ANL A,#0FH
CJNE A,#02H,ADD_MOUTH_ONE
MOV A,#01H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
MAX_TEN:MOV A,B
ANL A,#0FH
CJNE A,#09H,ADD_MOUTH_ONE
MOV A,B
ANL A,#0F0H
CJNE A,#10H,ADD_MOUTH_TEN
MOV A,#00H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
ADD_MOUTH_ONE:
LJMP ADD_ONE
ADD_MOUTH_TEN:
LJMP ADD_TEN
DEC_MOUTH:
LCALL DELAY10MS
JNB DECBUTTON,DEC_MOUTH
MOV DS1302_CMD,R5
LCALL DS_READ
MOV A,DS1302_DAT
MOV B,A
ANL A,#0FH
CJNE A,#00H,DEC_MOUTH_ONE
MOV A,B
ANL A,#0F0H
CJNE A,#00H,DEC_MOUTH_TEN
MOV A,#12H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
DEC_MOUTH_ONE:
LJMP DEC_ONE
DEC_MOUTH_TEN:
MOV A,B
ORL A,#09H
LJMP DEC_TEN
//*************************************************************
//*************************µ÷ÕûÄê·Ý×Ó³ÌÐò**********************
ADD_YEAR:
LCALL DELAY10MS
JNB ADDBUTTON,ADD_YEAR
MOV R5,#8DH
MOV DS1302_CMD,R5
LCALL DS_READ
MOV A,DS1302_DAT
MOV B,A
ANL A,#0FH
CJNE A,#09H,ADD_YEAR_ONE
MOV A,B
ANL A,#0F0H
CJNE A,#90H,ADD_YEAR_TEN
MOV A,#00H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
MOV R5,#8BH
LJMP TIME1
ADD_YEAR_ONE:
LJMP ADD_ONE
ADD_YEAR_TEN:
LJMP ADD_TEN
DEC_YEAR:
LCALL DELAY10MS
JNB DECBUTTON,DEC_YEAR
MOV R5,#8DH
MOV DS1302_CMD,R5
LCALL DS_READ
MOV A,DS1302_DAT
MOV B,A
ANL A,#0FH
CJNE A,#00H,DEC_YEAR_ONE
MOV A,B
ANL A,#0F0H
CJNE A,#00H,DEC_YEAR_TEN
MOV A,#99H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
MOV R5,#8BH
LJMP TIME1
DEC_YEAR_ONE:
LJMP DEC_ONE
DEC_YEAR_TEN:
MOV A,B
ORL A,#09H
LJMP DEC_TEN
//*********************************************************
//*********************¼Ó¼õ·¨×Ó³ÌÐò************************
ADD_ONE:INC B
MOV A,B
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
ADD_TEN:SWAP A
INC A
SWAP A
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
DEC_ONE:DEC B
MOV A,B
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
DEC_TEN:CLR C
SUBB A,#10H
DEC R5
MOV DS1302_CMD,R5
MOV DS1302_DATA,A
LCALL DS_WRITE
INC R5
LCALL READTIME_LOOP
LJMP TIME1
//******************************************************
//**************µ÷ÕûºóÆô¶¯¼Æʱ×Ó³ÌÐò********************
START: MOV LCD1602_DAT,#8FH
LCALL LCD1602_WRITECMD
MOV LCD1602_DAT,#' '
LCALL LCD1602_WRITEDATA
MOV R5,#81H
MOV R1,#00H
MOV DS1302_CMD,#81H
LCALL DS_READ
MOV A,#7FH
ANL A,DS1302_DAT //´ò¿ª¼Æʱ¹¦ÄÜ
MOV DS1302_CMD,#80H
MOV DS1302_DATA,A
LCALL DS_WRITE
MOV DS1302_CMD,#8EH
MOV DS1302_DATA,#80H //´ò¿ªÐ´±£»¤
LCALL DS_WRITE
LJMP LOOP
//*******************************************************
DELAY10MS:
PUSH 30H
PUSH 31H
MOV 30H,#25
DELAY1: MOV 31H,#90
DJNZ 31H,$
DJNZ 30H,DELAY1
POP 31H
POP 30H
RET
//***************ʱ¼ä¶ÁÈ¡Ñ»·º¯Êý*******************
READTIME_LOOP:
//**************¶Áȡʱ¼äºÍÐÇÆÚº¯Êý******************
MOV LCD1602_DAT,#0C4H
LCALL LCD1602_WRITECMD
MOV R2,#03H
MOV R3,#85H
L1: MOV DS1302_CMD,R3
LCALL DS_READ
MOV A,DS1302_DAT
CJNE R3,#81H,L12
ANL A,#7FH
L12: LCALL LCD1602_WRITEHEXDATA
CJNE R2,#01H,LCD1602_MARKTIME
L11: DEC R3
DEC R3
DJNZ R2,L1
//****************************************************
//**************¶ÁÈ¡ÈÕÆÚº¯Êý**************************
MOV LCD1602_DAT,#083H
LCALL LCD1602_WRITECMD
MOV LCD1602_DAT,#'2'
LCALL LCD1602_WRITEDATA
MOV LCD1602_DAT,#'0'
LCALL LCD1602_WRITEDATA
MOV DS1302_CMD,#8DH
LCALL DS_READ
MOV A,DS1302_DAT
LCALL LCD1602_WRITEHEXDATA
MOV LCD1602_DAT,#'/'
LCALL LCD1602_WRITEDATA
MOV R2,#02H
MOV R3,#89H
L2: MOV DS1302_CMD,R3
LCALL DS_READ
MOV A,DS1302_DAT
LCALL LCD1602_WRITEHEXDATA
CJNE R2,#01H,LCD1602_MARKDATE
L22: DEC R3
DEC R3
DJNZ R2,L2
//***********************************************************
RET
//***********************************************************
//*******************ʱ¼äºÍÈÕÆÚ·ûºÅ**************************
LCD1602_MARKTIME:
MOV LCD1602_DAT,#':'
LCALL LCD1602_WRITEDATA
LJMP L11
LCD1602_MARKDATE:
MOV LCD1602_DAT,#'/'
LCALL LCD1602_WRITEDATA
LJMP L22
//***********************************************************
//**********************DS1302²¿·Ö***************************
//**********************DS1302¶Áº¯Êý²¿·Ö*********************
DS_READ:
MOV R7,#08H
MOV A,DS1302_CMD
SETB DS1302_CE
RCMD: RRC A
MOV DS1302_IO,C
CLR DS1302_SCLK
SETB DS1302_SCLK
DJNZ R7,RCMD
MOV R7,#08H
MOV A,#01H
MOV B,#00H
CLR DS1302_IO //¿ªÊ¼½ÓÊÕÊý¾Ý±êÖ¾
RDATA: SETB DS1302_SCLK
CLR DS1302_SCLK
JNB DS1302_IO,ZERO
ORL B,A
ZERO: RL A
DJNZ R7,RDATA
CLR DS1302_CE
MOV DS1302_DAT,B
RET
//***********************************************************
//************************DS1302дº¯Êý***********************
DS_WRITE:
MOV R7,#08H
MOV A,DS1302_CMD
SETB DS1302_CE
WCMD: RRC A
MOV DS1302_IO,C
SETB DS1302_SCLK
CLR DS1302_SCLK
DJNZ R7,WCMD
MOV R7,#08H
MOV A,DS1302_DATA
WDATA: RRC A
MOV DS1302_IO,C
SETB DS1302_SCLK
CLR DS1302_SCLK
DJNZ R7,WDATA
CLR DS1302_CE
RET
//***********************************************************
//************************DS1302³õʼ»¯***********************
DS_INIT:
CLR DS1302_SCLK
CLR DS1302_CE
RET
//***********************************************************
DS_TIMESET:
MOV DS1302_CMD,#8EH
MOV DS1302_DATA,#00H
LCALL DS_WRITE
MOV DS1302_CMD,#80H
MOV DS1302_DATA,#00H
LCALL DS_WRITE
MOV DS1302_CMD,#82H
MOV DS1302_DATA,#00H
LCALL DS_WRITE
MOV DS1302_CMD,#84H
MOV DS1302_DATA,#12H
LCALL DS_WRITE
MOV DS1302_CMD,#86H
MOV DS1302_DATA,#23H
LCALL DS_WRITE
MOV DS1302_CMD,#88H
MOV DS1302_DATA,#12H
LCALL DS_WRITE
MOV DS1302_CMD,#8CH
MOV DS1302_DATA,#23H
LCALL DS_WRITE
RET
//******************LCD1602²¿·Ö******************************
//******************LCD1602 16½øÖÆת10½øÖÆÊä³öº¯Êý***********
LCD1602_WRITEHEXDATA:
MOV B,A
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV LCD1602_DAT,A
LCALL LCD1602_WRITEDATA
MOV A,B
ANL A,#0FH
MOVC A,@A+DPTR
MOV LCD1602_DAT,A
LCALL LCD1602_WRITEDATA
RET
//***********************************************************
//***********************LCD1602¶Á溯Êý****************************
LCD1602_R_DATA:
MOV LCD1602_DATA,#0FFH
LCD_BUSY:
CLR LCD1602_RS
SETB LCD1602_RW
NOP
SETB LCD1602_E
NOP
MOV A,LCD1602_DATA
MOV C,ACC.7
MOV LCD_FLAG,C
CLR LCD1602_E
NOP
JB LCD_FLAG,LCD_BUSY
RET
//***********************************************************
//********************LCD1602дÃüÁÊý***************************
LCD1602_WRITECMD:
LCALL LCD1602_R_DATA
CLR LCD1602_RS
CLR LCD1602_RW
NOP
MOV LCD1602_DATA,LCD1602_DAT
SETB LCD1602_E
NOP
CLR LCD1602_E
RET
//***********************************************************
//********************LCD1602дÊý¾Ý***************************
LCD1602_WRITEDATA:
LCALL LCD1602_R_DATA
SETB LCD1602_RS
CLR LCD1602_RW
NOP
MOV LCD1602_DATA,LCD1602_DAT
SETB LCD1602_E
NOP
CLR LCD1602_E
RET
//***********************************************************
//********************LCD1602³õʼ»¯***************************
LCD1602_INIT:
MOV LCD1602_DAT,#038H
LCALL LCD1602_WRITECMD
MOV LCD1602_DAT,#08H
LCALL LCD1602_WRITECMD
MOV LCD1602_DAT,#01H
LCALL LCD1602_WRITECMD
MOV LCD1602_DAT,#06H
LCALL LCD1602_WRITECMD
MOV LCD1602_DAT,#0CH
LCALL LCD1602_WRITECMD
RET
//***********************************************************
TABLE: DB '0','1','2','3','4','5','6','7','8','9'
END
其中包含LCD1602显示函数,蜂鸣器闹钟函数,时间修改函数。