共2条
1/1 1 跳转至页
问
我做的24C02的存取实验中:
为什么第二次读数据的时候,会接着第一次的读?(程序重新运行了)
谢谢指点!
程序如下:BITCNT EQU 40H
SUBADR EQU 41H
SDA BIT P1.6
SCL BIT P1.5
ORG 00H
JMP MAIN
ORG 0100H
MAIN:
SETB P1.0
MOV R6,#4
LOPP:
ACALL DELAY
ACALL READ_24C02
INC SUBADR
ACALL DELAY
MOV P2,A
ACALL DELAY
MOV P2,#0FFH
ACALL DELAY
DJNZ R6,LOPP
;JMP MAIN
;===================================
DELAY: MOV R0,#0FFH
DELAY0: MOV R1,#0FFH
DELAY1: NOP
NOP
NOP
DJNZ R1,DELAY1
DJNZ R0,DELAY0
RET
;=======================================
READ_24C02:
ACALL START
MOV A,#0A0H
ACALL SENTBYTE
JB F0,RCVRETURN
MOV A,SUBADR
ACALL SENTBYTE
JB F0,RCVRETURN
ACALL START
MOV A,#0A0H
SETB ACC.0
ACALL SENTBYTE
JB F0,RCVRETURN
ACALL RCVBYTE
RCVRETURN:
RET
;=========================================
START:
SETB SDA
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
CLR SCL
RET
;==================================
STOP:
CLR SDA
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET
;===============================
SENTBYTE:
MOV BITCNT,#08H
SENTB:
RLC A
MOV SDA,C
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
CLR SCL
DJNZ BITCNT,SENTB
NOP
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR F0
JNB SDA,ACKEND
SETB F0
ACKEND:
NOP
CLR SCL
RET
;=================================
RCVBYTE:
SETB SDA
MOV BITCNT,#08H
RCV:
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
NOP
NOP
DJNZ BITCNT,RCV
CLR SCL
NOP
NOP
CLR SDA
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
NOP
CLR SCL
RET
END
答 1: 有没有人能帮帮我???? 答 2: 你能不能先把IIC写好,写24c02不就很简单了 答 3: 仿真看看是不是第2次读的时候SUBADR没改变?READEEPROM:
CALL STARTE2 ;开始
LD R1,#0A0H
CALL WR_BYTE
LD R1,R2 ;R2是需要读取数据的地址
CALL WR_BYTE
CALL STARTE2
LD R1,#0A1H
CALL WR_BYTE
CALL RD_BYTE ;输出r0是读取的数据
LD R3,R0
CALL SNACK
CALL EPSTOP
CALL DELAY20MS
RET
重复调用的时候只需要增加r2,r3的地址就ok
为什么第二次读数据的时候,会接着第一次的读?(程序重新运行了)
谢谢指点!
程序如下:BITCNT EQU 40H
SUBADR EQU 41H
SDA BIT P1.6
SCL BIT P1.5
ORG 00H
JMP MAIN
ORG 0100H
MAIN:
SETB P1.0
MOV R6,#4
LOPP:
ACALL DELAY
ACALL READ_24C02
INC SUBADR
ACALL DELAY
MOV P2,A
ACALL DELAY
MOV P2,#0FFH
ACALL DELAY
DJNZ R6,LOPP
;JMP MAIN
;===================================
DELAY: MOV R0,#0FFH
DELAY0: MOV R1,#0FFH
DELAY1: NOP
NOP
NOP
DJNZ R1,DELAY1
DJNZ R0,DELAY0
RET
;=======================================
READ_24C02:
ACALL START
MOV A,#0A0H
ACALL SENTBYTE
JB F0,RCVRETURN
MOV A,SUBADR
ACALL SENTBYTE
JB F0,RCVRETURN
ACALL START
MOV A,#0A0H
SETB ACC.0
ACALL SENTBYTE
JB F0,RCVRETURN
ACALL RCVBYTE
RCVRETURN:
RET
;=========================================
START:
SETB SDA
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
CLR SCL
RET
;==================================
STOP:
CLR SDA
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET
;===============================
SENTBYTE:
MOV BITCNT,#08H
SENTB:
RLC A
MOV SDA,C
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
CLR SCL
DJNZ BITCNT,SENTB
NOP
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR F0
JNB SDA,ACKEND
SETB F0
ACKEND:
NOP
CLR SCL
RET
;=================================
RCVBYTE:
SETB SDA
MOV BITCNT,#08H
RCV:
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
NOP
NOP
DJNZ BITCNT,RCV
CLR SCL
NOP
NOP
CLR SDA
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
NOP
CLR SCL
RET
END
答 1: 有没有人能帮帮我???? 答 2: 你能不能先把IIC写好,写24c02不就很简单了 答 3: 仿真看看是不是第2次读的时候SUBADR没改变?READEEPROM:
CALL STARTE2 ;开始
LD R1,#0A0H
CALL WR_BYTE
LD R1,R2 ;R2是需要读取数据的地址
CALL WR_BYTE
CALL STARTE2
LD R1,#0A1H
CALL WR_BYTE
CALL RD_BYTE ;输出r0是读取的数据
LD R3,R0
CALL SNACK
CALL EPSTOP
CALL DELAY20MS
RET
重复调用的时候只需要增加r2,r3的地址就ok
共2条
1/1 1 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| 28BYJ-48机械臂实现人脸跟随被打赏¥24元 | |
| 基于RK3506B的片温识读功能的实现被打赏¥25元 | |
| 【瑞萨RA8D1测评】基于FreeRTOS的lvgl移植教程被打赏¥29元 | |
| 电子价签墨水屏开发被打赏¥35元 | |
| 【Ozone】RTT 打印终端使用被打赏¥29元 | |
| BMS保护板绝缘检测功能-不平衡电桥技术绝缘电阻检测设计与实现被打赏¥34元 | |
| 给28BYJ-48三自由度机械臂加一个网页控制台被打赏¥32元 | |
| 用28BYJ-48电机从零搭一台三自由度机械臂被打赏¥33元 | |
| 【英飞凌开发经验】ModusToolbox配置EdgeTalk外设被打赏¥27元 | |
| 基于BQ76952PFBR的BMS保护板热插拔损坏的原因和处理措施被打赏¥32元 | |
我要赚赏金
