DJNZ R5,WAIT
DJNZ R3,WAIT
AJMP WAIT1
SSS: CLR RI
MOV A,SBUF
MOV @R0,A
MOV R7,NUMBYT
INC R7
MOV NUMBYT,R7
;该程序为将RAM30H-37H中的内容写到24C02的00H
WRADD:LCALL STA
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0,WRADD
MOV A,R7;写入EEPROM单元地址
LCALL WRBYT
LCALL CACK
JB F0,WRADD
MOV R0,NWD
WRDA:MOV A,@R0
LCALL WRBYT
LCALL CACK
JB F0,WRADD
LCALL STOP;至此将数据0AAH写入了EEPROM地址单元00中
PROGRAM:LCALL SDL1
JB RI,SSS
AJMP WAIT1
WAIT1:LCALL DIR
CLR P1.4
SETB P2.6
CLR P2.6
JB RI,SSS
CLR P1.4
SETB P2.6
CLR P2.6
AJMP WRITEONE
DIR:NOP
NOP
NOP
RET
STA:SETB VSDA
NOP
SETB VSCL
NOP
NOP
NOP
NOP
NOP
CLR VSDA
NOP
NOP
NOP
NOP
NOP
CLR VSCL
NOP
RET
STOP:CLR VSDA
NOP
SETB VSCL
NOP
NOP
NOP
NOP
NOP
SETB VSDA
NOP
NOP
NOP
NOP
NOP
CLR VSCL
CLR VSDA
RET
MNACK:SETB VSDA
SETB VSCL
NOP
NOP
CLR VSCL
CLR VSDA
RET
MACK:CLR VSDA
SETB VSCL
NOP
NOP
CLR VSCL
SETB VSDA
RET
CACK:SETB VSDA
NOP
NOP
SETB VSCL
CLR F0
NOP
NOP
MOV C,VSDA
JNC CEND
SETB F0
CEND:NOP
CLR VSCL
NOP
RET
WRBYT:MOV R6,#08H
WLP:RLC A
JC WR1
SJMP WR0
WLP1:DJNZ R6,WLP
NOP
RET
WR1:SETB VSDA
NOP
SETB VSCL
NOP
NOP
NOP
NOP
NOP
CLR VSCL
SJMP WLP1
WR0:CLR VSDA
NOP
SETB VSCL
NOP
NOP
NOP
NOP
NOP
CLR VSCL
SJMP WLP1
RDBYT:MOV R6,#08H
RLP:SETB VSDA
NOP
SETB VSCL
NOP
NOP
MOV C,VSDA
MOV A,R2
CLR VSCL
RLC A
MOV R2,A
NOP
NOP
NOP
DJNZ R6,RLP
RET
WRITEONE:
LCALL STA
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0,WRITEONE
MOV A,#00H;写入EEPROM单元地址
LCALL WRBYT
LCALL CACK
JB F0,WRITEONE
MOV A,NUMBYT
LCALL WRBYT
LCALL CACK
JB F0,WRITEONE
LCALL STOP;至此将数据0AAH写入了EEPROM地址单元00中
NOP
LL:END
以下是引用middle-rui在2004-9-30 20:22:28的发言: 24C02如果连续写入的话,要分页写入的,每页为8个字节 |
谢谢您的指点,我对24C02理解不深,老是转不过弯,为什么可以单字节写入28个字节?
以下是引用middle-rui在2004-10-4 15:43:24的发言: 单字节写入,已经指定单个地址写入,不存在连续写入的 |
能否麻烦您给我一个连续写入60个字节的程序示范,我钻进牛角尖,有转不出来的感觉,谢谢您了!
WRITE_XIANGXICHENGJIAO1: ;RO,RAM为写入地址,LO24CXXX为24C02写入地址
MOV R0,#10H
MOV LO24CXXX_ADDR,#00H ;写24C02 00H-08H的数据
MOV RW24CXXX_TIMES,#08
LCALL WRITE_24C02
WRITE_XIANGXICHENGJIAO2:
MOV R0,#18H
MOV LO24CXXX_ADDR,#08H ;写24C02 08H-0FH的数据
MOV RW24CXXX_TIMES,#08
LCALL WRITE_24C02
;如果需要再写,则地址和,R0设置一下就可以连续写入60个BYTE
AJMP $
;这里是连续写入多字节数据
WRITE_24C02:
WRITE_24C02PER:
CLR C
LCALL START_BIT ;初始化
MOV A,#01H
RLC A
ADD A,#0A0H ;
LCALL WRITE_BIT ;送出写控制字
MOV A,LO24CXXX_ADDR ;把低地址送入A中
LCALL WRITE_BIT
WRITE_BYTE: MOV A,@R0 ;向24CXXX写入单个字节
LCALL WRITE_BIT ;写入数据
INC R0
LCALL DELAY_24
DJNZ RW24CXXX_TIMES,WRITE_BYTE
LCALL STOP_BIT ;停止写入数据
WRITE_ENDDING: LCALL DELAY2MS_24
RET
START_BIT: NOP ;开始位
SETB SLK_24CXXX
SETB SDA_24CXXX
LCALL DELAY_24
CLR SDA_24CXXX
LCALL DELAY_24
RET
WRITE_BIT: CLR C
MOV R7,#08H ;循环次数
WRITE_LOP: NOP
CLR SLK_24CXXX
NOP
RLC A
MOV SDA_24CXXX,C
NOP
SETB SLK_24CXXX
NOP
DJNZ R7,WRITE_LOP
CLR SLK_24CXXX ;应答发送请求
lCALL DELAY_24
SETB SLK_24CXXX
lCALL DELAY_24
CLR SLK_24CXXX
LCALL DELAY_24
RET
DELAY_25: MOV R4,#00H ;以下为延时
MOV R5,#04H
AJMP DELAY2_24
DELAY_24: MOV R4,#03H
MOV R5,#01H
AJMP DELAY2_24
DELAY2MS_24:
MOV R4,#00H
MOV R5,#06H ;20ms延时
DELAY2_24: DJNZ R4,DELAY2_24
DJNZ R5,DELAY2_24
RET
MOV R7,NUMBYT
CJNE R7,#00H,WAIT
WAIT0:JBC RI,SSS
LJMP WAIT0
WAIT:
JBC RI,SSS
DJNZ R5,WAIT
DJNZ R3,WAIT
MOV A,NUMBYT
DEC A
MOV NUMBYT,A
AJMP WRB08
SSS: CLR RI
MOV A,SBUF
MOV @R0,A
MOV R7,NUMBYT
CJNE R7,#07H,SSS1
LJMP WRB08
SSS1:INC R0
INC R7
MOV NUMBYT,R7
LJMP SDL1
;该程序为将30H-37H的内容写到24C02的01H-08H中
WRB08:
WRADD:MOV A,NUMBYT
INC A
MOV R7,A
LCALL STA
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0,WRADD
MOV A,#00h
LCALL WRBYT
LCALL CACK
JB F0,WRADD
MOV R0,NWD
WRDA:MOV A,@R0
LCALL WRBYT
LCALL CACK
JB F0,WRADD
INC R0
DJNZ R7,WRDA
LCALL DIR
LCALL STOP
MOV R0,NWD
MOV A,R1
ADD A,#08H
MOV R1,A
MOV NUM,#00H
SDL3:MOV TMOD,#20H;定时器T1作波特率发生器,工作于方式2
MOV TL1,#0F3H;设定T1的初值确定波特率为4800
MOV TH1,#0F3H;
CLR ET1;T1作波特率发生器时应禁止中断
SETB TR1;启动TR1计数
MOV SCON,#52H;串行口设置方式1
ORL PCON,#80H;SMOD=1
;待接收数据首地址
;待接收数据字节数量
MOV R5,#5
MOV R3,#50
MOV R7,NUMBYT
WAIT3:
JBC RI,SSS3
DJNZ R5,WAIT3
DJNZ R3,WAIT3
LJMP WRB083N
SSS13:INC R0
INC R7
INC R2
MOV NUMBYT,R7
LJMP SDL3
SSS3:CLR RI
MOV A,SBUF
MOV @R0,A
MOV R7,NUMBYT
CJNE R2,#07H,SSS13
;该程序为将30H-37H的内容写到24C02的01H-08H中
WRB083:
WRADD3:
MOV R4,#08H
LCALL STA
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0,WRADD3
MOV A,R1
LCALL WRBYT
LCALL CACK
JB F0,WRADD3
MOV R0,NWD
WRDA3:MOV A,@R0
LCALL WRBYT
LCALL CACK
JB F0,WRADD3
INC R0
DJNZ R4,WRDA3
LCALL DIR
LCALL STOP
MOV R0,NWD
MOV A,R1
ADD A,#08H
MOV R1,A
MOV R2,#00H
LCALL SDL3
WRB083N:
WRADD3N:
MOV R4,#08H;该段子程序为当没有串口数据传输要求后的最后写入24C02的字节,字节数在八个以内,写完后进入最后写
NUMBYT子程序,然后退出
LCALL STA
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0,WRADD3N
MOV A,R1
LCALL WRBYT
LCALL CACK
JB F0,WRADD3N
MOV R0,NWD
WRDA3N:MOV A,@R0
LCALL WRBYT
LCALL CACK
JB F0,WRADD3N
INC R0
DJNZ R4,WRDA3N
LCALL DIR
LCALL STOP
WAIT1:LCALL DIR;该段子程序为让蜂鸣器响的子程序,有响声表明字节写入完毕
CLR P1.4
SETB P2.6
CLR P2.6
CLR P1.4
SETB P2.6
CLR P2.6
AJMP WRITEONE
DIR:NOP
NOP
NOP
RET
STA:SETB VSDA
SETB VSCL
NOP
NOP
CLR VSDA
NOP
NOP
CLR VSCL
RET
STOP:CLR VSDA
SETB VSCL
NOP
NOP
SETB VSDA
NOP
NOP
CLR VSCL
CLR VSDA
RET
MNACK:SETB VSDA
SETB VSCL
NOP
NOP
CLR VSCL
CLR VSDA
RET
MACK:CLR VSDA
SETB VSCL
NOP
NOP
CLR VSCL
SETB VSDA
RET
CACK:SETB VSDA
SETB VSCL
CLR F0
MOV C,VSDA
JNC CEND
SETB F0
CEND:CLR VSCL
RET
WRBYT:MOV R6,#08H
WLP:RLC A
MOV VSDA,C
SETB VSCL
NOP
NOP
CLR VSCL
DJNZ R6,WLP
RET
RDBYT:MOV R6,#08H
RLP:SETB VSDA
SETB VSCL
MOV C,VSDA
MOV A,R2
RLC A
MOV R2,A
CLR VSCL
DJNZ R6,RLP
RET
WRITEONE:
LCALL STA
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0,WRITEONE
MOV A,#80H;写入EEPROM单元地址
LCALL WRBYT
LCALL CACK
JB F0,WRITEONE
MOV A,NUMBYT
INC A
LCALL WRBYT
LCALL CACK
JB F0,WRITEONE
LCALL STOP;至此将数据0AAH写入了EEPROM地址单元00中
NOP
LL:END