针对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;
} int num=888888;
char cs[] = {0};
sprintf(cs,"%d",num);// cs即为"888888" bacon6581 发表于 2012-8-12 18:46 static/image/common/back.gif
int num=888888;
char cs[] = {0};
那带小数呢? 不会了
我原先碰到这个问题
跑到arduino.cc里 发了个帖子求助
这是别人给我的回复 本帖最后由 greenfort 于 2012-8-12 22:35 编辑
似乎不必这么麻烦吧,使用
dtostrf()函数转换后再使用(unsigned char *)即可完成转换了
另外,你这个不是数组转换,LCD12864里需要用到数组吧 bacon6581 发表于 2012-8-12 21:41 static/image/common/back.gif
不会了
我原先碰到这个问题
跑到arduino.cc里 发了个帖子求助
你这个转换完了之后CS还是char型的,不是unsigned char型,而且忽略小数了吧 本帖最后由 绿林网页 于 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 *)即可完成转换了
这两种方法,看能否简化程序! 绿林网页 发表于 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)
另外,返回值不对,没有仔细看程序,但测试后发现返回值不对 greenfort 发表于 2012-8-13 01:15 static/image/common/back.gif
不是 unsigned char[] floattounchar(float num) 应该是unsigned char* floattounchar(float num)
另外, ...
因为我测试的时候,没有用函数做,上面那部分是放到loop里的,发帖的时候单独放的函数,不好意思,晚上 测试后再更正吧! 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(){
}
zcbzjx 发表于 2012-8-13 22:51 static/image/common/back.gif
你这个是 char 数组,串口输出可以,但是用到12864库不行,12864要的是 unsigned char 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)); 带吗不好使:(
页:
[1]