找回密码
 立即注册
查看: 540|回复: 3

请教大家 OLED是如何显示字符串的?代码讲解一下

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:388
  • 最近打卡:2025-05-07 07:40:40

25

主题

113

回帖

739

积分

高级会员

积分
739
发表于 2024-4-12 15:43:40 | 显示全部楼层 |阅读模式
在学习OLED12864显示。其中显示字符串函数。


const unsigned char code F8X16[]=   //
{
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
  0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//!1
  0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"2

}更多的代码没有贴上,大家知道意思。

函数

void OLED_P8x16Str(unsigned char x,unsigned char y,unsigned char ch[])
{
  unsigned char c=0,i=0,j=0;
        
  while (ch[j]!='\0')
  {   
    c =ch[j]-32;
    if(x>122){x=0;y++;}
    OLED_Set_Pos(x,y);   
          for(i=0;i<8;i++)     
            OLED_WrDat(F8X16[c*16+i]);
          OLED_Set_Pos(x,y+1);   
          for(i=0;i<8;i++)     
            OLED_WrDat(F8X16[c*16+i+8]);  
          x+=8;
          j++;
  }
}

主程序
void main()
{
OLED_P8x16Str(1,1,"123ABC")

while(1)
}

现在研究了半天,OLED_P8x16Str(1,1,"123ABC")函数 如何识别我要显示的字符串正确显示出来

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:436
  • 最近打卡:2025-05-06 08:38:18

33

主题

2355

回帖

4874

积分

论坛元老

积分
4874
发表于 2024-4-12 15:56:43 | 显示全部楼层
大致的思想是,根据你想显示的 字符串 从字库中找到字符串中每个字符的数据,按照屏幕驱动芯片的驱动写入到芯片对应的区域中,然后屏幕显示出来了。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-05-07 08:08:50

30

主题

347

回帖

3500

积分

荣誉版主

积分
3500
发表于 2024-4-12 22:50:50 | 显示全部楼层
试解释一下...

//西文ASCII字符的点阵模数组.下标从0开始...8X16点阵每字符占16字节点阵模数据...
const unsigned char code F8X16[]=  
{
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0  这里的"0"姑且称为行计数,便于函数中变量c的解释.. 每行16字节点模数据.显示一个字符...
  0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//!1
  0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"2
  ......
} //更多的代码没有贴上,大家知道意思。(原注释)

// 西文8x16点阵字符串显示函数
// 形式参数: x,y,字符串左上角显示坐标, ch[] 需要显示字符串数组...
// OLED是128*64像素  映射到内存为 128*8字节显示缓存, 则  x=0..127(横向128点),  y=0..7(纵向8行,每行纵向8点像素,用一字节表达)
void OLED_P8x16Str(unsigned char x,unsigned char y,unsigned char ch[])
{
  unsigned char c=0;             //字符所在点模数组的行下标
  unsigned char i=0;             //8像素点计数器
  unsigned char j=0;             //字符串数组下标计数器,初始化为0,如实例"123ABC", 即 j=0..5   
        
  while (ch[j]!='\0')                         //C语言中字符串结尾标志为0, 如果ch[j]不等于0,则循环... 每一循环j+1
  {   
    c =ch[j]-32;                               //计算待显示字符的点阵模数组的行计数下标...
                                                     //取字符串中的一个字符..将其ASCII码减32,即为点阵模行下标,
                                                     //例如'1'的ASCII为0x31(就是49),减0x20(就是减32),即得'1'所在数组的行下标0x11(就是17)
    if( x>122){ x=0; y++; }              //如果x点坐标大于122, 即无法再显示一个宽度为8点的字符了,需要换行...
    OLED_Set_Pos(x,y);                     //显示定位点坐标(每一字符上半部的左上角位置)
    for(i=0;i<8;i++)                         //循环显示8字节(即一个字符的上半部分)
    OLED_WrDat(F8X16[c*16+i]);      //写点阵模数据...一字节显示纵向8个像素点...
                                                     //实例"123ABC", 以首字符'1'来解释点模取法: F8X16[c*16+i],
                                                     //由以上解释可知'1'所在为第16行,即'1'的点模数据,从F8X16[]数组偏移17*16字节起始取数16字节点模数据...上半部分取前8字节...
    OLED_Set_Pos(x,y+1);                //显示定位点坐标(已下移一行(8点))(即每字符下半部的左上角位置)
    for(i=0;i<8;i++)                        //循环显示8字节(即一个字符的下半部分)  
    OLED_WrDat(F8X16[c*16+i+8]); //写点阵模数据...一字节显示纵向8个像素点...  //下半部分取后8字节...[c*16+i+8]表示再偏移8字节
    x+=8;                                       //经过两次8字节的循环, 一个字符16字节显示完毕, x坐标要右移8点了...   
    j++;                                         //字符串中一个字符显示完毕,右移下一字符(如果下一字符为0,即字符串显示结束)
  }
}

//主程序
void main()
{
  OLED_P8x16Str(1,1,"123ABC")
  while(1)
}

以上解释只是针对所给出的函数的本人理解的解释, 仅供参考... 当然, 显示字符串函数, 这不是唯一的算法...

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:388
  • 最近打卡:2025-05-07 07:40:40

25

主题

113

回帖

739

积分

高级会员

积分
739
发表于 2024-4-13 08:43:26 | 显示全部楼层
非常感谢 看到你的回复 有点茅塞顿开!
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-7 09:19 , Processed in 0.115741 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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