Serial EEPROM Interfacing (AT24C08 with AT89C2051)
...................................................................................................................................

Introduction:

Many designers today are implementing embedded systems that require low cost non-volatile memory. Microchip has addressed this need with a full line of serial EEPROMs, in a variety of memory configurations, using the industry-standard 2- or 3-wire communication protocols.
Circuit Diagram
SDA1        EQU        P1.1         ;SDA=PIN5
SCL1        EQU        P1.0                ;SCL=PIN6

WTCMD EQU   10100000B       ;WRITE DATA COMMAND
RDCMD EQU   10100001B       ;READ DATA COMMAND


;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;                STORE A BYTE IN EEPROM  (Data 8F in address location 2AH)
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                  
               MOV A,#WTCMD ;LOAD WRITE COMMAND
               CALL OUTS ;SEND IT
               MOV A,#2AH ;GET BYTE ADDRESS
               CALL OUT ;SEND IT
               MOV A,#8FH ;GET DATA
               CALL OUT ;SEND IT
               CALL STOP ;SEND STOP CONDITION
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;                        READ A BYTE FROM EEPROM FROM ADDRESS LOCATION 4DH
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                  
               MOV     A,#WTCMD        ;LOAD WRITE COMMAND TO SEND ADDRESS
               CALL    OUTS            ;SEND IT
              MOV     A,#4DH            ;GET LOW BYTE ADDRESS
              CALL    OUT             ;SEND IT
              CALL    CREAD           ;GET DATA BYTE
              MOV A,R1 
              CALL MDELAY           
                     RET
;***********************************************************************
;                EEPROM ROUTINES
;***********************************************************************


;***********************************************************************
; THIS ROUTINE SENDS OUT CONTENTS OF THE ACCUMULATOR
; to the EEPROM and includes START condition.  Refer to the data sheets
; for discussion of START and STOP conditions.
;***********************************************************************

OUTS:   MOV     R2,#8           ;LOOP COUNT -- EQUAL TO BIT COUNT
        SETB   SDA1            ;INSURE DATA IS HI              
        SETB    SCL1            ;INSURE CLOCK IS HI
        NOP                     ;NOTE 1
        NOP                    
        NOP
        CLR     SDA1            ;START CONDITION -- DATA = 0
        NOP                     ;NOTE 1
        NOP     
        NOP
        CLR     SCL1            ;CLOCK = 0
OTSLP:  RLC     A               ;SHIFT BIT
        JNC     BITLS
        SETB    SDA1            ;DATA = 1
        JMP     OTSL1           ;CONTINUE
BITLS:  CLR     SDA1            ;DATA = 0
OTSL1:  SETB    SCL1            ;CLOCK HI
        NOP                     ;NOTE 1
        NOP
        NOP
       
        CLR     SCL1            ;CLOCK LOW
        DJNZ    R2,OTSLP        ;DECREMENT COUNTER
        SETB    SDA1            ;TURN PIN INTO INPUT
        NOP                     ;NOTE 1
                            
        SETB    SCL1            ;CLOCK ACK
        NOP                     ;NOTE 1
        NOP
        NOP
     
        CLR     SCL1
        RET

;**********************************************************************
; THIS ROUTINE SENDS OUT CONTENTS OF ACCUMLATOR TO EEPROM
; without sending a START condition.
;**********************************************************************

OUT:    MOV     R2,#8           ;LOOP COUNT -- EQUAL TO BIT COUNT
OTLP:   RLC     A               ;SHIFT BIT
        JNC     BITL           
        SETB    SDA1            ;DATA = 1
        JMP     OTL1            ;CONTINUE
BITL:   CLR     SDA1            ;DATA = 0
OTL1:   SETB    SCL1            ;CLOCK HI
        NOP                     ;NOTE 1
        NOP
        NOP
    
        CLR     SCL1            ;CLOCK LOW
        DJNZ    R2,OTLP         ;DECREMENT COUNTER
        SETB    SDA1            ;TURN PIN INTO INPUT
        NOP                     ;NOTE 1
    
        SETB    SCL1            ;CLOCK ACK
        NOP                     ;NOTE 1
        NOP
        NOP
     
        CLR     SCL1
        RET


STOP:   CLR     SDA1            ;STOP CONDITION SET DATA LOW
        NOP                     ;NOTE 1
        NOP
        NOP
     
        SETB    SCL1            ;SET CLOCK HI
        NOP                     ;NOTE 1
        NOP
        NOP
     
        SETB    SDA1            ;SET DATA HIGH
        RET
