OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4452|回复: 7

OLED怎么调用字库??求指点

[复制链接]

6

主题

23

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2022-4-20
在线时间
19 小时
发表于 2022-5-26 12:21:10 | 显示全部楼层 |阅读模式
25金钱
OLED怎么像LCD直接调用字库显示的?
  中景园OLED0.96 。阴码+逆向(低位在前)+列行式+C51格式
    这个程序设计有什么不合理的地方吗?(正点LCD+中景OLED拼凑的)。运行出来显示的地方都糊了,大片都是点亮的。
莫不是字库调出来的数据顺序是不对的(和中景园oled扫描方式不兼容)?

我:
void OLED_Show_ZH(u8 x,u8 y,u8 *font,u8 size,u8 mode)
{
        u8 m,temp;
  u8 dzk[72];  //获取临时存放点阵的数据
        u8 x0=x,y0=y;  
  u16 i,size1=(size/8+((size%8)?1:0))*size; //得到字体一个字符对应点阵集所占的字节数
if(size!=12&&size!=16&&size!=24)return;        //不支持的size
        Get_HzMat(font,dzk,size);        //得到相应大小的点阵数据
        for(i=0;i<size1;i++)
        {
                temp=dzk[i];                        //得点阵每个字节数据  
                for(m=0;m<8;m++)  //竖着写一个字节
                {
                        if(temp&0x80) OLED_DrawPoint(x,y,mode);  //mode=1点亮(在1选择填充模式)
                                //LCD_Fast_DrawPoint(x,y,POINT_COLOR);
                               
                        else  OLED_DrawPoint(x,y,!mode); //mode=0点暗(1填充模式)
                                //LCD_Fast_DrawPoint(x,y,BACK_COLOR);
                        temp<<=1;         //移位从上到下写像素点点亮
                        y++;
                }
              if((x-x0)==size) {x=x0-1;y0=y0+8;}   //一页字宽的字节填完
                   y=y0;                                x++;
                        }       
          }
}


正点原子(dzk,调用的字库):
void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode)
{
        u8 temp,t,t1;
        u16 y0=y;
        u8 dzk[72];       //重要
        u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数         
        if(size!=12&&size!=16&&size!=24)return;        //不支持的size
        Get_HzMat(font,dzk,size);        //得到相应大小的点阵数据
        for(t=0;t<csize;t++)
        {                                                                                                     
                temp=dzk[t];                        //得到点阵数据                          
                for(t1=0;t1<8;t1++)
                {
                        if(temp&0x80){ LCD_Fast_DrawPoint(x,y,POINT_COLOR);                }
                        else if(mode==0)  {   LCD_Fast_DrawPoint(x,y,BACK_COLOR);  }
                        temp<<=1;
                        y++;
                        if((y-y0)==size)
                        {
                                y=y0;
                                x++;
                                break;
                        }
                }           
        }  
}


中景园--这个跟OLED肯定兼容(【Hzk】是提前存好的特殊字数据,非字库):
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode)
{
        u8 m,temp;
        u8 x0=x,y0=y;   //得到字体一个字符对应点阵集所占的字节数
  u16 i,size3=(size1/8+((size1%8)?1:0))*size1;
        for(i=0;i<size3;i++)
        {
                if(size1==16)
                                {temp=Hzk1[num][i];}//调用16*16字体
                else if(size1==24)
                                {temp=Hzk2[num][i];}//调用24*24字体
                else if(size1==32)      
                                {temp=Hzk3[num][i];}//调用32*32字体
                else if(size1==64)
                                {temp=Hzk4[num][i];}//调用64*64字体
                else return;
                for(m=0;m<8;m++)
                {
                        if(temp&0x01)OLED_DrawPoint(x,y,mode);
                        else OLED_DrawPoint(x,y,!mode);
                        temp>>=1;
                        y++;
                }
                x++;
                if((x-x0)==size1)
                {x=x0;y0=y0+8;}
                y=y0;
        }
}


最佳答案

查看完整内容[请看2#楼]

这种东西还是需要自己琢磨的, 别人也没有时间帮你分析显示代码 加上你提供的资料不全。 因为即使是同一家产品, 由于控制器不同,可能显示方式也不一致。 就我的经验,比较快速的基本方法是: 1、先使用厂家的提供的例程,能够正常显示(一般会包含少量几个汉字) 2、那几个汉字能够正确显示后,看看例程中那几个汉字的字模排列方式(有专门的反字模软件工具)。 3、确定字模排列方式后,按照该方式自己取几个汉字(ATK ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4462
金钱
4462
注册时间
2018-5-11
在线时间
932 小时
发表于 2022-5-26 12:21:11 | 显示全部楼层
本帖最后由 warship 于 2022-5-27 10:44 编辑

这种东西还是需要自己琢磨的,

别人也没有时间帮你分析显示代码
加上你提供的资料不全。
因为即使是同一家产品,
由于控制器不同,可能显示方式也不一致。
就我的经验,比较快速的基本方法是:
1、先使用厂家的提供的例程,能够正常显示(一般会包含少量几个汉字)
2、那几个汉字能够正确显示后,看看例程中那几个汉字的字模排列方式(有专门的反字模软件工具)。
3、确定字模排列方式后,按照该方式自己取几个汉字(ATK-XFONT V1.2.1 正点原子字模软件)
4、将自己取的汉字字模替换厂家提供的例程,看能不能显示自己取的汉字。
5、都成功后,取自己需要在软件中显示的所有可能的汉字集的字模,就能满足自己的需求了。

如果你想用另外的字体字号显示汉字(或其它字符),
那就需要进一步研究你所用显示屏显示点阵的原理(研究厂家例程就可以),
仿此编制自己的汉字显示函数,
就可以随心所欲了。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

6

主题

23

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2022-4-20
在线时间
19 小时
 楼主| 发表于 2022-5-26 18:24:26 | 显示全部楼层
有经验的伙伴可以分享下心得吗,随便指点一下也行。
回复

使用道具 举报

4

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2020-10-10
在线时间
114 小时
发表于 2022-5-26 18:42:08 来自手机 | 显示全部楼层
直接上中景园的就行,一样可以显示64号字体。再看看你的字库是不是按ASCII码表排列的
回复

使用道具 举报

4

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2020-10-10
在线时间
114 小时
发表于 2022-5-26 18:43:49 来自手机 | 显示全部楼层
你要显示中文还是数字?
回复

使用道具 举报

4

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2020-10-10
在线时间
114 小时
发表于 2022-5-28 13:13:04 来自手机 | 显示全部楼层
https://www.liangzl.com/get-article-detail-209603.html
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2022-5-28 22:48:41 | 显示全部楼层
方法是可以的,仿真找bug
回复

使用道具 举报

6

主题

23

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2022-4-20
在线时间
19 小时
 楼主| 发表于 2022-5-29 10:25:42 | 显示全部楼层
yao79 发表于 2022-5-26 18:43
你要显示中文还是数字?

中文的
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 02:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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