C
choi_new
Guest
Kjære venn,
Beklager, meg igjen.
Jeg har skrevet en 8051-kode for å få tilgang AT24C512 data.
BTW, jeg fant min programmet bare kan lese FFH fra EPROM når jeg bruker EMU bord, men jeg har allerede brent en bmp-fil inn i EEPROM.
Derfor tror jeg har mine programmet bug.
Nedenfor er min kode.
kan noen hjelpe meg å finne ut av programmet?
Takk en million!!Peter
;;==== KodenSDA BIT P2.2
SCL BIT P2.3
; SDA BIT P2.3
; SCL BIT P2.2
ADD0 BIT P2.0
ADD1 BIT P2.1
Faddr EQU 0A0H
ADDR_HI1 EQU 30h
ADDR_LO1 EQU 31H
ADDR_HI2 EQU 32H
ADDR_LO2 EQU 33t
RAM_DATA EQU 34H
ORG 00h
MOV ADDR_HI1, # 00t
MOV ADDR_LO1, # 00t
MOV ADDR_HI2, # 00t
MOV ADDR_LO2, # 00t
MOV RAM_DATA, # 00t
I2C:
INC DPTR
MOV ADDR_HI2, DPH
MOV ADDR_LO2, DPL
LCALL READ_RANDOM
NOP
MOV A, RAM_DATA
MOV A, RAM_DATA
MOV A, RAM_DATA
MOV A, RAM_DATA
SJMP I2C
READ_CURRENT:
; AT24Cxx Nåværende Adresse Les funksjon.
; Called med programmerbare adresse A. Returnerer data i A.
; Returns CY satt til å indikere at bussen ikke er tilgjengelig
, Eller at adressert enheten kunne ikke registrere.
LCALL START
JC X_45; abort hvis bussen ikke tilgjengelig
; RL A; programmerbare adresse til bits 3:1
; ORL A, # faddr; legge fast adresse
; SETB ACC.0; spesifisere lese drift
MOV A, # 0A0H
LCALL SHOUT; sende enheten adresse
JC X_44; abort hvis ingen erkjenner
LCALL SHIN; motta data byte
MOV RAM_DATA, A
LCALL NAK; ikke erkjenner byte
CLR C; klart feilflagg
X_44:
LCALL STOP
RET
X_45:
RETREAD_RANDOM:
; AT24Cxx Random Les funksjon.
; Called med programmerbare adresse i A, byte adresse
; Register pair ADDR_HI: ADDR_LO.Returnerer data i A.
; Returns CY satt til å indikere at bussen ikke er tilgjengelig
, Eller at adressert enheten kunne ikke registrere.
PUSH B
MOV B, A; lagre kopi av programmerbare adresse
; Send dummy skrive kommandoen til å angi interne adresse.
LCALL START
JC X_47; abort hvis bussen ikke tilgjengelig
; RL A; programmerbare adresse til bits 3:1
; ORL A, # faddr; legge fast adresse
; CLR ACC.0; spesifisere skriveoperasjon
MOV A, # 0A0H
LCALL SHOUT; sende enheten adresse
JC X_46; abort hvis ingen erkjenner
MOV A, ADDR_HI1;, send høy byte av adresse
LCALL SHOUT;
JC X_46; abort hvis ingen erkjenner
MOV A, ADDR_LO1; sende lav byte av adresse
LCALL SHOUT;
JC X_46; abort hvis ingen erkjenner
MOV A, ADDR_HI2;, send høy byte av adresse
LCALL SHOUT;
JC X_46; abort hvis ingen erkjenner
MOV A, ADDR_LO2; sende lav byte av adresse
LCALL SHOUT;
JC X_46; abort hvis ingen erkjenner
; Ring Nåværende Adresse Les funksjon.
MOV A, B; få programmerbare adresse
LCALL READ_CURRENT
LJMP X_47; exit
X_46:
LCALL STOPX_47: POP B
RETSTART:
; Send START, definert som høy til lav SDA med SCL høy.
; Retur med SCL, SDA lav.
; Returnerer CY sett hvis bussen ikke er tilgjengelig.
SETB SDA
SETB SCL
; Bekreft buss tilgjengelig.
JNB SDA, X_40; hoppe hvis ikke høy
JNB SCL, X_40; hoppe hvis ikke høy
NOP; håndheve oppsett forsinkelse og sykle forsinkelse
CLR SDA
nop; håndheve hold delay
nop;
nop;
nop;
nop;
CLR SCL
CLR C; klart feilflagg
SJMP X_41
X_40:
SETB C; sett feil flag
X_41:
RET
STOPP:
; Send STOP, definert som lav til høy SDA med SCL høy.
; SCL forventet lav ved innreise.Retur med SCL, SDA høy.
CLR SDA
nop; håndheve SCL lave og data oppsett
nop
SETB SCL
nop; håndheve oppsett forsinkelse
nop;
nop;
nop;
nop;
SETB SDA
RETSHOUT:
; Skift ut en byte til AT24Cxx, mest signifikante bit først.
; SCL, SDA forventet lav ved innreise.Tilbake med SCL lav.
; Called med data å sende A.
; Returns CY satt til å indikere svikt ved slave å erkjenne.
; Ødelegger A.
PUSH B
MOV B, # 8; bit counter
X_42:
RLC A; gå litt inn i CY
MOV SDA, C; output bit
nop; håndheve SCL lave og data oppsett
SETB SCL; heve klokke
nop; håndheve SCL høy
nop;
nop;
nop;
CLR SCL; drop klokke
DJNZ B, X_42; neste bit
SETB SDA; løslate SDA for ACK
nop; håndheve SCL lav og TAA
nop;
SETB SCL; heve ACK klokke
nop; håndheve SCL høy
nop;
nop;
nop;
MOV C, SDA; få ACK bit
CLR SCL; drop ACK klokke
; LCALL ACK
POP B
RET
SHIN:
; Skift i en byte fra AT24Cxx, mest signifikante bit først.
; SCL forventet lav ved innreise.Tilbake med SCL lav.
; Returns mottatte data byte i A.
; SETB SDA, SDA foreta en inngang
; PUSH B
; MOV B, # 8; bit count
; X_43:
; Nop; håndheve SCL lave og data oppsett
; Nop;
; Nop;
; SETB SCL; heve klokke
; Nop; håndheve SCL høy
; Nop;
; MOV C, SDA; input bit
; RLC A; gå litt inn i byte
; CLR SCL; drop klokke
; DJNZ B, X_43; neste bit
; POP B
; RET
SETB SDA;; gjøre SDA en inngang,使SDA为高,准备读
PUSH B;
MOV B, # 08D ;;;;; bit teller,设置位计数器
L2: NOP;; håndheve SCL lave og data oppsett,保持SCL为低且使数据稳定
NOP
SETB SCL;; heve klokke,升高时钟
NOP;; håndheve SCL høy,保持SCL为高
NOP
MOV C, SDA;; input bit,输入位
RLC A;; gå litt inn i byte,将位移入A
CLR SCL;; drop klokke,降低时钟
DJNZ B, L2;; neste bit,传送下一位
POP B
RET
NAK:
; Clock ut et negativt erkjenner bit (høy).
; SCL forventet lav ved innreise.Tilbake med SCL lav, SDA høy.
SETB SDA; NAK bit
nop; håndheve SCL lave og data oppsett
nop;
SETB SCL; heve klokke
nop; håndheve SCL høy
nop;
nop;
nop;
CLR SCL; drop klokke
RET
ACK:
; Clock ut en erkjenner bit (lav).
; SCL forventet lav ved innreise.Retur med SCL, SDA lav.
CLR SDA; ACK bit
nop; håndheve SCL lave og data oppsett
nop;
setb SCL; heve klokke
nop; håndheve SCL høy
nop;
nop;Lagt etter 1 minutt:bare et minne, er jeg ikke aurthor av denne koden.
Jeg bare endre koden for søknaden min etter at jeg leste den.
Så, jeg er ikke kopiere rett innehaver
Beklager, meg igjen.
Jeg har skrevet en 8051-kode for å få tilgang AT24C512 data.
BTW, jeg fant min programmet bare kan lese FFH fra EPROM når jeg bruker EMU bord, men jeg har allerede brent en bmp-fil inn i EEPROM.
Derfor tror jeg har mine programmet bug.
Nedenfor er min kode.
kan noen hjelpe meg å finne ut av programmet?
Takk en million!!Peter
;;==== KodenSDA BIT P2.2
SCL BIT P2.3
; SDA BIT P2.3
; SCL BIT P2.2
ADD0 BIT P2.0
ADD1 BIT P2.1
Faddr EQU 0A0H
ADDR_HI1 EQU 30h
ADDR_LO1 EQU 31H
ADDR_HI2 EQU 32H
ADDR_LO2 EQU 33t
RAM_DATA EQU 34H
ORG 00h
MOV ADDR_HI1, # 00t
MOV ADDR_LO1, # 00t
MOV ADDR_HI2, # 00t
MOV ADDR_LO2, # 00t
MOV RAM_DATA, # 00t
I2C:
INC DPTR
MOV ADDR_HI2, DPH
MOV ADDR_LO2, DPL
LCALL READ_RANDOM
NOP
MOV A, RAM_DATA
MOV A, RAM_DATA
MOV A, RAM_DATA
MOV A, RAM_DATA
SJMP I2C
READ_CURRENT:
; AT24Cxx Nåværende Adresse Les funksjon.
; Called med programmerbare adresse A. Returnerer data i A.
; Returns CY satt til å indikere at bussen ikke er tilgjengelig
, Eller at adressert enheten kunne ikke registrere.
LCALL START
JC X_45; abort hvis bussen ikke tilgjengelig
; RL A; programmerbare adresse til bits 3:1
; ORL A, # faddr; legge fast adresse
; SETB ACC.0; spesifisere lese drift
MOV A, # 0A0H
LCALL SHOUT; sende enheten adresse
JC X_44; abort hvis ingen erkjenner
LCALL SHIN; motta data byte
MOV RAM_DATA, A
LCALL NAK; ikke erkjenner byte
CLR C; klart feilflagg
X_44:
LCALL STOP
RET
X_45:
RETREAD_RANDOM:
; AT24Cxx Random Les funksjon.
; Called med programmerbare adresse i A, byte adresse
; Register pair ADDR_HI: ADDR_LO.Returnerer data i A.
; Returns CY satt til å indikere at bussen ikke er tilgjengelig
, Eller at adressert enheten kunne ikke registrere.
PUSH B
MOV B, A; lagre kopi av programmerbare adresse
; Send dummy skrive kommandoen til å angi interne adresse.
LCALL START
JC X_47; abort hvis bussen ikke tilgjengelig
; RL A; programmerbare adresse til bits 3:1
; ORL A, # faddr; legge fast adresse
; CLR ACC.0; spesifisere skriveoperasjon
MOV A, # 0A0H
LCALL SHOUT; sende enheten adresse
JC X_46; abort hvis ingen erkjenner
MOV A, ADDR_HI1;, send høy byte av adresse
LCALL SHOUT;
JC X_46; abort hvis ingen erkjenner
MOV A, ADDR_LO1; sende lav byte av adresse
LCALL SHOUT;
JC X_46; abort hvis ingen erkjenner
MOV A, ADDR_HI2;, send høy byte av adresse
LCALL SHOUT;
JC X_46; abort hvis ingen erkjenner
MOV A, ADDR_LO2; sende lav byte av adresse
LCALL SHOUT;
JC X_46; abort hvis ingen erkjenner
; Ring Nåværende Adresse Les funksjon.
MOV A, B; få programmerbare adresse
LCALL READ_CURRENT
LJMP X_47; exit
X_46:
LCALL STOPX_47: POP B
RETSTART:
; Send START, definert som høy til lav SDA med SCL høy.
; Retur med SCL, SDA lav.
; Returnerer CY sett hvis bussen ikke er tilgjengelig.
SETB SDA
SETB SCL
; Bekreft buss tilgjengelig.
JNB SDA, X_40; hoppe hvis ikke høy
JNB SCL, X_40; hoppe hvis ikke høy
NOP; håndheve oppsett forsinkelse og sykle forsinkelse
CLR SDA
nop; håndheve hold delay
nop;
nop;
nop;
nop;
CLR SCL
CLR C; klart feilflagg
SJMP X_41
X_40:
SETB C; sett feil flag
X_41:
RET
STOPP:
; Send STOP, definert som lav til høy SDA med SCL høy.
; SCL forventet lav ved innreise.Retur med SCL, SDA høy.
CLR SDA
nop; håndheve SCL lave og data oppsett
nop
SETB SCL
nop; håndheve oppsett forsinkelse
nop;
nop;
nop;
nop;
SETB SDA
RETSHOUT:
; Skift ut en byte til AT24Cxx, mest signifikante bit først.
; SCL, SDA forventet lav ved innreise.Tilbake med SCL lav.
; Called med data å sende A.
; Returns CY satt til å indikere svikt ved slave å erkjenne.
; Ødelegger A.
PUSH B
MOV B, # 8; bit counter
X_42:
RLC A; gå litt inn i CY
MOV SDA, C; output bit
nop; håndheve SCL lave og data oppsett
SETB SCL; heve klokke
nop; håndheve SCL høy
nop;
nop;
nop;
CLR SCL; drop klokke
DJNZ B, X_42; neste bit
SETB SDA; løslate SDA for ACK
nop; håndheve SCL lav og TAA
nop;
SETB SCL; heve ACK klokke
nop; håndheve SCL høy
nop;
nop;
nop;
MOV C, SDA; få ACK bit
CLR SCL; drop ACK klokke
; LCALL ACK
POP B
RET
SHIN:
; Skift i en byte fra AT24Cxx, mest signifikante bit først.
; SCL forventet lav ved innreise.Tilbake med SCL lav.
; Returns mottatte data byte i A.
; SETB SDA, SDA foreta en inngang
; PUSH B
; MOV B, # 8; bit count
; X_43:
; Nop; håndheve SCL lave og data oppsett
; Nop;
; Nop;
; SETB SCL; heve klokke
; Nop; håndheve SCL høy
; Nop;
; MOV C, SDA; input bit
; RLC A; gå litt inn i byte
; CLR SCL; drop klokke
; DJNZ B, X_43; neste bit
; POP B
; RET
SETB SDA;; gjøre SDA en inngang,使SDA为高,准备读
PUSH B;
MOV B, # 08D ;;;;; bit teller,设置位计数器
L2: NOP;; håndheve SCL lave og data oppsett,保持SCL为低且使数据稳定
NOP
SETB SCL;; heve klokke,升高时钟
NOP;; håndheve SCL høy,保持SCL为高
NOP
MOV C, SDA;; input bit,输入位
RLC A;; gå litt inn i byte,将位移入A
CLR SCL;; drop klokke,降低时钟
DJNZ B, L2;; neste bit,传送下一位
POP B
RET
NAK:
; Clock ut et negativt erkjenner bit (høy).
; SCL forventet lav ved innreise.Tilbake med SCL lav, SDA høy.
SETB SDA; NAK bit
nop; håndheve SCL lave og data oppsett
nop;
SETB SCL; heve klokke
nop; håndheve SCL høy
nop;
nop;
nop;
CLR SCL; drop klokke
RET
ACK:
; Clock ut en erkjenner bit (lav).
; SCL forventet lav ved innreise.Retur med SCL, SDA lav.
CLR SDA; ACK bit
nop; håndheve SCL lave og data oppsett
nop;
setb SCL; heve klokke
nop; håndheve SCL høy
nop;
nop;Lagt etter 1 minutt:bare et minne, er jeg ikke aurthor av denne koden.
Jeg bare endre koden for søknaden min etter at jeg leste den.
Så, jeg er ikke kopiere rett innehaver