单片机学习之二十:E2PROM芯片24C02的读写程序
0A0H
(3)、发数据写入24C02的地址,本例中为01H
(4)、往24C02中写入数据,这里是3个字节,分别为48h,0ebh,52h。
(5)、写完毕发出停止信号
读过程:
(1)、主机发出start信号
(2)、发写24C02的寻址字节1010 000 0
(大家可能要问:我们是读数据,为什么要发写信号呢?这是因为你首先要送出一个信号,说明从24C02中的哪个地址读取数据。)
(3)、发要读取的数据在24C02中的地址,即01h
(4)、主机发start信号
(5)、发读24C02的寻址字节1010 000 1
(5)、从24 C02中读取数据
(6)、读取完毕发出停止信号
在这个程序中,我们把开始信号,结束信号、写一个字节数据、读一个字节数据都编制成为通用的子程序,便于在程序中随时调用。发送和接受应答位的过程放到子程序中,这样可以使得程序结构简化。具体的程序如下所示,希望大家认真理解。
三、实验程序
Org 0000h
I2cdata equ 30h ;发送数据缓冲区的首址
2402data equ 01h ;接受缓冲区首址
numdata equ 03h ;传送的字节数,传送3个字节
Sda bit p1.7
Scl bit p1.6
Ajmp main
Main: Lcall init ;初始化给30h,31h,32h中存入0,1,2的段码
Mainwr: Lcall start ;启动
Mov r7,#
Lcall send ;发送写
Mov r7,#2402data
Lcall send ;发送数据存入
Mov r5,#Numdata ;欲发送的字节数
Mov r0,#i2cdata ;发送缓冲区的首址
wrloop: Mov a,@r0
Mov r7,a
Inc r0
Lcall send
Djnz r5, wrloop ;把3个字节的数据发送出去
lcall stop ;停止
lcall d1s
mov r5,#Numdata ; 要读取的字节数重新赋值
Mainre: lcall start ;启动
Mov r7,#
Lcall send ;发送写
Mov r7,#2402data
Lcall send ;发接受缓冲区首址
Lcall start ; 再次启动
Mov r7,#
Lcall send ;发送读
Reloop: Lcall read ;调用读取一个字节数据的子程序
mov p0,r7 ;把读进来的数送到p0口显示
lcall d1s
lcall d1s
Djnz r5,reloop
Lcall stop ;3字节读取完毕发出停止信号
Ajmp $
init: mov p2,#0ffh ;初始化,30h、31h、32h中存入0、1、2的段码
mov 30h,#48h
mov 31h,#0ebh
mov 32h,#52h
ret
start: setb sda ;启动信号子程序,大家可以参考开始信号的时序图
setb scl
lcall d5u
clr sda
lcall d5u
clr scl
ret
stop: clr sda ;停止信号子程序
setb scl
lcall d5u
setb sda
lcall d5u
clr sda
clr scl
ret
;send是发送一个字节子程序
send: mov r6,#08h
mov a,r7 ;要发送的数在r7中
sendlop1 : rlc a ;左环移,把A的最高位移入cy
mov sda,c ;把cy的值通过sda发送出去
setb scl ;在scl上产生一个时钟
lcall d5u
clr scl
djnz r6, sendlop1 ;重复8次,发送一个字节
;cack是检查应答信号的子程序
cack: setb sda ;主机首先拉高sda
setb scl ;发出一个时钟
lcall d5u
sendlop2:mov c,sda ;读入sda的状态,如果是0表示接受到了应答
jc sendlop2
clr scl ;接受到应答位,结束时钟
ret
read: mov r6,#08h ;读取一个字节子程序
readlop1: setb sda ;置sda为输入方式
setb scl ;发出一个时钟
lcall d5u
mov c,sda ;读入sda状态
rlc a ;把该位的状态移入A中
clr scl ;结束时钟
djnz r6,readlop1 ;重复8次,读入一个字节
mov r7,a ;读进来的数放在r7中
;sack是发送应答位子程序
sack: clr sda ;拉低sda线
setb scl ;发出时钟信号
lcall d5u
clr scl
setb sda
ret
d5u: nop ;延时5us子程序
nop
nop
nop
nop
ret
d1s: mov r1,#100 ;延时1s子程序
del1: mov r4,#20
del2: mov r3,#0ffh
del3: djnz r3,del3
djnz r4,del2
djnz r1,del1
ret
end
大家把这个程序下载到测试板上面,发现数码管依次显示数字0、1、2
单片机学E2PROM芯片24C02读写程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)