zhang32568 发表于 2024-4-12 15:43:40

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

在学习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!='\0')
{   
    c =ch-32;
    if(x>122){x=0;y++;}
    OLED_Set_Pos(x,y);   
        for(i=0;i<8;i++)   
          OLED_WrDat(F8X16);
        OLED_Set_Pos(x,y+1);   
        for(i=0;i<8;i++)   
          OLED_WrDat(F8X16);
        x+=8;
        j++;
}
}

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

while(1)
}

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

_奶咖君_ 发表于 2024-4-12 15:56:43

大致的思想是,根据你想显示的 字符串 从字库中找到字符串中每个字符的数据,按照屏幕驱动芯片的驱动写入到芯片对应的区域中,然后屏幕显示出来了。

浦江一水 发表于 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!='\0')                         //C语言中字符串结尾标志为0, 如果ch不等于0,则循环... 每一循环j+1
{   
    c =ch-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);      //写点阵模数据...一字节显示纵向8个像素点...
                                                   //实例"123ABC", 以首字符'1'来解释点模取法: F8X16,
                                                   //由以上解释可知'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); //写点阵模数据...一字节显示纵向8个像素点...//下半部分取后8字节...表示再偏移8字节
    x+=8;                                       //经过两次8字节的循环, 一个字符16字节显示完毕, x坐标要右移8点了...   
    j++;                                       //字符串中一个字符显示完毕,右移下一字符(如果下一字符为0,即字符串显示结束)
}
}

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

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

zhang32568 发表于 2024-4-13 08:43:26

非常感谢 看到你的回复 有点茅塞顿开!
页: [1]
查看完整版本: 请教大家 OLED是如何显示字符串的?代码讲解一下