您的位置 首页 知识

24C02(EEPROM)以字节读写程序(ASM)

24C02以字节读写时序选择性读时序……………..24c02字节读写程序(已调试过)…………………..;////////////////////////

24C02字节读写时序

选择性读时序

……………..24c02字节读写程序(已调试过)…………………..

;////////////////////////////////////////////////////
;AT89C52与AT24C02的IIC通讯
;操控数码管显现0-P
;AT24C02选用字节写和选择性读
;////////////////////////////////////////////////////
DAUN EQU 18 ;写入字节数,对24C02(256BK)最大为255
ADDR EQU 41H ;24C02操作数据地址
WRDA EQU 42H ;写入数据暂存器
RDDA EQU 43H ;读出数据暂存器

WP BIT P1.0
SCL BIT P1.1
SDA BIT P1.2

ORG 0000H
SJMP MAIN
ORG 0030H
MAIN: CLR WP;开写保护
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;数据表指针加一
INC ADDR;24C02写入地址加一
LCALL D50U;写入数据延时,这个时刻很重要
DJNZ R0,D2
RET
;读24C02子程序
RDI%&&&&&%: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;不需要读应对案信号

MOV A,RDDA
MOV P0,A
LCALL DE1S
INC ADDR;读24C02数据地址加一
DJNZ R0,D5
RET
;24C02开端子程序
START:SETB SDA
SETB SCL
LCALL DE5U
CLR SDA
LCALL DE5U
CLR SCL
RET
;24C02写一个字节子程序
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读一个字节子程序
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写应对子程序
SACK: SETB SDA
LCALL DE5U
SETB SCL
LCALL DE5U
D4:MOV C,SDA
JC D4
CLR SCL
RET
;24C02通讯完毕子程序
STOP: CLR SDA
LCALL DE5U
SETB SCL
LCALL DE5U
SETB SDA
LCALL DE5U
CLR SCL
RET
;5US延时子程序
DE5U: NOP
NOP
NOP
NOP
NOP
RET
;1S延时子程序
DE1S: MOV R3,#100
E1:MOV R4,#20
E2:MOV R5,#248
DJNZ R5,$
DJNZ R4,E2
DJNZ R3,E1
RET
;50US延时,让24C02写入片内ROM;
D50U:MOV R6,250
E3:NOP
NOP
NOP
NOP
DJNZ R6,E3
RET
;显现数据表
TAB:DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H
DB 0F8H,080H,090H,088H,083H,0C6H,0A1H
DB 086H,08EH,089H,08CH

END

=====================================================================================

/////////////////////////////
;此程序可历遍整个EEPROM(256个字节)
////////////////////////////
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//要读写的字节数
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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/276171.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部