论坛风格切换切换到宽版
  • 3113阅读
  • 11回复

为何不能重定义在DATA区的数组~~ [复制链接]

上一主题 下一主题
离线kyughanum
 
发帖
99
只看楼主 倒序阅读 0楼 发表于: 2006-09-28
#include <reg51.h>
//#include <intrins.h>
#define uchar unsigned char
#define pd p2
typedef bit bool ;

sbit rs = p3^0 ;
sbit rw = p3^1 ;
sbit ep = p3^7 ;

void delay(uchar) ;
void lcd_wcmd(uchar) ;
bool lcd_bz() ;
void lcd_pos(uchar) ;
void lcd_wdat(uchar) ;
void display(uchar,uchar *) ;

uchar data dis1[] ;
uchar data dis2[] ;

void longdelay(uchar s) //长延时
{
while(s--)
{
delay(60) ;
}
}

void delay(uchar ms)
{     // 延时子程序
uchar i ;
while(ms--)
{
for(i = 0 ; i< 250 ; i++) ;
}
}

bool lcd_bz()
{     // 测试lcd忙碌状态
bool result ;
rs = 0 ;
rw = 1 ;
ep = 1 ;
result = (bool)(pd & 0x80) ;
ep = 0 ;
return result ;
}

void lcd_wcmd(uchar cmd)
{     // 写入指令数据到lcd
while(lcd_bz()) ;
rs = 0 ;
rw = 0 ;
ep = 0 ;
pd = cmd ;
ep = 1 ;
ep = 0 ;
}

void lcd_pos(uchar pos)
{     //设定显示位置
lcd_wcmd(pos | 0x80) ;
}

void lcd_wdat(uchar dat)
{     //写入字符显示数据到lcd
while(lcd_bz()) ;
rs = 1 ;
rw = 0 ;
ep = 0 ;
pd = dat ;
ep = 1 ;
ep = 0 ;
}

void lcd_init()
{     //lcd初始化设定
lcd_wcmd(0x38) ;   //function set
delay(1) ;
lcd_wcmd(0x38) ;   //function set
delay(1) ;
lcd_wcmd(0x08) ;   //display on/off
delay(1) ;
lcd_wcmd(0x01) ;   //清除lcd的显示内容
delay(1) ;
lcd_wcmd(0x06) ;   //entry mode set
delay(1) ;
lcd_wcmd(0x0c) ;   //entry mode set
delay(1) ;
}

/*---------------
函数名称:display()
功能 :在lcd上显示数组的数据
说明 :先写显示地址,后写显示数据
调用 :lcd_wcmd(), lcd_pos()
入口参数:pos 写入的位置,q指向要写入的数据所在的数组
返回值 :无
----------------*/
void display(uchar pos, uchar *q)
{
uchar i ;
//lcd_wcmd(0x01) ; //clear
delay(10) ;
lcd_pos(pos) ;
for(i=0 ;i<16 ;i++)
{
lcd_wdat(*q) ;
q++ ;
longdelay(2) ;
}
}

main()
{
lcd_init() ;   // 初始化lcd  
delay(10) ;
while(1){
uchar data dis1[] = {"   i love you   "} ;
uchar data dis2[] = {" i love you too "} ;
display(0x00,dis1) ;
display(0x40,dis2) ;
uchar data dis1[] = {"   0123456789   "};
uchar data dis2[] = {"abcdefghijklmnop"} ;
display(0x14,dis1) ;
display(0x54,dis2) ;
lcd_wcmd(0x07) ;   //entry mode set
delay(1) ;
}
}


如题~~我把数组定义在data区了~~为何我不能重定义其值呢?编译时的错误如附件的图所示~~123~124~行即为
uchar data dis1[] = {"   0123456789   "} ;
uchar data dis2[] = {"abcdefghijklmnop"} ;
这两行`~请高手指点一下~~我应该如何重定义数组的值呢?

另外~如何设置使keil中显示行号呢?以便在出错时方便的找到出错的行~~

先谢过了`~
离线kyughanum
发帖
99
只看该作者 1楼 发表于: 2006-09-28
呵呵~~行号已经懂了~~用uv3就可以了~
离线kyughanum
发帖
99
只看该作者 2楼 发表于: 2006-09-29
晕啊~~这个数组的赋值怎么没人回答啊~~我等得好急啊~到底问题出在哪了啊~?
离线BG4UVR
发帖
11288
只看该作者 3楼 发表于: 2006-09-29
'
晕啊~~这个数组的赋值怎么没人回答啊~~我等得好急啊~到底问题出在哪了啊~?
'

上次没看清2楼的帖子,以为自己已经解决了呢。

uchar data dis2[] = {"abcdefghijklmnop"} ;

这样的语句,是定义数组。注意的问题就是,已经声明过的数组,再赋值可不能这样用了,因为这相当于再次定义一个同样名字的数组,编译器肯定不同意了 ;)
离线kyughanum
发帖
99
只看该作者 4楼 发表于: 2006-09-29
呵呵~~多谢~~问题是那我该如何重赋值那个数组呢?
离线BG4UVR
发帖
11288
只看该作者 5楼 发表于: 2006-09-29
'
呵呵~~多谢~~问题是那我该如何重赋值那个数组呢?
'

试试第二个地方直接 dis2[]=xxxxx 可不可以(我发现我总是纸上谈兵啊,我没测试
离线BG4UVR
发帖
11288
只看该作者 6楼 发表于: 2006-09-29
'
试试第二个地方直接 dis2[]=xxxxx 可不可以(我发现我总是纸上谈兵啊,我没测试 [表情] )
'

不用试了,我试过了,不可以。
离线kyughanum
发帖
99
只看该作者 7楼 发表于: 2006-09-29
晕啊~~那有没有办法重新对一个数组赋值呢?关且还要反复赋值的啊~
离线BG6AGB
发帖
915
只看该作者 8楼 发表于: 2006-09-29
好像字符串再次赋值给一个字符数组比较麻烦,但string.h里面有字符串方面的库函数
strcpy()应该可以满足上面的要求

另外:程序里定义的变量默认就是在data区里,所以没有必要指定data了
离线bd4vc
发帖
172
只看该作者 9楼 发表于: 2006-09-29
字符数组只能在定义时整体赋初值,
而不能在赋值语句中整体赋值。
离线BG4UVR
发帖
11288
只看该作者 10楼 发表于: 2006-09-30
定义成code的,然后dis1[],dis2[],dis3[],dis4[]好像还更好些
离线BG4UVR
发帖
11288
只看该作者 11楼 发表于: 2006-09-30
定义成code的dis1[],dis2[],dis3[],dis4[]好像还更好些