| |
为什么在加了外部数据存储器62256的程序后,总程序不能运行? |
|
|
| 出处:21ic 时间: 2007-10-30 |
|
ccjchen 发布于 2007-10-29 18:34:00 各位大哥帮看看我的62256读写程序有问题吗? uchar idata dig1[7]={"4 8.5 0"};
void WR62256() { uchar i; addr=0x0100;//数据存储的起始地址 for(i=0;i<4;i++)//连续存储14个数据 { *addr=dig1[2*i]; addr++; } } void RD62256() { uchar i; addr=0x0100; //读取数据的起始地址 for(i=0;i<4;i++)//连续读取14个数据 { dig1[2*i]=*addr; addr++;
} }
void main(void) { initlcm(); initmcu(); WR62256();//写62256 for(;;) { RD62256();//从62256读dig1[] dealkey();//用键盘改变dig1[]的值 dis_voltage(); //WR62256();将改变后的值写入62256, 但是加了这句话程序就运行不过去,不知道为什么 难道我的62256写有错吗? } }
lbx_00 发布于 2007-10-29 20:41:00 在WR62256();前面插入无用码,keil有时候很怪的,还有,就是从你的帖子里看不到ddr的定义,
ccjchen 发布于 2007-10-29 21:06:00 还有个问题要请教大虾,如果我想直接访问0x0100这个地址,应该怎么写呢 xdata(0x0100),还是xbyte(0x0100),或者用_at_应该怎么写?
沈老 发布于 2007-10-29 21:15:00 1>.使用:uchar volatile xdata addr[] _at_ 0x0100;//来定义 2>.用数组存取: void WR62256() { uchar i; //addr=0x0100; for(i=0;i<4;i++) { addr[i]=dig1[2*i]; } } void RD62256() { uchar i; for(i=0;i<4;i++) { dig1[2*i]=addr[i]; } } 3>.外存0x100地址是不是太低了? .
ccjchen 发布于 2007-10-29 23:04:00 1.volatile 没用过,在书上也没看过,什么意思啊,必须用吗? 2.你的第二种方法中没有指明存在外部ram中的什么地方这样也可以吗?那不是自动分配外部空间了吗? 3.外存不是从0x0000-0xffff都可以放数据吗,难道低位空间还有其他用处吗?
沈老 发布于 2007-10-30 19:36:00 1>."C51.pdf",104页中有这样的话: NOTE If you use the _at_ keyword to declare a variable that accesses an XDATA peripheral, you may require the volatile keyword to ensure that the C compiler does not optimize out necessary memory accesses. "volatile"目的基本如上. 2>.定义和使用即(1,2)不是2种方法. 3>.有的芯片本身有1到4K的SRAM作XDATA(如W77E58).所以0x100就太低了.
|
| 【关闭】 【打印】 |
|
|
|
|