单片机float转字符数组用于显示
一、代码
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
typedef char u8;
void my_sprintf(char *buf, u8 L_inte, u8 L_deci, float *data);
void clear_buf(char *buf, int L);
void my_printf(char *buf, int L);
int main()
{
float m = -1234.5678;
char buf[11];
clear_buf(buf,10);
my_sprintf(buf,5,5,&m);
my_printf(buf,10);
clear_buf(buf,10);
printf("%c", '\n');
my_sprintf(buf,4,5,&m);
my_printf(buf,10);
clear_buf(buf,10);
printf("%c", '\n');
my_sprintf(buf,4,4,&m);
my_printf(buf,10);
clear_buf(buf,10);
printf("%c", '\n');
my_sprintf(buf,3,4,&m);
my_printf(buf,10);
clear_buf(buf,10);
printf("%c", '\n');
my_sprintf(buf,3,3,&m);
my_printf(buf,10);
clear_buf(buf,10);
printf("%c", '\n');
return 0;
}
void my_sprintf(char *buf, u8 L_inte, u8 L_deci, float *data) //用完要把buf清除。
{
int i=0;
int j=0;
double d_data;
double temp;
u8 sign; //sign=0, 正数 sign=1 负数
int L=L_inte+L_deci; //buf长度要大于等于L+1
d_data = (*data) * pow(10,L_deci);
sign = (d_data >=0 )?0:1;
if(d_data < 0)
d_data = 0-d_data;
for(i=0;i<L; i++)
{
temp = 0;
for(j=0;j<=i;j++)
{
temp = (*(buf+j))*pow(10,L-j-1) + temp;
}
*(buf+i) = (char)(((d_data-temp)/pow(10,L-i-1)));
}
for(i=0;i<L; i++)
{
*(buf+i) = 0x30+*(buf+i);
}
for(i=L;i>=L_inte+1;i--)
{
*(buf+i) = *(buf+i-1);
}
*(buf+i) = '.';
if(sign == 1)
{
for(i=L+2;i>=1;i--)
{
*(buf+i) = *(buf+i-1);
}
*(buf)='-';
}
}
void clear_buf(char *buf, int L)
{
int i=0;
for(i=0;i<L;i++)
{
*(buf+i)='\0';
}
}
void my_printf(char *buf, int L)
{
int i=0;
for(i=0;i<L;i++)
{
printf("%c", *(buf+i));
}
}
结果
然后转换一下负数看一下
总结
功能有些不完善,比如1234.5678。那么前面的整数部分长度必须要比实际长,比如此处要大于等于4,小于4则可能出现乱码。另外float精度不高,可能转换会有误差,同时要自己提前保证保存转换结果的数组长度要大于最终结果的长度。在此做个备份。