高级会员

- 积分
- 514
- 金钱
- 514
- 注册时间
- 2017-5-21
- 在线时间
- 82 小时
|

楼主 |
发表于 2018-1-25 13:30:23
|
显示全部楼层
哈哈,我后来在整数的基础上,又写了一个显示小数的函数,功能还是和整数的类似,如自动对齐,显示长度固定,数据长度可不固定(如果数据长度超过显示长度,则显示为最大值或者最小值),自动消影(数据在变小数,自动把无用的数据清空),自动补零补空。总之还是要感谢一楼那位大佬,有了整数的算法,小数的算法就好写了,大致思想就是,先处理整数用强制转换的思路去做,然后再算出小数部分(小数部分=小数-取出来的整数),之后再把小数部分放大,然后按照处理整数的思路去做就可以了。这个显示代码还在调试过程,目前测试还算是稳定的,如果有大佬找出问题,小弟在继续修改试试看。
附上代码,供参考:
[mw_shl_code=c,true]void OledShowDecimal(u8 x,u8 page,double num,u8 len,u8 dotlen,u8 zero,u8 size)
{
u8 flag = 0;
double dtemp;
u8 top = 0,i;
s32 intpar = 0,inttpar = 0,dintpar = 0,dinttpar = 0;
u8 intlen = 0,inttlen = 0,intttlen = 0;
u8 dinttlen = 0,dintttlen = 0;
if(size == 6)
{
if(len != 0)
{
//判断数的大小
if(num < 0)
{
flag = 1;
num = - num;
}
//计算整数部分
intpar = (s32)num;
while(intpar > 0)
{
intpar /= 10;
intlen++;//计算整数的长度
}
if((s32)num == 0)intlen ++;//如果数为000.000,则整数部分长度统计出来0,则需要自动在小数点前面补零
if(intlen > (len - 1 - dotlen - flag))//判断是否超出整数显示长度
{
return;
}
if(zero == 0)//0模式右对齐自动补零
{
if(flag == 0)
{
for(i = 0;i < (len - 1 - intlen - dotlen - flag);i++)
{
OledShowChar(x,page,0+48,size);
x+=6;
}
}
else
{
for(i = 0;i < (len - 1 - intlen - dotlen - flag);i++)
{
OledShowChar(x,page,0+32,size);
x+=6;
}
}
}
else if(zero == 1)//1模式右对齐自动补空
{
for(i = 0;i < (len - 1 - intlen - dotlen - flag);i++)
{
OledShowChar(x,page,32,size);
x+=6;
}
}
if(flag != 0)//如果数为负数自动补'-'
{
OledShowChar(x,page,45,size);
x+=6;
}
//显示整数
intttlen = inttlen = intlen;
intpar = (s32)num;//取出整数
for(i = 0; i < intlen; i++)
{
inttpar = intpar;
inttlen = intttlen--;
top = inttpar / OledPow(10,(inttlen-1));
OledShowChar(x,page,top+48,size);
x+=6;
intpar %= OledPow(10,(inttlen-1));
}
//显示小数点
OledShowChar(x,page,46,size);
x+=6;
//显示小数点后几位dotlen
intpar = (s32)num;//取出整数
dtemp = num - intpar;//取出小数
dintpar = (s32)(dtemp*OledPow(10,dotlen));//将小数部分放大转成整数型
dintttlen = dinttlen = dotlen;
for(i = 0; i < dotlen; i++)
{
dinttpar = dintpar;
dinttlen = dintttlen--;
top = dinttpar / OledPow(10,(dinttlen-1));
OledShowChar(x,page,top+48,size);
x+=6;
dintpar %= OledPow(10,(dinttlen-1));
}
//左对齐时减小自动消除影
for(i = 0;i < (len - 1 - dotlen - ((s32)num==0?1:0));i++)
{
OledShowChar(x,page,32,size);
x+=6;
}
}
}
}[/mw_shl_code] |
|