查看: 1867|回复: 1
打印 上一主题 下一主题

液晶浮点值显示的一种解决方法

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-21 22:38:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
液晶浮点值显示的一种解决方法

    在以ucOS-II为系统搭建的工程中,需要在液晶LCD上显示浮点型值,但液晶的驱动函数中仅编写了一个显示字符串的函数GUI_DispStringAt(); 所以需要一个函数把浮点型值转化成字符串,然后以字符串的形式输出到LCD上,sprintf()可以完成这个功能。[1]、[2]
    但使用sprintf()时遇到一个问题——经过sprintf()转换后,即使不为零的浮点值也变成0.0,我尝试着把整型值转为字符串,可以正常显示,然后我就纳闷了。
    搜索后,可能正确的解释如下:UCOSII的任务堆栈没有8字节对齐,在声明任务堆栈时,强制8字节对齐就可以了,系统默认是4字节对齐[3]。按照此种方法尝试后,编译出现30多个错误,鉴于自个不懂ucOS,便尝试了另一种方法[4],把浮点型值通过强制类型转换为2个整型值,一个是整数部分,另一个是小数部分(2位小数),例如,
            char tempbuf[20];
            float temp ;         /*要显示的浮点值*/
            int temp_decimal;    /*浮点值的小数部分,2位*/
            temp=3.141;
            temp_decimal = (int)(temp*100) - ((int)temp)*100;       /* temp_decimal =14*/
            sprintf(tempbuf, "%d.%02d%", (int)temp, temp_decimal);  /*显示结果为 3.14%*/

    另外一个怪异的错误是,
    当sprintf使用格式"%2.2f%s"时程序在此处跑飞,而"%d%s"不会跑飞,"%s%2.2f%s"也不会飞。
    这个错误原因还不懂,也许也和ucOS的堆栈字节数有关系吧,期待明白人儿指点。

参考:
[1]. 《在液晶上显示浮点数的方法》, wolf19860612, ourdev.cn,  http://goo.gl/17jxX
[2]. 《Sprintf》, 互动百科,  http://www.hudong.com/wiki/sprintf
[3]. 《求助:MDK中 sprintf输出浮点数据出错》, Shandong, ourdev.cn,  http://goo.gl/TKnSe
[4]. 《使用Cortex-M3 uCOS-II LPC1768工程模板时sprintf浮点数打印错误》,  http://goo.gl/ZDuYs
[5]. 《浮点数转字符串 怎么转啊?》, kekele, ourdev.cn,  http://goo.gl/V7Dsu
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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