原来的汇编程序:
MOV R0,#05H
MOV R1,#30H
MOV DPTR,#0700H
DD: MOV A,@R1
MOVX @DPTR,A ;写数据的同时,WR会变,硬件上获取WR的变化.
INC R1
DJNZ R0,DD
MOVX A,@DPTR ;读数据的同时,RD会变,硬件上获取RD的变化.
END
这个是一个关于向AD9850输入控制字的程序,把AD9850芯片作为一扩展芯片而占用外部RAM
的一段地址.用MOVX @DPTR,A 指令来向这片芯片输入数据,在硬件上同时获取WR上的信号.
而我编写的C程序可以向0700H地址读写,但我用KEIL编译时看不到WR和RD的变化.请问各位
高手,我的程序有什么问题?
我自己编写的C程序:
#include <reg51.h>
#include <stdio.h>
#include <absacc.h>
typedef unsigned char uchar;
#define AD9850 XBYTE[0X0700]
void main(void)
{
static uchar idata a[5] ={0x0f,0xff,0x11,0x08,0x0a};
uchar i;
uchar xdata * ad_dds;
ad_dds=&AD9850;
for(i=0;i<5;i++)
{
*ad_dds=a[i]; //相当于上面的:MOVX @DPTR,A
}
a[i-1]=*ad_dds; //相当于上面的:MOVX A,@DPTR
}
把
#define AD9850 XBYTE[0X0700]
ad_dds=&AD9850
改为
#define AD9850 0X0700
ad_dds=AD9850
试试
ad_dds=&AD9850;
这几句翻译成汇编语言是:
C:0x008F 900700 MOV DPTR,#0x0700
16: for(i=0;i<5;i++)
C:0x0092 E4 CLR A
C:0x0093 FF MOV R7,A
17: {
18: *ad_dds=a[i];
C:0x0094 7408 MOV A,#0x08 ///08是数组的首地址
C:0x0096 2F ADD A,R7 ///加偏移量
C:0x0097 F8 MOV R0,A //
C:0x0098 E6 MOV A,@R0 // A=a[i];
C:0x0099 F0 MOVX @DPTR,A //挪出去。
19: }
C:0x009A 0F INC R7
C:0x009B BF05F6 CJNE R7,#0x05,C:0094
看起来和你用汇编写是一样的
“
但我用KEIL编译时看不到WR和RD的变化.
”
是什么意思呢?
:)
Money is not everything. There‘s Mastercard & Visa.
钞票不是万能的,有时还需要信用卡.
One should love animals. They are so tasty.
每个人都应该热爱动物,因为它们很好吃.
Save water. Shower with your girlfriend.
要节约用水,尽量和女友一起洗澡.
Love the neighbor. But don‘t get caught.
要用心去爱你的邻居,不过不要让她的老公知道.
Behind every successful man, there is a woman. And behind every unsuccessful man, there are two.
每个成功男人的背后,都有一个女人. 每个不成功男人的背后, 都有两个.