hami007
Newbie level 5
I HAVE A PROGRAM FOR ONE BYTE WRITE AND READ FROM 24C08, WHEN I USE IT FOR 2 OR HIGHER BYTES THE LOOP DOES NOT STOP AND KEEP ON INCREASING VALUES CAN ANY ONE FIGURE IT OUT BY SEEING THE CODE
SCL EQU P1.6
SDA EQU P1.7
EE_DATA EQU 30H
EE_ADDR EQU 40H
MAIN:
MOV R2,#3
MOV R0,#06H
MOV R1,#01H
AGAIN:
MOV EE_DATA,R0
MOV EE_ADDR,R1
CALL EE_WRITE
INC R0
INC R1
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
DJNZ R2,AGAIN
MOV R3,#01H
MOV R4,#3
AGA:
MOV EE_ADDR,R3
CALL EE_READ
INC R3
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
MOV P2,A
DJNZ R4,AGA
; EEPROM ROUTINES FOR THE 24C02, with A2 = A1 = A0 = 0
; WRITING TO EEPROM
EE_WRITE:
CALL EE_START ; SEND A START FLAG TO THE EEPROM
MOV A,#0A0H ; SPECIFY A WRITE EEPROM @ ADDRESS 0H
CALL SHOUT ; SHIFT OUT THE DEVICE ADDRESS
JC WR_ABORT ; ABORT IF NO ACK FROM EEPROM
MOV A,EE_ADDR ; GET EEPROM MEMORY ADDRESS
CALL SHOUT ; SHIFT OUT THE MEMORY ADDRESS
JC WR_ABORT ; ABORT IF NO ACK FROM EEPROM
MOV A, EE_DATA ; GET THE DATA TO BE WRITTEN
CALL SHOUT ; SHIFT OUT THE DATA
JC WR_ABORT
CLR C
WR_ABORT:
CALL EE_STOP ; SEND STOP CONDITION TO EEPROM
; READ THE EEPROM DATA - FIRST PERFORM 'DUMMY WRITE'
EE_READ:
MOV EE_DATA,#00H ; CLEAR OLD DATA
CALL EE_START ; SEND A START FLAG TO EEPROM
MOV A,#0A0H ; SPECIFY A WRITE TO EEPROM @ ADDRESS 0H
CALL SHOUT ; PERFORM 'DUMMY WRITE'
JC RD_ABORT ; ABORT IF NO ACK
MOV A,EE_ADDR ; LOAD EEPROM MEMORY LOCATION FROM WHICH TO READ
CALL SHOUT ; WRITE EEPROM MEMORY LOCATION
JC RD_ABORT ; ABORT IF NO ACK
; NOW READ THE DATA!
CALL EE_START ; SEND A START FLAG
MOV A,#0A1H ; SPECIFY A READ FROM EEPROM
CALL SHOUT ; SHIFT OUT EEPROM ADDRESS
JC RD_ABORT ; ABORT IF NO ACK
CALL SHIN ; SHIFT IN THE DATA FROM EEPROM
MOV EE_DATA,A ; STORE THE DATA
CALL NAK ; SEND A NAK (NO ACKNOWLEDGE) TO THE EEPROM
CLR C ; CLEAR FLAG
RD_ABORT:
CALL 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 SDA
SETB SCL ; SET BOTH BITS
NOP ; DELAY
CLR SDA ; START CONDITION; SDA HI TO LOW TRANSITION
NOP
NOP ; EEPROM ACCESS TIME DELAY
CLR SCL
CLR C ; CLEAR FLAG
RET
; EE_STOP SENDS A STOP SEQUENCE TO THE EEPROM (LOW-TO-HIGH SDA TRANSITION WITH SCL HIGH).
EE_STOP:
CALL DELAY
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP ; SETUP TIME DELAY
SETB SDA ; SEND A STOP CONDITION
RET
; SHOUT SHIFTS DATA OUT TO THE EEPROM
SHOUT:
PUSH B
MOV B,#8 ; SAVE B AND LOAD BIT COUNT
EEOUT:
RLC A ; SHIFT BIT LEFT (RLC=ROTATE LEFT THROUGH CARRY)
MOV SDA,C ; GET DATA BIT FROM CARRY
NOP
SETB SCL ; CLOCK IN 1-BIT
NOP ; CLOCK HIGH TIME
CLR SCL ; CLOCK IS NOW LOW
DJNZ B,EEOUT ; DO IT 8 TIMES
SETB SDA ; RELEASE SDA FOR ACK
NOP
NOP
SETB SCL ; ACK CLOCK
NOP
MOV C,SDA ; GET THE ACK
CLR SCL ; CLEAR THE CLOCK BIT
POP B ; RESTORE WHATEVER B WAS
RET
; SHIN SHIFT DATA IN FROM THE EEPROM
SHIN:
SETB SDA ; MAKE SDA AN INPUT
PUSH B
MOV B,#8 ; SAVE B AND SET BIT COUNTER
EEIN:
NOP
SETB SCL ; SET CLOCK
NOP
NOP ; EEPROM ACCESS TIME
SETB SDA ; SET = 1 SO USED AS INPUT
MOV C,SDA ; READ 1-BIT
RLC A ; SHIFT BIT LEFT
CLR SCL ; CLEAR CLOCK BIT
DJNZ B,EEIN ; GET NEXT BIT IF LESS THAN 8 BITS READ
POP B
RET
; NAK SENDS A NO ACKNOWLEDGE
NAK:
SETB SDA
NOP
NOP
SETB SCL ; CLOCK THE NAK
NOP
CLR SCL ; BRING CLOCK LOW
RET
DELAY:
MOV TMOD,#00000001
MOV TH0,#027H
MOV TL0,#010H ; DELAY OF 10MS
CLR TF0
SETB TR0
WAIT: JNB TF0, WAIT
CLR TR0
RET
END
SCL EQU P1.6
SDA EQU P1.7
EE_DATA EQU 30H
EE_ADDR EQU 40H
MAIN:
MOV R2,#3
MOV R0,#06H
MOV R1,#01H
AGAIN:
MOV EE_DATA,R0
MOV EE_ADDR,R1
CALL EE_WRITE
INC R0
INC R1
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
DJNZ R2,AGAIN
MOV R3,#01H
MOV R4,#3
AGA:
MOV EE_ADDR,R3
CALL EE_READ
INC R3
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
MOV P2,A
DJNZ R4,AGA
; EEPROM ROUTINES FOR THE 24C02, with A2 = A1 = A0 = 0
; WRITING TO EEPROM
EE_WRITE:
CALL EE_START ; SEND A START FLAG TO THE EEPROM
MOV A,#0A0H ; SPECIFY A WRITE EEPROM @ ADDRESS 0H
CALL SHOUT ; SHIFT OUT THE DEVICE ADDRESS
JC WR_ABORT ; ABORT IF NO ACK FROM EEPROM
MOV A,EE_ADDR ; GET EEPROM MEMORY ADDRESS
CALL SHOUT ; SHIFT OUT THE MEMORY ADDRESS
JC WR_ABORT ; ABORT IF NO ACK FROM EEPROM
MOV A, EE_DATA ; GET THE DATA TO BE WRITTEN
CALL SHOUT ; SHIFT OUT THE DATA
JC WR_ABORT
CLR C
WR_ABORT:
CALL EE_STOP ; SEND STOP CONDITION TO EEPROM
; READ THE EEPROM DATA - FIRST PERFORM 'DUMMY WRITE'
EE_READ:
MOV EE_DATA,#00H ; CLEAR OLD DATA
CALL EE_START ; SEND A START FLAG TO EEPROM
MOV A,#0A0H ; SPECIFY A WRITE TO EEPROM @ ADDRESS 0H
CALL SHOUT ; PERFORM 'DUMMY WRITE'
JC RD_ABORT ; ABORT IF NO ACK
MOV A,EE_ADDR ; LOAD EEPROM MEMORY LOCATION FROM WHICH TO READ
CALL SHOUT ; WRITE EEPROM MEMORY LOCATION
JC RD_ABORT ; ABORT IF NO ACK
; NOW READ THE DATA!
CALL EE_START ; SEND A START FLAG
MOV A,#0A1H ; SPECIFY A READ FROM EEPROM
CALL SHOUT ; SHIFT OUT EEPROM ADDRESS
JC RD_ABORT ; ABORT IF NO ACK
CALL SHIN ; SHIFT IN THE DATA FROM EEPROM
MOV EE_DATA,A ; STORE THE DATA
CALL NAK ; SEND A NAK (NO ACKNOWLEDGE) TO THE EEPROM
CLR C ; CLEAR FLAG
RD_ABORT:
CALL 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 SDA
SETB SCL ; SET BOTH BITS
NOP ; DELAY
CLR SDA ; START CONDITION; SDA HI TO LOW TRANSITION
NOP
NOP ; EEPROM ACCESS TIME DELAY
CLR SCL
CLR C ; CLEAR FLAG
RET
; EE_STOP SENDS A STOP SEQUENCE TO THE EEPROM (LOW-TO-HIGH SDA TRANSITION WITH SCL HIGH).
EE_STOP:
CALL DELAY
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP ; SETUP TIME DELAY
SETB SDA ; SEND A STOP CONDITION
RET
; SHOUT SHIFTS DATA OUT TO THE EEPROM
SHOUT:
PUSH B
MOV B,#8 ; SAVE B AND LOAD BIT COUNT
EEOUT:
RLC A ; SHIFT BIT LEFT (RLC=ROTATE LEFT THROUGH CARRY)
MOV SDA,C ; GET DATA BIT FROM CARRY
NOP
SETB SCL ; CLOCK IN 1-BIT
NOP ; CLOCK HIGH TIME
CLR SCL ; CLOCK IS NOW LOW
DJNZ B,EEOUT ; DO IT 8 TIMES
SETB SDA ; RELEASE SDA FOR ACK
NOP
NOP
SETB SCL ; ACK CLOCK
NOP
MOV C,SDA ; GET THE ACK
CLR SCL ; CLEAR THE CLOCK BIT
POP B ; RESTORE WHATEVER B WAS
RET
; SHIN SHIFT DATA IN FROM THE EEPROM
SHIN:
SETB SDA ; MAKE SDA AN INPUT
PUSH B
MOV B,#8 ; SAVE B AND SET BIT COUNTER
EEIN:
NOP
SETB SCL ; SET CLOCK
NOP
NOP ; EEPROM ACCESS TIME
SETB SDA ; SET = 1 SO USED AS INPUT
MOV C,SDA ; READ 1-BIT
RLC A ; SHIFT BIT LEFT
CLR SCL ; CLEAR CLOCK BIT
DJNZ B,EEIN ; GET NEXT BIT IF LESS THAN 8 BITS READ
POP B
RET
; NAK SENDS A NO ACKNOWLEDGE
NAK:
SETB SDA
NOP
NOP
SETB SCL ; CLOCK THE NAK
NOP
CLR SCL ; BRING CLOCK LOW
RET
DELAY:
MOV TMOD,#00000001
MOV TH0,#027H
MOV TL0,#010H ; DELAY OF 10MS
CLR TF0
SETB TR0
WAIT: JNB TF0, WAIT
CLR TR0
RET
END