|
本帖最后由 大哈欠E 于 2013-8-10 16:50 编辑
小生刚接触汇编,用汇编写了一个AT24c02的驱动程序,可是怎样都写不了数据,读出来的数据竟然是零,悲剧,检查了半天也没检查出来,无奈,只好来此论坛来骚扰各位大神,请大神帮帮忙啊。
ACK BIT 10H ;应答位标志
SLA DATA 30H //器件地址
SUBA DATA 31H //字节地址
NUMBYTE DATA 32H //写或读取的字节长度
SDA EQU P2.1 //数据口
SCL EQU P2.0 //时钟
MTD EQU 40H //写数据的缓冲首地址
MRD EQU 49H //读取数据的缓冲首地址
N EQU 01H //数据长度
;---------------------主程序------------------------------
;---功能为写一个0xFE数据到AT24c02,然后读取出来付给P3口,使P3.7led亮,验证读取-------
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV MTD,#0FEH
ACALL WRAT24C
ACALL RDAT24C
MOV A,MRD
MOV P3,A
SJMP $
;-----------------写多字节子程序------------------
WRAT24C: MOV SLA, #0A0H
MOV NUMBYTE,#N
MOV SUBA ,#20H
LCALL IWRENBYTE
RET
IWRENBYTE: MOV A,NUMBYTE
MOV R3,A
LCALL START
MOV A, SLA
LCALL WRBYTE
LCALL CACK
JNB ACK,RETWRN
MOV A,SUBA
LCALL WRBYTE
LCALL CACK
;JNB ACK,RETWRN
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WRBYTE
LCALL CACK
JNB ACK,IWRENBYTE
INC R1
DJNZ R3,WRDA
RETWRN: LCALL STOP
RET
;------------------读取多字节子程序-------------------
RDAT24C: MOV SLA,#0A0H
MOV NUMBYTE,#N
MOV SUBA,#20H
LCALL IRDNBYTE
RET
IRDNBYTE: MOV R3,NUMBYTE
LCALL START
MOV A,SLA
LCALL WRBYTE
LCALL CACK
JNB ACK,RETRDN
MOV A,SUBA
LCALL WRBYTE
LCALL CACK
LCALL START
MOV A,SLA
INC A
LCALL WRBYTE
LCALL CACK
JNB ACK,IRDNBYTE
MOV R1,#MRD
RDN1 : LCALL RDBYTE
MOV @R1,A
DJNZ R3,SACK
LCALL MNACK
RETRDN: LCALL STOP
RET
SACK: LCALL MACK //发送应答
INC R1
SJMP RDN1
;------------------------开始信号--------------------------------------------------------
START:
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
CLR SDA
NOP
CLR SCL
RET
;--------------结束信号-----------------
STOP:
CLR SDA
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
CLR SCL
RET
;-------------写字节子程序-------------------
WRBYTE: MOV R0,#08H
WR1: RLC A
MOV SDA,C
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R0,WR1
NOP
RET
;---------读取字节子程序--------------------
RDBYTE: MOV R0,#08H
RD1: SETB SDA ;读之前io口先置1
SETB SCL
NOP
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
NOP
NOP
NOP
DJNZ R0,RD1
RET
;------------发送应答位子程序--------------------
MACK: CLR SDA ;低电平位应答信号
NOP
NOP
SETB SCL
NOP
NOP
CLR SCL
NOP
NOP
RET
;------------发送非应答位子程序-------------
MNACK: SETB SDA ;高电平时为非应答信号
NOP
NOP
SETB SCL
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;-----------------检查应答位子程序-----------------------
CACK: SETB SDA
NOP
NOP
SETB SCL
CLR ACK
MOV C,SDA
JC CEND
SETB ACK
CEND: NOP
CLR SCL
NOP
RET
END
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|