ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM32F4] OLED显示问题

[复制链接]
451|24
 楼主 | 2018-10-24 15:13 | 显示全部楼层 |阅读模式
OLED_showString(10,2,"V=3.5m/s",16); //显示字符串
问题:oled驱动程序显示字符串显示的是常亮或者固定的字符串,
         我想要显示的数值是一个变量
         怎样才能使OLED显示变量?
         做过的大神给点建议,谢谢!!!
| 2018-10-24 16:18 | 显示全部楼层
编写一个数值转字符串函数,以你的原函数为例
  1. float Speed_now = 3.5;
  2. uint8_t String_buff[32];
  3. OLED_showString(10, 2, Float2String(String_buff, Speed_now, 1), 16);
复制代码

这里给出一个我写的Float2String函数原型及其实现
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  单精度浮点数转字符串
  3.   * @param  num:待转换的单精度浮点数
  4.                         accuracy:转换精度
  5.                                 @arg 精度值取大于7时无效
  6.   * @retval 转换完成的字符串首地址
  7.                                 @arg result[]
  8.   */
  9. uint8_t* Float2String(uint8_t* s_buff, float num, uint8_t accuracy) //ps:C标准输入输出库内有sprintf(...)浮点ect.数转字符串函数
  10. {
  11.         uint32_t integer = 0; //整数
  12.         uint32_t decimal = 0; //小数
  13.         uint8_t num_temp = 0; //按位转换的结果缓冲
  14.         uint32_t multi_dec = 1; //小数倍乘
  15.         uint8_t point = 0; //转换结果下标
  16.         uint8_t trans_len = 0; //按位转换的结果长度
  17.         uint8_t trans_temp[BUFFLEN]; //按位转换的结果数组缓冲
  18.         uint8_t accuracy_temp = accuracy; //转换精度备份

  19.         if (num < 0)
  20.         {
  21.                 /* 若num小于零,前填零 */
  22.                 num = -num;
  23.                 s_buff[point] = '-';
  24.                 point++;
  25.         }
  26.         integer = (uint16_t) num; //取整数部分
  27.         while (accuracy--)
  28.         {
  29.                 multi_dec *= 10; //取小数精度倍乘
  30.         }
  31.         decimal = (uint16_t)(multi_dec * (num - integer + 0.000001f)); //取小数部分
  32.         if (integer)
  33.         {
  34.                 while (integer)
  35.                 {
  36.                         /* 将整数部分转换为倒位数组 */
  37.                         num_temp = integer % 10;
  38.                         trans_temp[trans_len] = num_temp + 48;
  39.                         integer = (integer - num_temp) / 10;
  40.                         trans_len++;
  41.                 }
  42.                 point += trans_len;
  43.         }
  44.         else
  45.         {
  46.                 s_buff[point] = '0';
  47.                 point++;
  48.         }
  49.         for (; trans_len > 0; trans_len--)
  50.         {
  51.                 /* 将倒位数组内容存放到转换结果 */
  52.                 s_buff[point - trans_len] = trans_temp[trans_len - 1];
  53.         }
  54.         if (decimal)
  55.         {
  56.                 s_buff[point] = '.'; //补小数点
  57.                 trans_len = 0;
  58.                 while (decimal)
  59.                 {
  60.                         /* 将小数部分转换为倒位数组 */
  61.                         num_temp = decimal % 10;
  62.                         trans_temp[trans_len] = num_temp + 48;
  63.                         decimal = (decimal - num_temp) / 10;
  64.                         trans_len++;
  65.                 }
  66.                 while (trans_len < accuracy_temp)
  67.                 {
  68.                         /* 补零 */
  69.                         trans_temp[trans_len] = '0';
  70.                         trans_len++;
  71.                 }
  72.                 point += (trans_len + 1);
  73.         }
  74.         else
  75.         {
  76.                 s_buff[point] = 0;
  77.                 return s_buff;
  78.         }
  79.         for (; trans_len > 0; trans_len--)
  80.         {
  81.                 /* 将倒位数组内容存放到转换结果 */
  82.                 s_buff[point - trans_len] = trans_temp[trans_len - 1];
  83.         }
  84.         s_buff[point] = 0;
  85.         return s_buff;
  86. }
复制代码

注:1、要想显示如你要的"V=3.5m/s",一是可以用字符串连接的方式,将数值转换的字符串拼接起来;二是可以事先计算好字符串出现在屏幕上的位置,依次放置,例如先显示"V=   m/s",再更改横坐标位置,用数值转换后的字符串替换空格。
 楼主 | 2018-10-24 19:22 | 显示全部楼层
1223657347 发表于 2018-10-24 16:18
编写一个数值转字符串函数,以你的原函数为例

这里给出一个我写的Float2String函数原型及其实现

    感谢!!
uint8_t trans_temp[BUFFLEN]; //按位转换的结果数组缓冲
     这行代码编译不通过 BUFFLEN 没有定义;
| 2018-10-25 09:44 | 显示全部楼层
传指针就行了,别把问题复杂化
| 2018-10-25 11:19 | 显示全部楼层
先格式化,再显示

sprintf(acBuf, "%2d. %04d  PPM 当前",
        pHole->ucTotal+1,
        uiCur);
LCD_StrEx((192-18*8)/2, 2, acBuf);
 楼主 | 2018-10-25 11:27 | 显示全部楼层
huzi2099 发表于 2018-10-25 09:44
传指针就行了,别把问题复杂化

好像都是使用的sprintf函数
| 2018-10-25 13:13 | 显示全部楼层
主要是初始化吧,后面显示就是调用函数而已。
| 2018-10-25 13:14 | 显示全部楼层
是 iic 的OLED 屏幕 还是SPI的呢
| 2018-10-25 13:14 | 显示全部楼层
这两种驱动都可以写在同一个C文件中。

评论

WUZHIXIONG23 2018-10-25 16:09 回复TA
有sprintf函数驱动下载链接吗? 
| 2018-10-25 13:15 | 显示全部楼层
一般是采用条件编译的方式。
| 2018-10-25 13:16 | 显示全部楼层
先显示 字符  然后显示汉子  最后就是图片了。
| 2018-10-25 13:16 | 显示全部楼层
把显示  字符  汉子  图片的函数 封装好后就是在主函数中调用了,没什么难度,

评论

WUZHIXIONG23 2018-10-25 15:12 回复TA
这个调用我知道,也可以正常显示,只是显示变量,一直没成功 
| 2018-10-25 14:47 | 显示全部楼层
sprintf
 楼主 | 2018-10-25 15:11 | 显示全部楼层
hanzhen654 发表于 2018-10-25 13:14
是 iic 的OLED 屏幕 还是SPI的呢

8080并口
 楼主 | 2018-10-25 16:05 | 显示全部楼层
1223657347 发表于 2018-10-24 16:18
编写一个数值转字符串函数,以你的原函数为例

这里给出一个我写的Float2String函数原型及其实现

事先计算好字符串出现在屏幕上的位置,依次放置。实现了变量显示。谢谢
                OLED_showString(20,2,"V=",16);
                OLED_showString(80,2, "m/s",16);
                OLED_showNum(40,2,t,2,16);
 楼主 | 2018-10-25 16:08 | 显示全部楼层


直接调用sprintf?没用sprintf写过,sprintf原函数在哪里下载?还是说STM32库里面有?
| 2018-10-25 16:22 | 显示全部楼层
WUZHIXIONG23 发表于 2018-10-25 16:08
直接调用sprintf?没用sprintf写过,sprintf原函数在哪里下载?还是说STM32库里面有? ...

c标准库

评论

WUZHIXIONG23 2018-10-25 16:35 回复TA
谢了 
caijie001 2018-10-25 16:44 回复TA
@WUZHIXIONG23 :不客气 
| 2018-10-25 21:10 | 显示全部楼层
WUZHIXIONG23 发表于 2018-10-25 16:05
事先计算好字符串出现在屏幕上的位置,依次放置。实现了变量显示。谢谢
                OLED_showString(20,2,"V=",16) ...

不客气
| 2018-11-5 15:07 | 显示全部楼层
字符串转换的问题吧
| 2018-11-5 16:16 | 显示全部楼层
是不是字符串转换出现问题了呀

评论

WUZHIXIONG23 2018-11-9 13:50 回复TA
这个我不是很了解,字符串函数输出只能输出常量没办法输出变量。可能是缺少字符串转换程序。 
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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