;--------------- EE WRITE ---------------------------
Write_L_C: MOV EEAddr, #00h ; WR address ..
MOV R0, #3Ch
MOV ByteCnt,#04h ; Send 4 bytes ..
EE_W_Loop: MOV EEData, @R0
LCALL EE_Write
INC R0
INC EEAddr
LCALL Delay_20ms
DJNZ ByteCnt, EE_W_Loop
RET
;--------------- EE READ ----------------------------
Read_L_C: MOV EEAddr, #00h ; RD address ..
MOV R0, #3Ch
MOV ByteCnt,#04h ; Get 4 bytes ..
EE_R_Loop: LCALL EE_READ
MOV @R0, EEData
INC R0
INC EEAddr
LCALL Delay_20ms
DJNZ ByteCnt, EE_R_Loop
RET
;--------------- EEPROM ROUTINES FOR THE 24C02, with A2 = A1 = A0 = 0 -------------------
; one byte ..
EE_WRITE:
LCALL EE_START ; SEND A START FLAG TO THE EEPROM ..
MOV A,#0A0H ; SPECIFY A WRITE EEPROM @ ADDRESS 0H ..
LCALL SH_OUT ; SHIFT OUT THE DEVICE ADDRESS ..
JC WR_ABORT ; ABORT IF NO ACK FROM EEPROM ..
MOV A,EEAddr ; GET EEPROM MEMORY ADDRESS ..
LCALL SH_OUT ; SHIFT OUT THE MEMORY ADDRESS ..
JC WR_ABORT ; ABORT IF NO ACK FROM EEPROM ..
MOV A, EEData ; GET THE DATA TO BE WRITTEN ..
LCALL SH_OUT ; SHIFT OUT THE DATA ..
JC WR_ABORT
CLR C
WR_ABORT:
LCALL EE_STOP ; SEND STOP CONDITION TO EEPROM ..
; WAIT FOR WRITE TIME OF THE 24C02 {10ms} ..
; THE EEPROM TAKES 10ms TO INTERNALLY STORE THE DATA. YOU CAN EITHER ..
; PUT THE MICROCONTROLLER IN A WAIT STATE, OR CONTINUE WITH EXECUTION,
; KEEPING IN MIND THAT THE EEPROM DATA IS NOT STORED FOR 10ms! ..
RET ; GO BACK TO MAIN PROGRAM ..
;--------------- READ THE EEPROM DATA - FIRST PERFORM 'DUMMY WRITE' ---------------
; one byte ..
EE_READ:
MOV EEData,#00H ; CLEAR OLD DATA ..
LCALL EE_START ; SEND A START FLAG TO EEPROM ..
MOV A,#0A0H ; SPECIFY A WRITE TO EEPROM @ ADDRESS 0H ..
LCALL SH_OUT ; PERFORM 'DUMMY WRITE' ..
JC RD_ABORT ; ABORT IF NO ACK ..
MOV A,EEAddr ; LOAD EEPROM MEMORY LOCATION FROM WHICH TO READ ..
LCALL SH_OUT ; WRITE EEPROM MEMORY LOCATION ..
JC RD_ABORT ; ABORT IF NO ACK ..
; NOW READ THE DATA! ..
LCALL EE_START ; SEND A START FLAG ..
MOV A,#0A1H ; SPECIFY A READ FROM EEPROM ..
LCALL SH_OUT ; SHIFT OUT EEPROM ADDRESS ..
JC RD_ABORT ; ABORT IF NO ACK ..
LCALL SH_IN ; SHIFT IN THE DATA FROM EEPROM ..
MOV EEData,A ; STORE THE DATA ..
LCALL NAK ; SEND A NAK (NO ACKNOWLEDGE) TO THE EEPROM ..
CLR C ; CLEAR ERROR FLAG ..
RD_ABORT:
LCALL EE_STOP ; ALL DONE ..
RET
;--------------- EE_START BIT-BANGS A START SEQUENCE TO EEPROM (HI-TO-LOW SDA TRANSITION WITH SCL HIGH) ..
EE_START:
SETB SDAPin
SETB SCLPin ; SET BOTH BITS ..
NOP ; DELAY ..
CLR SDAPin ; START CONDITION - SDA HI TO LOW TRANSITION ..
NOP
NOP ; EEPROM ACCESS TIME DELAY ..
CLR SCLPin
CLR C ; CLEAR ERROR FLAG ..
RET ; ALL DONE ..
;--------------- EE_STOP SENDS A STOP SEQUENCE TO THE EEPROM (LOW-TO-HIGH SDA TRANSITION WITH SCL HIGH) ..
EE_STOP:
CLR SDAPin
NOP
NOP
SETB SCLPin
NOP
NOP ; SETUP TIME DELAY ..
SETB SDAPin ; SEND A STOP CONDITION ..
RET
;--------------- SH_OUT SHIFTS DATA OUT TO THE EEPROM---------------------
SH_OUT:
PUSH B
MOV B,#8 ; SAVE B AND LOAD BIT COUNT ..
EE_OUT:
RLC A ; SHIFT BIT LEFT (RLC=ROTATE LEFT THROUGH CARRY) ..
MOV SDAPin, C ; GET DATA BIT FROM CARRY ..
NOP
SETB SCLPin ; CLOCK IN 1-BIT ..
NOP ; CLOCK HIGH TIME ..
CLR SCLPIN ; CLOCK IS NOW LOW ..
DJNZ B, EE_OUT ; DO IT 8 TIMES ..
SETB SDAPin ; RELEASE SDA FOR ACK ..
NOP
NOP
SETB SCLPin ; ACK CLOCK ..
NOP
MOV C, SDAPin ; GET THE ACK ..
CLR SCLPin ; CLEAR THE CLOCK BIT ..
POP B ; RESTORE WHATEVER B WAS ..
RET
;--------------- SH_IN SHIFT DATA IN FROM THE EEPROM-----------------------
SH_IN:
SETB SDAPin ; MAKE SDA AN INPUT ..
PUSH B
MOV B,#8 ; SAVE B AND SET BIT COUNTER ..
EE_IN:
NOP
SETB SCLPin ; SET CLOCK ..
NOP
NOP ; EEPROM ACCESS TIME ..
SETB SDAPin ; SET = 1 SO USED AS INPUT ..
MOV C, SDAPin ; READ 1-BIT ..
RLC A ; SHIFT BIT LEFT ..
CLR SCLPin ; CLEAR CLOCK BIT ..
DJNZ B, EE_IN ; GET NEXT BIT IF LESS THAN 8 BITS READ ..
POP B
RET
;--------------- ACK SENDS AN EEPROM ACKNOWLDEGE----------------------
ACK:
CLR SDAPin
NOP
NOP
SETB SCLPin ; CLOCK THE ACK ..
NOP
CLR SCLPin ; BRING CLOCK LOW ..
RET
;--------------- NAK SENDS A NO ACKNOWLEDGE----------------------------
NAK:
SETB SDAPin
NOP
NOP
SETB SCLPin ; CLOCK THE NAK ..
NOP
CLR SCLPin ; BRING CLOCK LOW ..
RET
;---------------- END -----------------