;*******************************************************************
; THIS ROUTINE READS A BYTE OF DATA FROM EEPROM
; From EEPROM current address pointer.
; Returns the data byte in R1
;*******************************************************************
CREAD:  MOV     A,#RDCMD        ;LOAD READ COMMAND
        CALL    OUTS            ;SEND IT
        CALL    IN              ;READ DATA
        MOV     R1,A            ;STORE DATA
        CALL    STOP            ;SEND STOP CONDITION
        RET

;**********************************************************************
; THIS ROUTINE READS IN A BYTE FROM THE EEPROM
; and stores it in the accumulator
;**********************************************************************

IN:     MOV     R2,#8           ;LOOP COUNT
        SETB    SDA1            ;SET DATA BIT HIGH FOR INPUT
INLP:   CLR     SCL1            ;CLOCK LOW
        NOP                     ;NOTE 1
        NOP
        NOP
        NOP
    
        SETB    SCL1            ;CLOCK HIGH
        CLR     C               ;CLEAR CARRY
        JNB     SDA1,INL1       ;JUMP IF DATA = 0
        CPL     C               ;SET CARRY IF DATA = 1
INL1:   RLC     A               ;ROTATE DATA INTO ACCUMULATOR
        DJNZ    R2,INLP         ;DECREMENT COUNTER
        CLR     SCL1            ;CLOCK LOW
        RET

;*********************************************************************
; This routine test for WRITE DONE condition
; by testing for an ACK.
; This routine can be run as soon as a STOP condition
; has been generated after the last data byte has been sent
; to the EEPROM. The routine loops until an ACK is received from
; the EEPROM. No ACK will be received until the EEPROM is done with
; the write operation.
;*********************************************************************
ACKTST: MOV     A,#WTCMD        ;LOAD WRITE COMMAND TO SEND ADDRESS
        MOV     R2,#8           ;LOOP COUNT -- EQUAL TO BIT COUNT
        CLR     SDA1            ;START CONDITION -- DATA = 0
        NOP                     ;NOTE 1
        NOP
        NOP
          
        CLR     SCL1            ;CLOCK = 0
AKTLP:  RLC     A               ;SHIFT BIT
        JNC     AKTLS
        SETB    SDA1            ;DATA = 1
        JMP     AKTL1           ;CONTINUE
AKTLS:  CLR     SDA1            ;DATA = 0
AKTL1:  SETB    SCL1            ;CLOCK HI
        NOP                     ;NOTE 1
        NOP
        NOP
     
        CLR     SCL1            ;CLOCK LOW
        DJNZ    R2,AKTLP        ;DECREMENT COUNTER
        SETB    SDA1            ;TURN PIN INTO INPUT
        NOP                     ;NOTE 1
     
        SETB    SCL1            ;CLOCK ACK
        NOP                     ;NOTE 1
        NOP
        NOP
      
        JNB     SDA1,EXIT       ;EXIT IF ACK (WRITE DONE)
        JMP     ACKTST          ;START OVER
EXIT:   CLR     SCL1            ;CLOCK LOW
        CLR     SDA1            ;DATA LOW
        NOP                     ;NOTE 1
        NOP
        NOP
     
        SETB    SCL1            ;CLOCK HIGH
        NOP
        NOP
        SETB    SDA1            ;STOP CONDITION
        RET
;*********************************************************************

· Home
· 8051 Forum
· Active Topics
· 8051 Free Projects
· Blog
· Top 10
· Datasheets
· Electronic Tutorials
· Electronic Projects
· 8051 Tutorials
· 8051 Course
· 8051 Code Library
· Visual Basic for mC
· 8051 Programmer
· Assembler/IDE
· Products
· Ebooks
· Supporting Tools
· Tag Cloud
· Guest Book
· Contact Me
· Privacy policy

8051 Microcontroller Projects, free ebooks, project codes, AVR Projects, 8051 tutorials, electronic projects, ECE CSE BE final year projects, Embedded systems, AVR codes, embedded technology, LCD Interfacing tutorial,final year project ideas project downloads, engineering projects, Examples projects, 8051 Libraries, 8052, Microcontroller, Microprocessor, 8085, 8051 codes, PCB designing, Project Kits, kit