绿林网页 发表于 2012-8-12 02:51:55

针对LCD12864显示屏写的float转unsigned char 请大家指正

针对 LCD12864RSPI.h 显示数字写了个转换函数,尚有bug,请大家指正
范围:00000.0000unsigned char floattounchar(float num)
{
int num1= (int)num;
float num2=0;
int t1 = getznumlen(num1);
int t2=0;
if(num1!=num){
    num2=num-(float)num1;
    t2 = getxnumlen(num2);
}
int t=t1+t2;
if(t2>0)t=t+1;
unsigned char s;
int c0=0,c1=0;
for(int j=0;j<t1;j++)
{   
    c0=num1/lentoint(t1-j)-c1*10;
    c1=num1/lentoint(t1-j);
    s=c0+48;
}
if(t2>0)
{
    s=0x2e;
    c0=0,c1=0;   
    int num3 =(int)(num2*lentoint(t2+1));
    for(int k=t1+1;k<t;k++)
    {      
      c0=num3/lentoint(t-k)-c1*10;
      c1=num3/lentoint(t-k);
      s=c0+48;
    }
}
return s;
}
int lentoint(int len)
{
switch(len)
{
case 1:
    return 1;
case 2:
    return 10;
case 3:
    return 100;
case 4:
    return 1000;
case 5:
    return 10000;
default:
    return 0;
}
}
int getznumlen(int num0)
{
int a=1;
for(a=1;a<6;a++)
{
    num0=num0/10;
    if(num0==0)
    {
      break;
    }
}
return a;
}
int getxnumlen(float num1)
{
int num2;
float t;
int a=-1;
for(a=1;a<=4;a++)
{
    num1=num1*10;
    num2=(int)num1;
    if(num2<=28&&num2>=17)
    {
      t=num1-num2-1;
    }
    else
    {
      t=num1-num2;
    }
    if((int)(t*1000)==0)
    {
      break;
    }
}
return a;
}

bacon6581 发表于 2012-8-12 18:46:56

int num=888888;
char cs[] = {0};

sprintf(cs,"%d",num);// cs即为"888888"

绿林网页 发表于 2012-8-12 21:00:34

bacon6581 发表于 2012-8-12 18:46 static/image/common/back.gif
int num=888888;
char cs[] = {0};



那带小数呢?

bacon6581 发表于 2012-8-12 21:41:42

不会了
我原先碰到这个问题
跑到arduino.cc里 发了个帖子求助
这是别人给我的回复

greenfort 发表于 2012-8-12 22:06:47

本帖最后由 greenfort 于 2012-8-12 22:35 编辑

似乎不必这么麻烦吧,使用
dtostrf()函数转换后再使用(unsigned char *)即可完成转换了
另外,你这个不是数组转换,LCD12864里需要用到数组吧

greenfort 发表于 2012-8-12 22:09:01

bacon6581 发表于 2012-8-12 21:41 static/image/common/back.gif
不会了
我原先碰到这个问题
跑到arduino.cc里 发了个帖子求助


你这个转换完了之后CS还是char型的,不是unsigned char型,而且忽略小数了吧

绿林网页 发表于 2012-8-13 00:25:30

本帖最后由 绿林网页 于 2012-8-13 00:27 编辑

greenfort 发表于 2012-8-12 22:06 static/image/common/back.gif
似乎不必这么麻烦吧,使用
dtostrf()函数转换后再使用(unsigned char *)即可完成转换了
另外,你这个不是 ...

修正一下:
unsigned char s;
return s;
我里面定义的是数组,函数定义错了哈,
unsigned char floattounchar(float num)
应该是
unsigned char[] floattounchar(float num)
这样对么?还没测试,明晚测试一下


也试试用

int num=888888;
char cs[] = {0};
sprintf(cs,"%d",num);// cs即为"888888"

dtostrf()函数转换后再使用(unsigned char *)即可完成转换了

这两种方法,看能否简化程序!

greenfort 发表于 2012-8-13 01:15:10

绿林网页 发表于 2012-8-13 00:25 static/image/common/back.gif
修正一下:
unsigned char s;
return s;


不是 unsigned char[] floattounchar(float num) 应该是unsigned char* floattounchar(float num)
另外,返回值不对,没有仔细看程序,但测试后发现返回值不对

绿林网页 发表于 2012-8-13 12:10:51

greenfort 发表于 2012-8-13 01:15 static/image/common/back.gif
不是 unsigned char[] floattounchar(float num) 应该是unsigned char* floattounchar(float num)
另外, ...

因为我测试的时候,没有用函数做,上面那部分是放到loop里的,发帖的时候单独放的函数,不好意思,晚上 测试后再更正吧!

zcbzjx 发表于 2012-8-13 22:51:59

void setup(){
Serial.begin(9600);
float xxxx=-3333.1415926;
int16_tintegerPart=long(xxxx);
int16_t decimalPart;
if (integerPart>=0){
    decimalPart=(xxxx-integerPart)*100000;
}
else{
    decimalPart=(xxxx-integerPart)*100000*(-1);
}
char buf;
sprintf(buf, "%d.%d",integerPart,(unsigned)decimalPart);
Serial.println(buf);

}

void loop(){
}

绿林网页 发表于 2012-8-13 23:48:42

zcbzjx 发表于 2012-8-13 22:51 static/image/common/back.gif


你这个是 char 数组,串口输出可以,但是用到12864库不行,12864要的是 unsigned char

绿林网页 发表于 2012-8-15 10:34:15

greenfort 说的是对的,我弄得太繁琐了

http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1649

char str;
double temp =0;
dtostrf(temp,4,2,str);
LCDA.DisplayString(1,1,(unsigned char *)str,sizeof(str));

金鱼木渔 发表于 2013-6-19 10:57:04

带吗不好使:(
页: [1]
查看完整版本: 针对LCD12864显示屏写的float转unsigned char 请大家指正