用keil调试51程序:MOV R1,#30H MOV A,20H MOV @R1,A END 用debug运行时,总是说没有read允许,怎么回事?

查看30h单元,也没将20H写入该单元,请问如何才能将值写入单元中

第1个回答  2012-04-02
程序有些漏洞,按照如下试试:

ORG 0000H ;51单片机的第一条指令地址,不要遗漏.

MOV R1, #30H
MOV A, #20H ;注意:这里加上了井号,你原来,缺少井号.

MOV @R1, A ;把数据写入30H单元.

NOP ;加上几个空操作.
NOP
NOP ;在空操作期间,就可以查看30H单元.
;用DEBUG再往下执行,就会有错误提示.
END
第2个回答  2012-04-02
你是不是这样进行了处理
ORG 0000H
LJMP START ;跳过中断向量区
ORG 0030H
START: MOV R1,#30H
MOV A,20H
MOV @R1,A ;上面3条指令没错,而且是内部RAM
SJMP $ ;这条语句加了?如果不加,程序就走下去,后面就是乱码,出现的情况就无法预计
END追问

还是不行,程序就如图所示一直运行,而且30h单元的值也不对,再问一下,是不是我查看地址的地方不对,还是软件设置有问题啊

追答

你下面看的地方不对,你看的是代码区,C:0x0030,你现在看到的是机器码,你看的应该是数据区,在输入地址的位置加D:30H,就是内部RAM区,另外你要注意如果带#,就是常数,不加#,就是直接地址,该值要看20H单元的内容

本回答被提问者采纳
第3个回答  2012-04-02
改成
ORG 0000H
MOV R1,#30H
MOV A,#20H
MOV @R1,A
END就可以
第4个回答  2012-04-02
改成
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:MOV R1,#30H
MOV A,#20H
MOV @R1,A
LJMP $
如果写 MOV A,#20H是把立即数20h送给累加器A,如果写MOV A,20h是把20h单元的值送给累加器A,亲测可行
相似回答