极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: 绿林网页

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

[复制链接]
发表于 2012-8-12 02:51:55 | 显示全部楼层 |阅读模式
针对 LCD12864RSPI.h 显示数字写了个转换函数,尚有bug,请大家指正
范围:00000.0000
  1. unsigned char floattounchar(float num)
  2. {
  3.   int num1= (int)num;  
  4.   float num2=0;
  5.   int t1 = getznumlen(num1);
  6.   int t2=0;
  7.   if(num1!=num){
  8.     num2=num-(float)num1;
  9.     t2 = getxnumlen(num2);
  10.   }
  11.   int t=t1+t2;
  12.   if(t2>0)t=t+1;
  13.   unsigned char s[t];
  14.   int c0=0,c1=0;
  15.   for(int j=0;j<t1;j++)
  16.   {   
  17.     c0=num1/lentoint(t1-j)-c1*10;
  18.     c1=num1/lentoint(t1-j);
  19.     s[j]=c0+48;
  20.   }
  21.   if(t2>0)
  22.   {
  23.     s[t1]=0x2e;
  24.     c0=0,c1=0;   
  25.     int num3 =(int)(num2*lentoint(t2+1));
  26.     for(int k=t1+1;k<t;k++)
  27.     {      
  28.       c0=num3/lentoint(t-k)-c1*10;
  29.       c1=num3/lentoint(t-k);
  30.       s[k]=c0+48;
  31.     }
  32.   }
  33.   return s;
  34. }
  35. int lentoint(int len)
  36. {
  37.   switch(len)
  38.   {
  39.   case 1:
  40.     return 1;
  41.   case 2:
  42.     return 10;
  43.   case 3:
  44.     return 100;
  45.   case 4:
  46.     return 1000;
  47.   case 5:
  48.     return 10000;
  49.   default:
  50.     return 0;
  51.   }
  52. }
  53. int getznumlen(int num0)
  54. {
  55.   int a=1;
  56.   for(a=1;a<6;a++)
  57.   {
  58.     num0=num0/10;
  59.     if(num0==0)
  60.     {
  61.       break;
  62.     }  
  63.   }
  64.   return a;
  65. }
  66. int getxnumlen(float num1)
  67. {  
  68.   int num2;
  69.   float t;
  70.   int a=-1;
  71.   for(a=1;a<=4;a++)
  72.   {
  73.     num1=num1*10;
  74.     num2=(int)num1;
  75.     if(num2<=28&&num2>=17)
  76.     {
  77.       t=num1-num2-1;
  78.     }
  79.     else
  80.     {
  81.       t=num1-num2;
  82.     }
  83.     if((int)(t*1000)==0)
  84.     {
  85.       break;
  86.     }
  87.   }
  88.   return a;
  89. }
复制代码
回复

使用道具 举报

发表于 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
int num=888888;
char cs[] = {0};

那带小数呢?
回复 支持 反对

使用道具 举报

发表于 2012-8-12 21:41:42 | 显示全部楼层
不会了
我原先碰到这个问题
跑到arduino.cc里 发了个帖子求助
这是别人给我的回复
回复 支持 反对

使用道具 举报

发表于 2012-8-12 22:06:47 | 显示全部楼层
本帖最后由 greenfort 于 2012-8-12 22:35 编辑

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

使用道具 举报

发表于 2012-8-12 22:09:01 | 显示全部楼层
bacon6581 发表于 2012-8-12 21:41
不会了
我原先碰到这个问题
跑到arduino.cc里 发了个帖子求助

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

使用道具 举报

 楼主| 发表于 2012-8-13 00:25:30 | 显示全部楼层
本帖最后由 绿林网页 于 2012-8-13 00:27 编辑
greenfort 发表于 2012-8-12 22:06
似乎不必这么麻烦吧,使用
dtostrf()函数转换后再使用(unsigned char *)即可完成转换了
另外,你这个不是 ...


修正一下:
unsigned char s[t];
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 01:15:10 | 显示全部楼层
绿林网页 发表于 2012-8-13 00:25
修正一下:
unsigned char s[t];
return s;

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

使用道具 举报

 楼主| 发表于 2012-8-13 12:10:51 | 显示全部楼层
greenfort 发表于 2012-8-13 01:15
不是 unsigned char[] floattounchar(float num) 应该是unsigned char* floattounchar(float num)
另外, ...

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

使用道具 举报

发表于 2012-8-13 22:51:59 | 显示全部楼层
  1. void setup(){
  2.   Serial.begin(9600);
  3.   float xxxx=-3333.1415926;
  4.   int16_t  integerPart=long(xxxx);
  5.   int16_t decimalPart;  
  6.   if (integerPart>=0){
  7.     decimalPart=(xxxx-integerPart)*100000;
  8.   }
  9.   else{
  10.     decimalPart=(xxxx-integerPart)*100000*(-1);
  11.   }
  12.   char buf[30];
  13.   sprintf(buf, "%d.%d",integerPart,(unsigned)decimalPart);
  14.   Serial.println(buf);

  15. }

  16. void loop(){
  17. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-13 23:48:42 | 显示全部楼层
zcbzjx 发表于 2012-8-13 22:51

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

使用道具 举报

 楼主| 发表于 2012-8-15 10:34:15 | 显示全部楼层
greenfort 说的是对的,我弄得太繁琐了

http://www.geek-workshop.com/for ... thread&tid=1649

char str[4];
double temp =0;
dtostrf(temp,4,2,str);
LCDA.DisplayString(1,1,(unsigned char *)str,sizeof(str));
回复 支持 反对

使用道具 举报

发表于 2013-6-19 10:57:04 | 显示全部楼层
带吗不好使
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 09:00 , Processed in 0.065637 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表