24C02(EEPROM)以字節(jié)讀寫程序(ASM)
選擇性讀時(shí)序
.................24c02字節(jié)讀寫程序(已調(diào)試過).......................
;////////////////////////////////////////////////////
;AT89C52與AT24C02的IIC通信
;控制數(shù)碼管顯示0-P
;AT24C02采用字節(jié)寫和選擇性讀
;////////////////////////////////////////////////////
DAUN EQU 18 ;寫入字節(jié)數(shù),對24C02(256BK)最大為255
ADDR EQU 41H ;24C02操作數(shù)據(jù)地址
WRDA EQU 42H ;寫入數(shù)據(jù)暫存器
RDDA EQU 43H ;讀出數(shù)據(jù)暫存器
WP BIT P1.0
SCL BIT P1.1
SDA BIT P1.2
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN: CLR WP;開寫保護(hù)
MOV SP,70H
MOV P2,#0F7H
MOV P0,#0FFH
LCALL WRIIC;寫24C02
LCALL DE1S
D1:LCALL RDIIC;讀24C02
LJMP D1
;寫24C02子程序
WRIIC:MOV DPTR,#TAB
MOV R0,#DAUN
MOV ADDR,#00H;地址賦初值
D2:LCALL START
MOV WRDA,#0AEH
LCALL SEND
LCALL SACK
MOV A,ADDR
MOV WRDA,A
LCALL SEND
LCALL SACK
CLR A
MOVC A,@A+DPTR
MOV WRDA,A
LCALL SEND
LCALL SACK
LCALL STOP
INC DPTR;數(shù)據(jù)表指針加一
INC ADDR;24C02寫入地址加一
LCALL D50U;寫入數(shù)據(jù)延時(shí),這個(gè)時(shí)間很重要
DJNZ R0,D2
RET
;讀24C02子程序
RDIIC:MOV R0,#DAUN
MOV ADDR,#00H
D5:LCALL START
MOV WRDA,#0AEH
LCALL SEND
LCALL SACK
MOV A,ADDR
MOV WRDA,A
LCALL SEND
LCALL SACK
LCALL START
MOV WRDA,#0AFH
LCALL SEND
LCALL SACK
LCALL READ
LCALL STOP;不需要讀應(yīng)答案信號
MOV A,RDDA
MOV P0,A
LCALL DE1S
INC ADDR;讀24C02數(shù)據(jù)地址加一
DJNZ R0,D5
RET
;24C02開始子程序
START:SETB SDA
SETB SCL
LCALL DE5U
CLR SDA
LCALL DE5U
CLR SCL
RET
;24C02寫一個(gè)字節(jié)子程序
SEND: MOV R1,#08H
MOV A,WRDA
D3:RLC A
MOV SDA,C
LCALL DE5U
SETB SCL
LCALL DE5U
CLR SCL
DJNZ R1,D3
RET
;24C02讀一個(gè)字節(jié)子程序
READ: MOV R1,#08H
D6:SETB SDA
LCALL DE5U
SETB SCL
LCALL DE5U
MOV C,SDA
RLC A
CLR SCL
DJNZ R1,D6
MOV RDDA,A
RET
;24c03寫應(yīng)答子程序
SACK: SETB SDA
LCALL DE5U
SETB SCL
LCALL DE5U
D4:MOV C,SDA
JC D4
CLR SCL
RET
;24C02通信結(jié)束子程序
STOP: CLR SDA
LCALL DE5U
SETB SCL
LCALL DE5U
SETB SDA
LCALL DE5U
CLR SCL
RET
;5US延時(shí)子程序
DE5U: NOP
NOP
NOP
NOP
NOP
RET
;1S延時(shí)子程序
DE1S: MOV R3,#100
E1:MOV R4,#20
E2:MOV R5,#248
DJNZ R5,$
DJNZ R4,E2
DJNZ R3,E1
RET
;50US延時(shí),讓24C02寫入片內(nèi)ROM;
D50U:MOV R6,250
E3:NOP
NOP
NOP
NOP
DJNZ R6,E3
RET
;顯示數(shù)據(jù)表
TAB:DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H
DB 0F8H,080H,090H,088H,083H,0C6H,0A1H
DB 086H,08EH,089H,08CH
END
=====================================================================================
/////////////////////////////
;此程序可歷遍整個(gè)EEPROM(256個(gè)字節(jié))
////////////////////////////
wp equ p1.0
scl equ p1.1
sda equ p1.2
wrda equ 40h
rdda equ 41h
org 0000h
sjmp main
org 0030h
main:clr wp
clr p2.0
clr a
mov r2,a
mov r3,a
mov p0,#020h
mov sp,#70h
mov 42H,#020h//要讀寫的字節(jié)數(shù)
mov dptr,#tab
n1:lcall wriic
lcall d10m
djnz 42,n1
mov 43,#020h
n2:lcall rdiic
lcall d10m
djnz 43,n2
sjmp $
wriic:lcall start
mov wrda,#10101110b
lcall send
mov wrda,r2
inc r2
lcall send
w1:clr a
movc a,@a+dptr
mov wrda,a
lcall send
inc dptr
lcall stop
ret
rdiic:lcall start
mov wrda,#10101110b
lcall send
mov wrda,r3
inc r3
lcall send
lcall start
mov wrda,#10101111b
lcall send
lcall read
mov p0,rdda
lcall d1s
lcall stop
ret
read: mov r1,#08h
d1:setb sda
lcall d3u
setb scl
lcall d3u
mov c,sda
rlc a
clr scl
lcall d3u
djnz r1,d1
mov rdda,a
lcall stop
ret
start:setb sda
setb scl
lcall d3u
clr sda
lcall d3u
clr scl
ret
send: mov r0,#08h
mov a,wrda
s1:rlc a
mov sda,c
LCALL D3U
setb scl
lcall d3u
clr scl
lcall d3u
djnz r0,s1
setb sda
lcall d3u
setb scl
lcall d3u
s2:mov c,sda
jc s2
clr scl
ret
stop: clr sda
lcall d3u
setb scl
lcall d3u
setb sda
lcall d3u
clr scl
ret
d3u: nop
nop
ret
TAB: DB 0C0H,0F9H,0A4H,0B0H
DB 99H,92H,82H,0F8H
DB 80H,90H,88H,83H
DB 0C6H,0A1H,86H,8EH
DB 0C0H,0F9H,0A4H,0B0H
DB 99H,92H,82H,0F8H
DB 80H,90H,88H,83H
DB 0C6H,0A1H,86H,8EH
D10m: ;誤差 0us
MOV R7,#01H
DL1:
MOV R6,#26H
DL0:
MOV R5,#82H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
D1s: ;誤差 0us
MOV R7,#0A7H
DL4:
MOV R6,#0ABH
DL3:
MOV R5,#01H
DJNZ R5,$
DJNZ R6,DL3
DJNZ R7,DL4
NOP
RET
END
評論