奇怪,往xdata的一个数组里写数,第0个元素的值会自动变成0,改成idata就不会出现

2020-01-23 14:50发布

小弟在做一个项目,往数组里边写入一个要显示的数据,送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溢出)?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
52条回答
flywater
1楼-- · 2020-01-25 11:01
回复【10楼】aaa1982
回复【7楼】flywater  落叶
-----------------------------------------------------------------------
我从来没有设置过,从来都是用多少xdata基本上就是多大的范围,都是从0x0000开始的,连续的。
真还没碰到过这种情况。
而且keil编译链接的过程不会像动态内存分配似的还会产生碎片吧。
aaa1982
-----------------------------------------------------------------------

呵呵,DATA也会有奇怪的问题
maidilong
2楼-- · 2020-01-25 16:33
程序ourdev_571388.rar(文件大小:15K) (原文件名:SSD1305 TSET(24M-2).rar)

落叶能不能也给我看看?这事让我头痛好很久,通宵了好几晚都不知怎会事,我现在在移植一下zlggui,这个gui要在51单片机开辟一个1K的显示缓存,我用的是12864单 {MOD}的OLED显示屏,这个程序在不开辟1K的显示缓存是能正常显示,很正常的,但开辟了这个1K的显示缓存,显示屏显示出来的东西就乱了,麻烦给些意见,谢谢~
maidilong
3楼-- · 2020-01-25 22:22
回复【14楼】maidilong
程序 (原文件名:ssd1305 tset(24m-2).rar)  
落叶能不能也给我看看?这事让我头痛好很久,通宵了好几晚都不知怎会事,我现在在移植一下zlggui,这个gui要在51单片机开辟一个1k的显示缓存,这个程序在不开辟1k的显示缓存是能正常显示,很正常的,但开辟了这个1k的显示缓存,显示屏显示出来的东西就乱了,麻烦给些意见,谢谢~
-----------------------------------------------------------------------

我刚刚按七楼设置了一下,还是不行,郁门
flywater
4楼-- · 2020-01-26 02:59
回复【15楼】maidilong
-----------------------------------------------------------------------

用的什么片子呀?能不能把问题说得详细些
maidilong
5楼-- · 2020-01-26 07:52
 精彩回答 2  元偷偷看……
maidilong
6楼-- · 2020-01-26 12:09
奇怪的地方就在下面这个函数,我要是把里面的那个二维数组的显示缓冲区填充数据的话,显示屏就会乱了,要是把这个二维数组屏蔽了,倒能正常显示,但这个对我想开劈的显示缓冲区就开劈不出来了

/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat                填充的数据
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void  GUI_FillSCR(TCOLOR dat)
{  unsigned int i,j;
  
        for(i=0; i<8; i++)
        {
     for(j=0; j<128; j++)
             {  
                gui_disp_buf[j]=dat;//dat;
      }
        }

   // 填充LCM
   LCM_DispFill(dat);
}

一周热门 更多>