小弟在做一个项目,往数组里边写入一个要显示的数据,送1602LCD进行显示。
定义的了一个在xdata区的数组:
xdata uchar ber[7];
然后某段程序往里边赋值
for(i=0;i<7;i++)
ber=array;
结果发现ber[0]的值被变成了十进制的0,导致LCD显示函数认为已经到了最后一个字符而不显示。
即使我把代码改成:
for(i=0;i<7;i++)
ber=i+ '0';//(变成asccii码)
一样的,就ber[0]的值为0,数组其他元素的值是对的。
后来干脆把ber[]定义在idata区内。
竟然没有问题了!
想不明白为什么。
一开始怀疑为xdata区的这一字节坏掉了。
坏了个新一点儿的片子也这样。
如果xdata区不稳定,应该不只这一字节坏掉,我其他还有很多定义在Xdata区域内的变量,也是正常的。就这一个不正常。
请教高手这是为什么。
一开始也怀疑过,data的某些区域会被中断占用,可是xdata区域是不会被占的丫!
我的data=198字节,XDATA=912字节,code=22334字节
XDATA是片内自带的1KB XRAM
WINBOND W77E58 52单片机
keil uv 8.03版
另外有一个问题不明白,如果编译器告诉我,data使用量不超过256字节,是不是代表data占用量不会受中断影响(我是说会不会由于中断导致data溢出)?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
请教 flywater 落叶
在startup.a51中指定
xdatalen equ 0x0400
是否也可达到设置那个参数的效果?
我一直是这样做的,里面都没有设置什么,只是在startup.a51中修改一下就行了。
-----------------------------------------------------------------------
在startup.a51中设置 xdatalen equ 0x0400是不行的,这地方设置只影响MCU启动时,要清除XDATA区的字节长度,即这样设置后程序中会多以下代码:
MOV DPTR,#0x0000
MOV R7,#LOW (XDATALEN)
MOV R7,#0x00
MOV R6,#HIGH (XDATALEN)
MOV R6,#0x04
CLR A
CLR A
MOVX @DPTR,A
MOVX @DPTR,A
INC DPTR
INC DPTR
DJNZ R7,XDATALOOP
DJNZ R7,XDATALOOP(C:065D)
DJNZ R6,XDATALOOP
DJNZ R6,XDATALOOP(C:065D)
作用只是清0~0x400段的XDATA
一周热门 更多>