大哈欠E 发表于 2013-8-10 16:49:45

请抽点时间吧,大神。

本帖最后由 大哈欠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


skynet 发表于 2013-8-10 17:21:42

看到汇编,吓死掉,赶紧路过{:mad:}{:funk:}{:sweat:}

大哈欠E 发表于 2013-8-10 17:21:46

要落空了。。。

hellowolf 发表于 2013-8-10 17:24:06

什么时候还用汇编,

大哈欠E 发表于 2013-8-10 17:24:23

skynet 发表于 2013-8-10 17:21 static/image/common/back.gif
看到汇编,吓死掉,赶紧路过

我也知道,大家都一样,看代码就烦,不期待了,专心找错误。。

大哈欠E 发表于 2013-8-10 17:26:32

hellowolf 发表于 2013-8-10 17:24 static/image/common/back.gif
什么时候还用汇编,

那用什么?我是用c之后觉得很有必要搞一下汇编,才返过去学的

meirenai 发表于 2013-8-10 17:52:10

大神!没学过汇编的撸过

SevenLiu 发表于 2013-8-10 18:09:35

最好自己搭电路测试,而不是用仿真。汇编那么长没几个人会义务帮你看下去的。自己耐心点,这些东西网上很多参考,只要你有耐心很容易解决这问题的。

nightseas 发表于 2013-8-10 18:25:05

没用示波器看波形吗

nightseas 发表于 2013-8-10 18:26:08

好吧,没看到是仿真

zuu0 发表于 2013-8-10 18:26:47

其实,你才是大神

孩子莫悲伤 发表于 2013-8-10 18:41:26

楼主才是大神!~{:tongue:}

jacky2011 发表于 2013-8-10 18:51:49

去周立功网站下一个模版,非常经典的I2C

大哈欠E 发表于 2013-8-10 20:36:26

SevenLiu 发表于 2013-8-10 18:09 static/image/common/back.gif
最好自己搭电路测试,而不是用仿真。汇编那么长没几个人会义务帮你看下去的。自己耐心点,这些东西网上很多 ...

嗯,要不是不久前 打球把左手给废了,很多电路都想搭建了,现在还是一个手码字。。。我操。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

大哈欠E 发表于 2013-8-10 20:37:15

zuu0 发表于 2013-8-10 18:26 static/image/common/back.gif
其实,你才是大神

{:lol:} 你才是大神,你全家都是大神!呵呵。。

大哈欠E 发表于 2013-8-10 20:37:38

孩子莫悲伤 发表于 2013-8-10 18:41 static/image/common/back.gif
楼主才是大神!~

你也是大神。。

大哈欠E 发表于 2013-8-10 20:38:10

jacky2011 发表于 2013-8-10 18:51 static/image/common/back.gif
去周立功网站下一个模版,非常经典的I2C

是吗?去看看。。

大哈欠E 发表于 2013-8-10 20:38:51

meirenai 发表于 2013-8-10 17:52 static/image/common/back.gif
大神!没学过汇编的撸过

嗯 我也接触不久。。

大哈欠E 发表于 2013-8-10 22:33:38

尼玛,终于找出错误了!!!!希望像我一样的新手,不要犯此类错误,原因:由于此前用惯了C,习惯在建立文件之前添加keil A51启动文件,这个文件主要是配置程序入口 堆栈指针等初始化环境的,用c写是需要的该启动文件的,不过熟悉汇编的话,也可以自己写,而我用的是汇编写代码就不需要该启动代码了。
   大神说“startup.a51中一般已经包含了main标号,初学者写汇编如果还包含启动文件,容易出现符号重定义错误。而且用汇编多半意味着编程者希望事必躬亲,从初始化到向量配置等等底层工作全部包干,这种情况下startup.a51在编程者眼中完全是垃圾。 而对于采用C/C++编写程序就是完全另一回事了。这类编程者多半对于硬件底层未见得需要了解得多么透彻,启动文件准备好了一个可预测的初始工作环境,方便高级语言在此基础上完成较为抽象的工作”

dz20062008 发表于 2013-8-11 02:55:57

楼主厉害。有多少人用了C还去学汇编了!支持楼主

bailangcn 发表于 2013-8-11 03:24:31

好吧 当年我也会汇编 现在给我认真看汇编那就算了吧

error1314 发表于 2013-8-11 07:52:28

恭喜楼主解决问题 mark
页: [1]
查看完整版本: 请抽点时间吧,大神。