主题:[讨论]求教!为什么无法显示!!
shegh [专家分:0] 发布于 2010-03-02 11:26:00
float a;
unsigned char *x="000.0",y[6];
lcdreset(); //液晶显示控制器初始化
charlcdfill(' '); //显示清屏
putstrxy(2,0,"计时:123.4S"); //在(2,0)位置开始显示字符串
exdelay(); //延时约300mS
exdelay();
a=321.45;
sprintf(y,"%3.1f",a);
putstrxy(0,1,x); //正常显示 ‘000.0’
x=(char*)y[6];
putstrxy(0,1,x); //无法显示正常结果
回复列表 (共22个回复)
11 楼
七彩云南 [专家分:80] 发布于 2010-03-03 02:24:00
把y[6]和*x分在两行定义,别加"unsigned"。
x=(char*)y[6];
改成
x=y;
32位GCC编译通过。
12 楼
雪光风剑 [专家分:27190] 发布于 2010-03-03 07:46:00
把编译出来的目标文件删了重新编也不行吗?编译的时候编译器有没有warning?编译器的版本是什么?
13 楼
shegh [专家分:0] 发布于 2010-03-03 08:48:00
7彩 ,能说下在一行和两行有什么区别,! 谢谢
风剑说的我再研究下,有警告因为在调试阶段有些函数没有饮用 编译器是 keil c 今天试了恢复正常,原因不明确
14 楼
shegh [专家分:0] 发布于 2010-03-03 08:52:00
照 7彩的做了!
char *x="000.0";
char y[6]="234.5";
//0.演示前的准备,LCD液晶显示控制器初始化,所有显示全清零
// lcdreset(); //液晶显示控制器初始化
// charlcdfill(' '); //显示清屏
putstrxy(2,0,"计时:123.4S");
//在(2,0)位置开始显示字符串
x=y;
putstrxy(0,1,x);
putstrxy(0,2,"切料时间: 128.64"); //在(0,2)位置开始显示字符串
显示:
计时:123.4S
y+乱码
切料时间: 128.64
这问题估计不在上面语句上!我把显示的函数发出来大家给个 意见!
15 楼
shegh [专家分:0] 发布于 2010-03-03 08:55:00
void put_char(unsigned int c) //定位写字符子程序
{ unsigned char d;
if(c>128) //字符码大于128表示为汉字
{ if( (CXPOS&0x1)==1 ) //写汉字时,CXPOS字符位置在奇数位置,则
{ lcdwd(' '); //自动补添一个空格对齐后再显示汉字
charcursornext(); //置字符位置为下一个有效位置
}
charlcdpos();
if((c&0xff00)==0xff00) //若高位字节为0FFH则表示为自定义字符
c=0xffff-c; //则转换为ST7920的字符码
lcdwd(c/256); //写高位字符
charcursornext();
lcdwd(c&0xff); //写低位字符
charcursornext();
}
else //字符码小于128表示为ASCII字符
{ charlcdpos();
if( (CXPOS&0x1)==1 ) //写ASCII字符时,CXPOS字符位置在奇数位置,则
{ d=lcdrd(); //读高位字符
charlcdpos();
lcdwd(d); //重新写高位字符
lcdwd(c);
}
else
{ lcdwd(c); //写ASCII字符时,CXPOS字符位置在偶数位置,则
lcdwd(' '); //直接写入,同时自动补显一个空格.
}
charcursornext(); //置字符位置为下一个有效位置
}
}
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
void putstr(unsigned char code *s) //显示字符串子程序,字符码为0时退出
{ unsigned int c;
while(1)
{ c=*s;
s++;
if(c==0) break;
if(c<128)
put_char(c);
else
{ put_char(c*256+*s);
s++;
}
}
}
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s)
{ //在(cx,cy)字符位置写字符串子程序
CXPOS=cx; //置当前X位置为cx
CYPOS=cy; //置当前Y位置为cy
putstr(s);
}
16 楼
shegh [专家分:0] 发布于 2010-03-03 08:56:00
“则” 窜行!
17 楼
shegh [专家分:0] 发布于 2010-03-03 09:49:00
问题解决 去掉函数参数定义的 code 后结果正常,
18 楼
七彩云南 [专家分:80] 发布于 2010-03-03 10:36:00
我的理解:
char *x="000.0",char y[6]="234.5";
实际上y是char *[]类型 ,而不是我们期望的char []类型,在codeblocks里编辑器是这样认为的。
而
char *x="000.0";
char y[6]="234.5";
这种定义方式个人比较喜欢,它清晰的定义了期望的类型而不会产生别的有含糊意味的其它类型。
在早期的C、C++里
char *x="000.0",char y[6]="234.5";
y的确应该是char []类型,但这是一种模糊的定义方式。
这是一个*左结合和右结合的问题。
19 楼
七彩云南 [专家分:80] 发布于 2010-03-03 10:49:00
[quote]
显示:
计时:123.4S
[color=FF0000]y+乱码[/color]
切料时间: 128.64
[/quote]
出现乱码是因为x是char *类型,这种类型用字符串赋值时会自动在最后加'\0',
而y是char[]类型,这种类型赋值必顺显式加上'\0',不加的话就变成y[]=“赋值”+“从赋值结束直到遇到'\0'为止的串”。
20 楼
shegh [专家分:0] 发布于 2010-03-03 14:19:00
新问题 出现了,
sprintf(y,"%4.1f",b*0.1);
putstrxy(4,0,"A");
putstrxy(2,1,"计时:");
putstrxy(8,1,y);
putstrxy(13,1,"S");
putstrxy(0,2,"切料时间:");
putstrxy(0,3,"切料次数:"); 这行不能正常显示,显示“切料次屎”好恶心!
还有 体积的积字也不能正常 显示!!!!
帮分析下,是不是字库里面没有这个字 ,还是程序有问题!
说明led本身带的字库!
我来回复