回 帖 发 新 帖 刷新版面

主题:[讨论]求教!为什么无法显示!!

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 楼

把y[6]和*x分在两行定义,别加"unsigned"。

x=(char*)y[6];                    
改成
x=y;

32位GCC编译通过。

12 楼

把编译出来的目标文件删了重新编也不行吗?编译的时候编译器有没有warning?编译器的版本是什么?

13 楼

7彩 ,能说下在一行和两行有什么区别,!  谢谢

风剑说的我再研究下,有警告因为在调试阶段有些函数没有饮用  编译器是 keil c   今天试了恢复正常,原因不明确

14 楼

照 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 楼

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 楼

 “则” 窜行!

17 楼

问题解决 去掉函数参数定义的 code 后结果正常,

18 楼

我的理解:

  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 楼

[quote]

显示:
  计时:123.4S
[color=FF0000]y+乱码[/color]
切料时间: 128.64

[/quote]


出现乱码是因为x是char *类型,这种类型用字符串赋值时会自动在最后加'\0',

而y是char[]类型,这种类型赋值必顺显式加上'\0',不加的话就变成y[]=“赋值”+“从赋值结束直到遇到'\0'为止的串”。

20 楼

新问题 出现了,
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本身带的字库!

我来回复

您尚未登录,请登录后再回复。点此登录或注册