打印
[STM32F4]

怎样才能使OLED显示变量?

[复制链接]
1711|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyf部长|  楼主 | 2022-9-9 22:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
OLED_showString(10,2,"V=3.5m/s",16); //显示字符串
问题:oled驱动程序显示字符串显示的是常亮或者固定的字符串,
         我想要显示的数值是一个变量

使用特权

评论回复
沙发
yinxiangh| | 2022-9-9 22:30 | 只看该作者
编写一个数值转字符串函数,以你的原函数为例
float Speed_now = 3.5;
uint8_t String_buff[32];
OLED_showString(10, 2, Float2String(String_buff, Speed_now, 1), 16);

使用特权

评论回复
板凳
chenjunt| | 2022-9-9 22:33 | 只看该作者
这里给出一个我写的Float2String函数原型及其实现
/**
  * @brief  单精度浮点数转字符串
  * @param  num:待转换的单精度浮点数
                        accuracy:转换精度
                                @ARG 精度值取大于7时无效
  * @retval 转换完成的字符串首地址
                                @arg result[]
  */
uint8_t* Float2String(uint8_t* s_buff, float num, uint8_t accuracy) //ps:C标准输入输出库内有sprintf(...)浮点ect.数转字符串函数
{
        uint32_t integer = 0; //整数
        uint32_t decimal = 0; //小数
        uint8_t num_temp = 0; //按位转换的结果缓冲
        uint32_t multi_dec = 1; //小数倍乘
        uint8_t point = 0; //转换结果下标
        uint8_t trans_len = 0; //按位转换的结果长度
        uint8_t trans_temp[BUFFLEN]; //按位转换的结果数组缓冲
        uint8_t accuracy_temp = accuracy; //转换精度备份

        if (num < 0)
        {
                /* 若num小于零,前填零 */
                num = -num;
                s_buff[point] = '-';
                point++;
        }
        integer = (uint16_t) num; //取整数部分
        while (accuracy--)
        {
                multi_dec *= 10; //取小数精度倍乘
        }
        decimal = (uint16_t)(multi_dec * (num - integer + 0.000001f)); //取小数部分
        if (integer)
        {
                while (integer)
                {
                        /* 将整数部分转换为倒位数组 */
                        num_temp = integer % 10;
                        trans_temp[trans_len] = num_temp + 48;
                        integer = (integer - num_temp) / 10;
                        trans_len++;
                }
                point += trans_len;
        }
        else
        {
                s_buff[point] = '0';
                point++;
        }
        for (; trans_len > 0; trans_len--)
        {
                /* 将倒位数组内容存放到转换结果 */
                s_buff[point - trans_len] = trans_temp[trans_len - 1];
        }
        if (decimal)
        {
                s_buff[point] = '.'; //补小数点
                trans_len = 0;
                while (decimal)
                {
                        /* 将小数部分转换为倒位数组 */
                        num_temp = decimal % 10;
                        trans_temp[trans_len] = num_temp + 48;
                        decimal = (decimal - num_temp) / 10;
                        trans_len++;
                }
                while (trans_len < accuracy_temp)
                {
                        /* 补零 */
                        trans_temp[trans_len] = '0';
                        trans_len++;
                }
                point += (trans_len + 1);
        }
        else
        {
                s_buff[point] = 0;
                return s_buff;
        }
        for (; trans_len > 0; trans_len--)
        {
                /* 将倒位数组内容存放到转换结果 */
                s_buff[point - trans_len] = trans_temp[trans_len - 1];
        }
        s_buff[point] = 0;
        return s_buff;
}

使用特权

评论回复
地板
zhenykun| | 2022-9-9 22:36 | 只看该作者
要想显示如你要的"V=3.5m/s",一是可以用字符串连接的方式,将数值转换的字符串拼接起来;二是可以事先计算好字符串出现在屏幕上的位置,依次放置

使用特权

评论回复
5
zyf部长|  楼主 | 2022-9-9 22:38 | 只看该作者
什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
6
zhaoxqi| | 2022-9-9 22:40 | 只看该作者
例如先显示"V=   m/s",再更改横坐标位置,用数值转换后的字符串替换空格

使用特权

评论回复
7
zyf部长|  楼主 | 2022-9-9 22:42 | 只看该作者
感谢!!
uint8_t trans_temp[BUFFLEN]; //按位转换的结果数组缓冲
     这行代码编译不通过 BUFFLEN 没有定义;

使用特权

评论回复
8
zwll| | 2022-9-9 22:47 | 只看该作者
传指针就行了,别把问题复杂化

使用特权

评论回复
9
llljh| | 2022-9-9 22:51 | 只看该作者

先格式化,再显示

sprintf(acBuf, "%2d. %04d  PPM 当前",
        pHole->ucTotal+1,
        uiCur);
LCD_StrEx((192-18*8)/2, 2, acBuf);

使用特权

评论回复
10
zyf部长|  楼主 | 2022-9-9 22:52 | 只看该作者

好像都是使用的sprintf函数

使用特权

评论回复
11
pangb| | 2022-9-9 22:55 | 只看该作者
主要是初始化吧,后面显示就是调用函数而已。

使用特权

评论回复
12
heweibig| | 2022-9-9 22:57 | 只看该作者

是 iic 的OLED 屏幕 还是SPI的呢

使用特权

评论回复
13
zhenykun| | 2022-9-9 22:59 | 只看该作者

这两种驱动都可以写在同一个C文件中。

使用特权

评论回复
14
zwll| | 2022-9-9 23:00 | 只看该作者
一般是采用条件编译的方式。

使用特权

评论回复
15
renyaq| | 2022-9-9 23:03 | 只看该作者
先显示 字符  然后显示汉子  最后就是图片了。

使用特权

评论回复
16
morrisk| | 2022-9-9 23:05 | 只看该作者
把显示  字符  汉子  图片的函数 封装好后就是在主函数中调用了,没什么难度,

使用特权

评论回复
17
yufe| | 2022-9-9 23:08 | 只看该作者
sprintf

使用特权

评论回复
18
zyf部长|  楼主 | 2022-9-9 23:10 | 只看该作者
8080并口

使用特权

评论回复
19
zyf部长|  楼主 | 2022-9-9 23:14 | 只看该作者

事先计算好字符串出现在屏幕上的位置,依次放置。实现了变量显示。谢谢
                OLED_showString(20,2,"V=",16);
                OLED_showString(80,2, "m/s",16);
                OLED_showNum(40,2,t,2,16);

使用特权

评论回复
20
zyf部长|  楼主 | 2022-9-9 23:16 | 只看该作者
直接调用sprintf?没用sprintf写过,sprintf原函数在哪里下载?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

694

主题

7102

帖子

8

粉丝