Hi everyone. Iam having a problem with interfacing an AT24C04 to the AT89C2051 microcontroller. On the display , I don't get the number I sent to the eeprom. Can anyone help? This is my code. I downloaded the code from the internet and modified it a little bit. The compiler is KEIL. Thanks in advance. Now here is the code that won't work.
;********************************************************************** ; THE FOLLOWING CODE SHOWS AN INTERFACE BETWEEN AN 8051 MICROCONTROLLER ; AND CATALYST'S I2C FAMILY OF EEPROMS. ; ; IT DEMONSTRATES A BYTE WRITE/BYTE READ ROUTINE AND A PAGE MODE ; WRITE/SEQUENTIAL READ ROUTINE. IT USES TWO LINES FROM PORT 1 ; (P1.0 AND P1.1) OF THE 8051 TO COMMUNICATE WITH THE CAT24CXX. ; ; THIS PROGRAM WILL WORK WITH THE CAT24WC02/04/08/16 DEVICES. ;NOTE: ; THE 24WC02 HAS AN 8 BYTE PAGE BUFFER AND 24WC04/08/16 HAVE A ; 16-BYTE PAGE BUFFER. ;*********************************************************************
SCL BIT P3.4 ;SCL BIT IS PORT 1,BIT 0
SDA BIT P3.5 ;SDA BIT IS PORT 1,BIT 1
SLV_ADDR EQU 0101B ;FIXED SLAVE ADDRESS BITS
DATAOUT EQU R5 ;DATA READ FROM DEVICE
ACK_READ EQU 10000101B ;READ FOR ACK POLLING
DSEG ORG 0030H
PAGE_DATA: DS 1 BLK_ADDR: DS 1 BYTE_ADDR: DS 1 BYTE_DATA: DS 1
ORG 40H STACK: DS 31
CSEG ORG 0040H LJMP BEGIN
ORG 0100H BEGIN: MOV SP,#STACK ;INITIALIZE STACK POINTER
MOV BLK_ADDR,#000B ;INITIALIZE 2K BLOCK
MOV BYTE_DATA,#05H ;BYTE DATA MOV BYTE_ADDR,#00H ;BYTE ADDRESS MOV PAGE_DATA,#0AAH ;PAGE DATA
; ACALL PAGE_WR ;CALL PAGE WRITE ROUTINE
;ACALL SEQ_RD ;CALL SEQ. READ ROUTINE
ACALL BYTE_WR ;CALL BYTE WRITE ROUTINE
ACALL SELECT_RD ;CALL BYTE READ ROUTINE MOV A,DATAOUT ACALL DISPLAY
DONE: LJMP DONE ;LOOP UNTIL RESET OCCURS
;*******************************************
;************** BYTE WRITE *****************
BYTE_WR: ACALL START_BIT ;SEND START BIT MOV A,#SLV_ADDR ;FIRST 4 SLAVE ADDRESS MOV R7,#4H ;BITS ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK ADDRESS MOV R7,#3H ACALL SHFTO
MOV A,#00H ;R/W BIT SET TO 0 FOR MOV R7,#1H ; WRITE ACALL SHFTO ACALL SLAVE_ACK
MOV A,BYTE_ADDR ;BYTE ADDRESS MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK MOV A,BYTE_DATA ;BYTE DATA MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK ACALL STOP_BIT ;STOP BIT ACALL ACK_POL ;CALL ACK POLLING,WAIT RET ;FOR END OF WRITE CYCLE
;************** PAGE WRITE *****************
PAGE_WR: ACALL START_BIT ;SEND START BIT MOV A,#SLV_ADDR ;FIRST 4 SLAVE ADDRESS MOV R7,#4H ;BITS ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK ADDRESS MOV R7,#3H ACALL SHFTO MOV A,#00H ;R/W BIT SET TO 0 FOR MOV R7,#1H ;WRITE ACALL SHFTO ACALL SLAVE_ACK MOV A,BYTE_ADDR ;BYTE ADDRESS MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK MOV R4,#0FH NEXT_DATA: ;WRITE 16 BYTES TO MOV A,PAGE_DATA ;EEPROM MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK DJNZ R4,NEXT_DATA ACALL STOP_BIT ACALL ACK_POL ;CALL ACK POLLING,WAIT
RET ;FOR END OF WRITE CYCLE
;************** ACK_POL ********************
ACK_POL: MOV R3,#40H ;# OF TIMES TO POLL ACK_LOOP: DJNZ R3,DONE_YET ;DEVICE SJMP DN_ACKPOL DONE_YET: ACALL START_BIT ;SEND START BIT MOV A,#ACK_READ ;SEND READ MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK ;SEND ACKNOWLEDGE JC ACK_LOOP ;LOOP IF NO ACK RCVD, ;JUMP IF ACK RCVD DN_ACKPOL: ACALL STOP_BIT ;SEND STOP BEFORE RETURN
RET ;*******************************************
;************** SHFTO **********************
SHFTO: CLR SCL NXTSHF: CLR SCL RRC A ;ROTATE DATA INTO CARRY
MOV SDA,C ;SEND CARRY TO SDA SETB SCL DJNZ R7,NXTSHF RET ;*******************************************
;************** START BIT ******************
START_BIT: SETB SCL ;START BIT NOP SETB SDA NOP CLR SDA NOP CLR SCL RET ;*******************************************
;************** STOP BIT *******************
STOP_BIT: CLR SDA ;STOP BIT NOP SETB SCL NOP SETB SDA RET ;*******************************************
;************** SLAVE ACKNOWLEDGE **********
SLAVE_ACK: NOP NOP CLR SCL ;SLAVE ACKNOWLEDGE BIT
NOP SETB SDA NOP NOP SETB SCL NOP NOP NOP MOV C,SDA ;READ STATE OF SDA, CLR SCL ;SAVE TO CARRY RET
;************** MASTER ACKNOWLEDGE *********
MSTR_ACK: CLR SCL ;MASTER ACKNOWLEDGE BIT
NOP CLR SDA NOP NOP SETB SCL NOP CLR SCL NOP SETB SDA RET ;*******************************************
;************** NO ACKNOWLEDGE *************
NO_ACK: SETB SDA ;NO ACKNOWLEDGE NOP SETB SCL NOP CLR SCL RET ;*******************************************
;************** SELECTIVE READ *************
SELECT_RD: ACALL START_BIT ;START BIT
MOV A,#SLV_ADDR ;DUMMY WRITE TO FIRST MOV R7,#4H ;2K BLOCK ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK ADDRESS MOV R7,#3H ACALL SHFTO MOV A,#00H ;R/W BIT SET TO 0 MOV R7,#1H ;FOR WRITE ACALL SHFTO ACALL SLAVE_ACK ;SEND ACKNOWLEDG MOV A,BYTE_ADDR ;ADDRESS TO READ MOV R7,#8H ACALL SHFTO ACALL SLAVE_ACK
ACALL START_BIT ;NEW START BIT
MOV A,#SLV_ADDR MOV R7,#4H
ACALL SHFTO MOV A,BLK_ADDR ;2K BLOCK TO READ MOV R7,#3H ACALL SHFTO MOV A,#1H ;R/W BIT SET TO 1 MOV R7,#1H ;FOR READ ACALL SHFTO ACALL SLAVE_ACK
MOV R7,#8H CLOCK8: SETB SCL ;CLOCK IN DATA NOP MOV C,SDA CLR SCL MOV A,DATAOUT RLC A ;ROTATE NEXT BIT MOV DATAOUT,A ;SAVE ROTATED DATA DJNZ R7,CLOCK8 ;READ 8 BITS OF DATA ACALL NO_ACK ACALL STOP_BIT CLR P3.7 ; Indicate Read RET ;*******************************************
DISPLAY: MOV DPTR,#07E0h MOVC A,@A+DPTR CPL A Mov P1,A SETB P3.0 SETB P3.1 CLR P3.2 RET
ORG 07E0h ; Reserve code memory space to hold the following DATA NUMBER_DOT: DB 02h,09Eh,024h,0Ch,098h,048h,040h,01Eh,00h,08h ; "Array1"
END