基于51单片机驱动DS1302时钟模块学习笔记(汇编代码)

 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显示函数,蜂鸣器闹钟函数,时间修改函数。

  • 26
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值