请抽点时间吧,大神。
本帖最后由 大哈欠E 于 2013-8-10 16:50 编辑小生刚接触汇编,用汇编写了一个AT24c02的驱动程序,可是怎样都写不了数据,读出来的数据竟然是零,悲剧,检查了半天也没检查出来,无奈,只好来此论坛来骚扰各位大神,请大神帮帮忙啊。
ACKBIT10H ;应答位标志
SLADATA 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
ORG0030H
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
JNBACK,RETWRN
MOVA,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
JNBACK,IRDNBYTE
MOVR1,#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
CLRSDA
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
CLRSCL
NOP
NOP
RET
;------------发送非应答位子程序-------------
MNACK: SETB SDA;高电平时为非应答信号
NOP
NOP
SETB SCL
NOP
NOP
NOP
CLRSCL
NOP
NOP
RET
;-----------------检查应答位子程序-----------------------
CACK: SETB SDA
NOP
NOP
SETB SCL
CLR ACK
MOV C,SDA
JCCEND
SETB ACK
CEND: NOP
CLRSCL
NOP
RET
END
看到汇编,吓死掉,赶紧路过{:mad:}{:funk:}{:sweat:} 要落空了。。。 什么时候还用汇编, skynet 发表于 2013-8-10 17:21 static/image/common/back.gif
看到汇编,吓死掉,赶紧路过
我也知道,大家都一样,看代码就烦,不期待了,专心找错误。。 hellowolf 发表于 2013-8-10 17:24 static/image/common/back.gif
什么时候还用汇编,
那用什么?我是用c之后觉得很有必要搞一下汇编,才返过去学的 大神!没学过汇编的撸过 最好自己搭电路测试,而不是用仿真。汇编那么长没几个人会义务帮你看下去的。自己耐心点,这些东西网上很多参考,只要你有耐心很容易解决这问题的。 没用示波器看波形吗 好吧,没看到是仿真 其实,你才是大神 楼主才是大神!~{:tongue:} 去周立功网站下一个模版,非常经典的I2C SevenLiu 发表于 2013-8-10 18:09 static/image/common/back.gif
最好自己搭电路测试,而不是用仿真。汇编那么长没几个人会义务帮你看下去的。自己耐心点,这些东西网上很多 ...
嗯,要不是不久前 打球把左手给废了,很多电路都想搭建了,现在还是一个手码字。。。我操。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 zuu0 发表于 2013-8-10 18:26 static/image/common/back.gif
其实,你才是大神
{:lol:} 你才是大神,你全家都是大神!呵呵。。 孩子莫悲伤 发表于 2013-8-10 18:41 static/image/common/back.gif
楼主才是大神!~
你也是大神。。 jacky2011 发表于 2013-8-10 18:51 static/image/common/back.gif
去周立功网站下一个模版,非常经典的I2C
是吗?去看看。。 meirenai 发表于 2013-8-10 17:52 static/image/common/back.gif
大神!没学过汇编的撸过
嗯 我也接触不久。。 尼玛,终于找出错误了!!!!希望像我一样的新手,不要犯此类错误,原因:由于此前用惯了C,习惯在建立文件之前添加keil A51启动文件,这个文件主要是配置程序入口 堆栈指针等初始化环境的,用c写是需要的该启动文件的,不过熟悉汇编的话,也可以自己写,而我用的是汇编写代码就不需要该启动代码了。
大神说“startup.a51中一般已经包含了main标号,初学者写汇编如果还包含启动文件,容易出现符号重定义错误。而且用汇编多半意味着编程者希望事必躬亲,从初始化到向量配置等等底层工作全部包干,这种情况下startup.a51在编程者眼中完全是垃圾。 而对于采用C/C++编写程序就是完全另一回事了。这类编程者多半对于硬件底层未见得需要了解得多么透彻,启动文件准备好了一个可预测的初始工作环境,方便高级语言在此基础上完成较为抽象的工作” 楼主厉害。有多少人用了C还去学汇编了!支持楼主 好吧 当年我也会汇编 现在给我认真看汇编那就算了吧 恭喜楼主解决问题 mark
页:
[1]