📄 h42.asm
字号:
; 实验四十二 IIC总线24C02读写
; ASM51
; **********************************************************
; 24C01/02 为IIC总线EEPROM存储器, 容量为1k位(128 * 8)
; **********************************************************
; **********************************************************
; EEPROM控制字节格式:
; [1, 0, 1, 0, A2, A1, A0, (R/W)], 其中R/W=1读,R/W=0写;
; 由于实验仪上的AT24C01A(AT24C02) 的A2/A1/A0全部接地,
; 所以读/写控制字分别为:0xa1/0xa0
; **********************************************************
WriteDeviceAddress equ 0a0h
ReadDeviceAddress equ 0a1h
; ******************IIC器件驱动引脚定义*********************
SCL equ P1.0
SDA equ P1.1
; *******************读写数据缓冲定义***********************
ReadBuff equ 40h
WriteBuff equ 48h
RWLength equ 30h
RomAddress equ 31h
org 0000h
ljmp Main
org 0100h
; ***********************简单延时***************************
DelayMs:
push 06
nop
DelayMsLoop2:
mov r6, #0ffh
DelayMsLoop1:
djnz r6, DelayMsLoop1
djnz acc, DelayMsLoop2
pop 06
ret
; ********************启动IIC总线***************************
Start:
setb SDA
setb SCL
clr SDA
clr SCL
ret
; ********************停止IIC总线***************************
Stop:
clr SCL
clr SDA
setb SCL
setb SDA
ret
; **********************请求相应****************************
Ack:
clr SDA
setb SCL
clr SCL
setb SDA
ret
; ******************不对IIC总线产生应答*********************
NoAck:
setb SDA
setb SCL
clr SCL
ret
; *********************检查应答位***************************
TestAck:
setb SDA
setb SCL
mov C, SDA
clr SCL
nop
nop
nop
ret
; *******************向IIC总线写数据************************
Write8Bit:
push 07
mov r7, #8
Write8BitLoop:
rlc a
mov SDA, C
setb SCL
clr SCL
nop ; 此处建议加入几个NOP指令降低MCU对器件操作的速度
nop
nop
djnz r7, Write8BitLoop
pop 07
ret
; ***************从IIC总线上读数据子程序********************
Read8Bit:
push 07
clr a
mov r7, #8
Read8BitLoop:
clr C
setb SCL
mov C, SDA
rlc a
clr SCL
nop ; 此处建议加入几个NOP指令降低MCU对器件操作的速度
nop
nop
djnz r7, Read8BitLoop
pop 07
ret
; ******************向EEPROM中写入数据块********************
AT24C02WriteBlock:
clr ea
mov r0, #WriteBuff
inc RWLength
anl RWLength, #0f0h ;对于24C02, 一个页为8字节,所以最大的块写操作字节数为8*/
mov r7, RWLength
call Start
mov a, #WriteDeviceAddress
call Write8Bit
call TestAck
mov a, RomAddress
call Write8Bit
call TestAck
AT24C02WriteBlockLoop:
mov a, @r0
call Write8Bit
call TestAck
inc r0
djnz r7, AT24C02WriteBlock
call Stop
mov a, #10
call DelayMs
ret
; *************从EEPROM中读出数据块到指定RAM中**************
AT24C02ReadBlock:
clr ea
mov r0, #ReadBuff
mov r7, RWLength
call Start
mov a, #WriteDeviceAddress
call Write8Bit
call TestAck
mov a, RomAddress
call Write8Bit
call TestAck
call Start
mov a, #ReadDeviceAddress
call Write8Bit
call TestAck
AT24C02ReadBlockLoop:
call Read8Bit
mov @r0, a
call Ack
inc r0
djnz r7, AT24C02ReadBlock
call NoAck
call Stop
ret
; ****************向EEPROM中写入单字节数据******************
AT24c02WriteByte:
clr ea
call Start
mov a, #WriteDeviceAddress
call Write8Bit
call TestAck
mov a, RomAddress
call Write8Bit
call TestAck
mov a, @r0
call Write8Bit
call TestAck
call Stop
mov a, #10
call DelayMs
ret
; ***********从EEPROM中读出单字节数据到指定RAM中************
AT24c02ReadByte:
clr ea
call Start
mov a, #WriteDeviceAddress
call Write8Bit
call TestAck
mov a, RomAddress
call Write8Bit
call TestAck
call Start
mov a, #ReadDeviceAddress
call Write8Bit
call TestAck
call Read8Bit
mov @r0 ,a
call NoAck
call Stop
ret
SetReadBuff:
mov r0, #ReadBuff
mov r7, RWLength
SetReadBuffLoop:
mov @r0, a
inc r0
djnz r7, SetReadBuffLoop
ret
SetWriteBuff:
mov r0, #WriteBuff
mov r7, RWLength
SetWriteBuffLoop:
mov @r0, a
inc r0
djnz r7, SetWriteBuffLoop
ret
Main:
mov SP, #60h
; 读写缓冲初始化
mov a, #00
mov RWLength, #8
call SetReadBuff
mov a, #00
mov RWLength, #8
call SetWriteBuff
; 写缓冲初始化
mov r0, #WriteBuff
mov r7, #8
mov a, #55h
InitWriteBuffLoop:
mov @r0, a
inc a
inc r0
djnz r7, InitWriteBuffLoop
; 从地址0开始按字节方式写入8个数据'0'
mov RomAddress, #0
mov r7, #8
mov r0, #WriteBuff
WriteLoop:
call AT24c02WriteByte
inc RomAddress
inc r0
djnz r7, WriteLoop
; 按字节方式读出数据
mov RomAddress, #0
mov r7, #8
mov r0, #ReadBuff
ReadLoop:
call AT24c02ReadByte
inc RomAddress
inc r0
djnz r7, ReadLoop
; 按写Page方式从地址0开始写入WriteBuff指向的8个数据
mov RomAddress, #0
mov RWLength, #8
mov r0, #WriteBuff
call AT24C02WriteBlock
; 按连续读取方式读出从地址0开始的8个数据
mov RomAddress, #0
mov RWLength, #8
mov r0, #ReadBuff
call AT24C02ReadBlock
jmp $
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -