zyf部长 发表于 2022-9-9 22:28

怎样才能使OLED显示变量?

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;
OLED_showString(10, 2, Float2String(String_buff, Speed_now, 1), 16);

chenjunt 发表于 2022-9-9 22:33

这里给出一个我写的Float2String函数原型及其实现
/**
* @brief单精度浮点数转字符串
* @paramnum:待转换的单精度浮点数
                        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; //按位转换的结果数组缓冲
      uint8_t accuracy_temp = accuracy; //转换精度备份

      if (num < 0)
      {
                /* 若num小于零,前填零 */
                num = -num;
                s_buff = '-';
                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 = num_temp + 48;
                        integer = (integer - num_temp) / 10;
                        trans_len++;
                }
                point += trans_len;
      }
      else
      {
                s_buff = '0';
                point++;
      }
      for (; trans_len > 0; trans_len--)
      {
                /* 将倒位数组内容存放到转换结果 */
                s_buff = trans_temp;
      }
      if (decimal)
      {
                s_buff = '.'; //补小数点
                trans_len = 0;
                while (decimal)
                {
                        /* 将小数部分转换为倒位数组 */
                        num_temp = decimal % 10;
                        trans_temp = num_temp + 48;
                        decimal = (decimal - num_temp) / 10;
                        trans_len++;
                }
                while (trans_len < accuracy_temp)
                {
                        /* 补零 */
                        trans_temp = '0';
                        trans_len++;
                }
                point += (trans_len + 1);
      }
      else
      {
                s_buff = 0;
                return s_buff;
      }
      for (; trans_len > 0; trans_len--)
      {
                /* 将倒位数组内容存放到转换结果 */
                s_buff = trans_temp;
      }
      s_buff = 0;
      return s_buff;
}

zhenykun 发表于 2022-9-9 22:36

要想显示如你要的"V=3.5m/s",一是可以用字符串连接的方式,将数值转换的字符串拼接起来;二是可以事先计算好字符串出现在屏幕上的位置,依次放置

zyf部长 发表于 2022-9-9 22:38

什么意思?不是很明白你说的什么,能再解释一下这个现象吗

zhaoxqi 发表于 2022-9-9 22:40

例如先显示"V=   m/s",再更改横坐标位置,用数值转换后的字符串替换空格

zyf部长 发表于 2022-9-9 22:42

感谢!!
uint8_t trans_temp; //按位转换的结果数组缓冲
   这行代码编译不通过 BUFFLEN 没有定义;

zwll 发表于 2022-9-9 22:47

传指针就行了,别把问题复杂化

llljh 发表于 2022-9-9 22:51


先格式化,再显示

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

zyf部长 发表于 2022-9-9 22:52


好像都是使用的sprintf函数

pangb 发表于 2022-9-9 22:55

主要是初始化吧,后面显示就是调用函数而已。

heweibig 发表于 2022-9-9 22:57


是 iic 的OLED 屏幕 还是SPI的呢

zhenykun 发表于 2022-9-9 22:59


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

zwll 发表于 2022-9-9 23:00

一般是采用条件编译的方式。

renyaq 发表于 2022-9-9 23:03

先显示 字符然后显示汉子最后就是图片了。

morrisk 发表于 2022-9-9 23:05

把显示字符汉子图片的函数 封装好后就是在主函数中调用了,没什么难度,

yufe 发表于 2022-9-9 23:08

sprintf

zyf部长 发表于 2022-9-9 23:10

8080并口

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);

zyf部长 发表于 2022-9-9 23:16

直接调用sprintf?没用sprintf写过,sprintf原函数在哪里下载?
页: [1] 2 3
查看完整版本: 怎样才能使OLED显示变量?