code ASM giao tiếp với DS1307


  1. SCL        BIT P1.0
    SDA        BIT P1.1
    DA_TA    BIT P3.0
    SH        BIT P3.1
    ST        BIT P3.2
    MODE    BIT P3.3
    UP        BIT P3.4
    DOWN    BIT P3.5
     
    DV_M    EQU    60H
    CH_M    EQU    61H
    DV_H    EQU    62H
    CH_H    EQU 63H
     
    CDOI1    EQU    38H
    CDOI2    EQU    39H
    TEMP    EQU    37H
    F_SEND_TIME    BIT    00H
    F_SEND_DATE    BIT    01H
    F_SEND        BIT    02H
    SECONDS        DATA    30H
    MINUTES        DATA    31H
    HOUR        DATA    32H
    DAY            DATA    33H
    DATE        DATA    34H
    MONTH        DATA    35H
    YEAR        DATA    36H
        ORG 00H
        CLR SH
        CLR ST
        LJMP MAIN
    MAIN:
        CALL    I2C_INIT
        CALL    DS1307_INIT
        CALL    DS1307_OUTPUT
        ;MOV    SECONDS,#31H   
        ;MOV    MINUTES,#31H
        ;MOV    HOUR,#10H
    DOC_GIO:
        SETB P3.7
        CALL    DS1307_READ_TIME
        MOV TEMP,HOUR
        CALL BCD2HEX
        MOV DV_H,CDOI2
        MOV CH_H,CDOI1
        MOV TEMP,MINUTES
        CALL BCD2HEX
        MOV DV_M,CDOI2
        MOV CH_M,CDOI1   
        CALL    SERIAL
        JNB MODE,CHINH_GIO
        JMP DOC_GIO
    CHINH_GIO:
        JNB MODE,$
        MOV DV_M,#10
        MOV CH_M,#10
        CALL SERIAL
    SCAN_GIO:
        JNB MODE,THOAT_CHINH_GIO
        JNB UP,TANG_GIO
        JNB DOWN,GIAM_GIO
        CALL SERIAL
        JMP SCAN_GIO
    THOAT_CHINH_GIO:
        JNB MODE,$
        MOV CDOI1,CH_H
        MOV CDOI2,DV_H
        CALL HEX2BCD
        MOV HOUR,A
        CALL DS1307_WRITE_TIME
        NOP
        JMP DOC_GIO
    TANG_GIO:
        JNB UP,$
        INC DV_H
        MOV A,CH_H
        CJNE A,#2,SKIP
        MOV A,DV_H
        CJNE A,#5,TANG_GIO
        MOV CH_H,#0
        MOV DV_H,#0
        JMP SCAN_GIO
    SKIP:
        MOV A,DV_H
        CJNE A,#10,SCAN_GIO
        MOV DV_H,#0
        INC CH_H
        JMP SCAN_GIO
    GIAM_GIO:
    ;****************************************
    BCD2HEX:
        MOV A,TEMP
        SWAP A
        ANL A,#0FH
        MOV CDOI1,A
        MOV A,TEMP
        ANL A,#0FH
        MOV CDOI2,A
        RET
    HEX2BCD:
        MOV A,CDOI1
        ADD A,#0F0H
        MOV CDOI1,a
        MOV A,CDOI2
        SWAP A
        ANL A,#0FH
        add a,CDOI1
        RET
    ;****************************************         
    SERIAL:
            PUSH ACC
            MOV DPTR,#DU_LIEU
            MOV A,DV_M
            MOVC A,@a+dptr
            CALL DICH
            MOV    A,CH_M
            MOVC A,@A+DPTR
            CALL DICH
            MOV A,DV_H
            MOVC A,@A+DPTR
            CALL DICH
            MOV A,CH_H
            MOVC A,@A+DPTR
            CALL DICH
            SETB ST
            CLR ST
            ;CALL DELAY
            POP ACC
            RET
    ;**************************************************
    DICH:
            MOV R5,#8
    LOOP:
            CLR C
            RLC A
            MOV DA_TA,C
            SETB SH
            NOP
            CLR SH
            DJNZ R5,LOOP
            RET
    DS1307_INIT:
        CALL    I2C_START
        MOV    A,#0D0H        ;DIA CHI DS1307
        LCALL    I2C_WRITE    ;
        ;JC    $-5   
        MOV    A,#00H        ;DIA CHI THANH GHI 0
        LCALL    I2C_WRITE
        MOV    A,#00H        ;ENABLE    THE oscillator (CH bit = 0)
        LCALL    I2C_WRITE
        CALL    I2C_STOP
        RET
    DS1307_OUTPUT:
        CALL    I2C_START
        MOV    A,#0D0H        ;DIA CHI DS1307
        CALL    I2C_WRITE    ;
        MOV    A,#07H        ;DIA CHI THANH GHI 0
        CALL    I2C_WRITE
        MOV    A,#10H        ;ENABLE    THE OUTPUT oscillator F=1HZ
        CALL    I2C_WRITE
        CALL    I2C_STOP
        RET
    DS1307_WRITE_TIME:
        CALL    I2C_START
        MOV    A,#0D0H        ;DIA CHI DS1307
        CALL    I2C_WRITE    ;
        MOV    A,#00H        ;DIA CHI THANH GHI 0
        CALL    I2C_WRITE
        MOV    A,SECONDS    ;
        CALL    I2C_WRITE
        MOV    A,MINUTES    ;
        CALL    I2C_WRITE
        MOV    A,HOUR        ;
        CALL    I2C_WRITE
        CALL    I2C_STOP
        RET
    DS1307_WRITE_DATE:
        CALL    I2C_START
        MOV    A,#0D0H        ;DIA CHI DS1307
        CALL    I2C_WRITE    ;
        MOV    A,#03H        ;DIA CHI THANH GHI 3
        CALL    I2C_WRITE
        MOV    A,DAY        ;THU   
        CALL    I2C_WRITE
        MOV    A,DATE        ;NGAY
        CALL    I2C_WRITE
        MOV    A,MONTH        ;THANG
        CALL    I2C_WRITE   
        MOV    A,YEAR        ;NAM
        CALL    I2C_WRITE
        CALL    I2C_STOP
        RET
    DS1307_READ_TIME:
        CALL    I2C_START
        MOV    A,#0D0H        ;DIA CHI DS1307 VA WRITE
        CALL    I2C_WRITE    ;
        MOV    A,#00H        ;DIA CHI THANH GHI 0
        CALL    I2C_WRITE
        CALL    I2C_RESTART
        MOV    A,#0D1H        ;DIA CHI DS1307 VA READ
        CALL    I2C_WRITE
        CALL    I2C_READ_ACK
        MOV    SECONDS,A
        CALL    I2C_READ_ACK
        MOV    MINUTES,A
        CALL    I2C_READ_NACK
        MOV    HOUR,A
        CALL    I2C_STOP
        RET
    DS1307_READ_DATE:
        CALL    I2C_START
        MOV    A,#0D0H        ;DIA CHI DS1307 VA WRITE
        CALL    I2C_WRITE    ;
        MOV    A,#03H        ;DIA CHI THANH GHI 3
        CALL    I2C_WRITE
        CALL    I2C_RESTART
        MOV    A,#0D1H        ;DIA CHI DS1307 VA READ
        CALL    I2C_WRITE
        CALL    I2C_READ_ACK
        MOV    DAY,A
        CALL    I2C_READ_ACK
        MOV    DATE,A
        CALL    I2C_READ_ACK
        MOV    MONTH,A
        CALL    I2C_READ_NACK
        MOV    YEAR,A
        CALL    I2C_STOP
        RET
    I2C_WRITE:
        PUSH    07H
        MOV    R7,#8
      ___LOOP_I2C_WRITE:
        CLR    SCL
        RLC    A
        MOV    SDA,C
        NOP
        NOP
        SETB    SCL
        NOP
        NOP
        DJNZ    R7,___LOOP_I2C_WRITE
        CLR    SCL
        NOP
        NOP
        NOP
        NOP
        SETB    SDA        ;CAU HINH NGO VAO SDA DOC ACK
        SETB    SCL
        NOP
        MOV    C,SDA        ;KIEM TRA CO "C" DE XAC DINH LOI
        NOP
        NOP
        CLR    SCL
        POP    07H
        RET
    I2C_READ_ACK:
        PUSH    07H
        MOV    R7,#8
        SETB    SDA        ;CAU HINH NGO VAO SDA
    ___LOOP_I2C_READ_ACK:
        SETB    SCL
        NOP
        MOV    C,SDA
        RLC    A        ;BYTE DOC VE LUU TRONG THANH GHI "A"
        NOP
        CLR    SCL
        NOP
        NOP
        NOP
        DJNZ    R7,___LOOP_I2C_READ_ACK
        CLR    SDA
        NOP
        SETB    SCL
        NOP
        NOP
        NOP
        NOP
        CLR    SCL
        POP    07H
        RET
    I2C_READ_NACK:
        PUSH    07H
        MOV    R7,#8
        SETB    SDA        ;CAU HINH NGO VAO SDA
    ___LOOP_I2C_READ_NACK:
        SETB    SCL
        NOP
        MOV    C,SDA
        RLC    A        ;BYTE DOC VE LUU TRONG THANH GHI "A"
        NOP
        CLR    SCL
        NOP
        NOP
        NOP
        DJNZ    R7,___LOOP_I2C_READ_NACK
        SETB    SDA
        NOP
        SETB    SCL
        NOP
        NOP
        NOP
        NOP
        CLR    SCL
        POP    07H
        RET
    I2C_INIT:
        SETB    SCL
        SETB    SDA
        RET
    I2C_START:
        SETB    SDA
        SETB    SCL
        NOP        ;DELAY 4.7US
        NOP        ;Bus Free Time Between a STOP and START Condition
        NOP   
        NOP
        NOP
        CLR    SDA
        NOP        ;DELAY 4US
        NOP        ;Hold Time (Repeated) START Condition
        NOP   
        NOP
        CLR    SCL
        RET
    I2C_STOP:
        CLR    SDA
        SETB    SCL
        NOP        ;DELAY    4.7US
        NOP        ;Setup Time for STOP Condition
        NOP
        NOP   
        NOP
        SETB    SDA
        RET
    I2C_RESTART:
        SETB    SDA
        SETB    SCL
        NOP        ;DELAY 4.7US
        NOP        ;Setup Time for a Repeated START Condition
        NOP   
        NOP
        NOP
        CLR    SDA
        NOP        ;DELAY 4US
        NOP        ;Hold Time (Repeated) START Condition
        NOP   
        NOP
        CLR    SCL
        NOP
        NOP
        RET
    SCL_HIGH:
        NOP        ;DELAY 4US
        NOP        ;HIGH Period of SCL Clock
        SETB    SCL
        NOP
        NOP
        RET
    SCL_LOW:
        NOP        ;DELAY 4.7US
        NOP        ;LOW Period of SCL Clock
        CLR    SCL
        NOP
        NOP
        NOP
        RET
    DU_LIEU:
        DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
    END

0 nhận xét :

Đăng nhận xét