OpenEdv-开源电子网

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

OLED显示汉字例程分享,不需w25Q64,仅SD卡,可以显示个性汉字

[复制链接]

8

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2019-4-17
在线时间
34 小时
发表于 2020-5-14 16:01:36 | 显示全部楼层 |阅读模式
先上两张张效果图。
大家有什么问题也可以相互讨论。
辛苦移植了一整天,这里要感谢@冰封嗜魔 http://www.openedv.com/forum.php?mod=viewthread&tid=16099   
参考了他的帖子,不需要外挂flash,直接读取保存在SD卡中的字库,
这部分代码如下:
void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)
{
        unsigned char qh,ql;
        unsigned char i;                                          
        unsigned long foffset;
        FIL file;
        UINT BR;
        u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数         
        qh=*code;
        ql=*(++code);
        if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非 常用汉字
        {
            for(i=0;i<csize;i++)*mat++=0x00;//填充满格
            return; //结束访问
        }
        if(ql<0x7f)ql-=0x40;//注意!
        else ql-=0x41;
        qh-=0x81;
        foffset=((unsigned long)190*qh+ql)*csize;        //得到字库中的字节偏移量
        switch(size)
        {
                case 12:
                        f_open(&file,"0:/SYSTEM/font12/MDL12.FON",FA_OPEN_EXISTING|FA_READ);
                        f_lseek (&file, foffset);
                        f_read (&file, mat, 24, &BR);
                        f_close(&file);
                        break;
//                case 16:
//                        f_open(&file,"0:/SYSTEM/FONT2/QNHG16.FON",FA_OPEN_EXISTING|FA_READ);
//                        f_lseek (&file, foffset);
//                        f_read (&file, mat, 32, &BR);
//                        f_close(&file);
//                        break;
                case 16:
                        f_open(&file,"0:/SYSTEM/font16/YMMCT16.FON",FA_OPEN_EXISTING|FA_READ);
                        f_lseek (&file, foffset);
                        f_read (&file, mat, 32, &BR);
                        f_close(&file);
                        break;
                case 24:
                        f_open(&file,"0:/SYSTEM/font24/ZZGFGMT24.FON",FA_OPEN_EXISTING|FA_READ);
                        f_lseek (&file, foffset);
                        f_read (&file, mat, 72, &BR);
                        f_close(&file);
                case 32:
                        f_open(&file,"0:/SYSTEM/font32/QNHG32.FON",FA_OPEN_EXISTING|FA_READ);
                        f_lseek (&file, foffset);
                        f_read (&file, mat, 128, &BR);
                        f_close(&file);
                        break;
        }
}

新增加了一些字体,都保存在0:/SYSTEM/font12文件夹下,我会把字体打包发上来。

void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode)
{
        u8 temp,t,t1;
        u16 y0=y;
        u8 dzk[128];   
        u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数         
        if(size!=12&&size!=16&&size!=24&&size!=32)return;        //不支持的size
        printf("csize is %d \r\n",csize);
        printf("font is %s \r\n",font);
        Get_HzMat(font,dzk,size);        //得到相应大小的点阵数据
        for(t=0;t<csize;t++)
        {                                                                                                     
                temp=dzk[t];                        //得到点阵数据
                printf("temp is %d",temp);
                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);
                        if(temp&0x80)OLED_DrawPoint(x,y,mode);
                        else OLED_DrawPoint(x,y,!mode);                       
                        temp<<=1;
                        y++;
                        if((y-y0)==size)
                        {
                                y=y0;
                                x++;
                                break;
                        }
                }           
        }  
}

但是似乎出现了一个bug,如果大家解决的话告诉我一声
不适用外挂flash后,fatfs似乎不能识别中文了,我想问题出在mycc936.c中的这段代码
//                        SPI_Flash_Read((u8*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出4个字节


我用这段代码代替:
//                        f_open(&file,"0:/SYSTEM/FONT/UNIGBK.BIN",FA_OPEN_EXISTING|FA_READ);//                        f_lseek (&file, i*4+gbk2uni_offset);//                        f_read (&file, (u8*)&t, 4, &BR);//                        f_close(&file);
但是似乎没有效果。






微信图片_20200514154502.jpg
OLED.jpg

oled汉字和字体.zip

11.66 MB, 下载次数: 604

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-5-4
在线时间
0 小时
发表于 2020-5-14 16:02:19 | 显示全部楼层
回复 支持 反对

使用道具 举报

4

主题

203

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2923
金钱
2923
注册时间
2019-8-16
在线时间
315 小时
发表于 2020-5-14 17:12:37 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2020-5-15 12:26:00 | 显示全部楼层
我的字库生成器很多字体都可以实现
回复 支持 反对

使用道具 举报

4

主题

173

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2019-7-28
在线时间
59 小时
发表于 2022-11-8 13:29:56 | 显示全部楼层
好复杂的汉字显示,学习了!
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2022-1-17
在线时间
14 小时
发表于 2023-6-14 14:55:21 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 07:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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