OpenEdv-开源电子网

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

STM32探索者 基于OLED实验修改的汉字显示实验

[复制链接]

4

主题

896

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4303
金钱
4303
注册时间
2019-9-4
在线时间
896 小时
发表于 2021-5-9 22:07:40 | 显示全部楼层 |阅读模式
STM32F407 OLED汉字显示实验
中文占2个字节,英文及字符占一个字节。GBK汉字编码有两个字节,第一个字节为区码,第二个字节为段码。汉字的区码是一定大于127的,因此在编写显示函数的时候,可以判断GBK编码的第一个字节是否大于127来确定汉字还是字符。
---
实验环境:STM32407探索者,正点原子的OLED例程
需要软件:MDK,PCtoLCD2002完美版
---

首先用PCtoLCD2002生成需要显示的字模

这里的生成配置不是固定的,如果改变了生成方式,就要相对应的改变显示函数的代码。

  1. typedef struct
  2. {
  3.     u16 Index;
  4.     u8 Msk[32];
  5. } GBK16;

  6. //正(0) 点(1) 原(2) 子(3)
  7. GBK16 zifu[] ={
  8. '正',0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00,
  9. 0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,/*"正",0*/

  10. '点',0x00,0x00,0xC0,0x40,0x40,0x40,0x7F,0x48,0x48,0x48,0x48,0xC8,0x08,0x08,0x00,0x00,
  11. 0x80,0x40,0x37,0x04,0x04,0x14,0x64,0x04,0x14,0x64,0x04,0x07,0x10,0xE0,0x00,0x00,/*"点",1*/

  12. '原',0x00,0x00,0xFE,0x02,0x02,0xF2,0x92,0x9A,0x96,0x92,0x92,0xF2,0x02,0x02,0x02,0x00,
  13. 0x80,0x60,0x1F,0x40,0x20,0x17,0x44,0x84,0x7C,0x04,0x04,0x17,0x20,0x40,0x00,0x00,/*"原",2*/

  14. '子',0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00,
  15. 0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"子",3*/
  16. };
  17. //{
  18. //    {'正', 0x00, 0x02, 0x02, 0xC2, 0x02, 0x02, 0x02, 0xFE, 0x82, 0x82, 0x82, 0x82, 0x82, 0x02, 0x00, 0x00,
  19. //    0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00}, /*"正",0*/

  20. //    {'点', 0x00, 0x00, 0xC0, 0x40, 0x40, 0x40, 0x7F, 0x48, 0x48, 0x48, 0x48, 0xC8, 0x08, 0x08, 0x00, 0x00,
  21. //    0x80, 0x40, 0x37, 0x04, 0x04, 0x14, 0x64, 0x04, 0x14, 0x64, 0x04, 0x07, 0x10, 0xE0, 0x00, 0x00}, /*"点",1*/

  22. //    {'原', 0x00, 0x00, 0xFE, 0x02, 0x02, 0xF2, 0x92, 0x9A, 0x96, 0x92, 0x92, 0xF2, 0x02, 0x02, 0x02, 0x00,
  23. //    0x80, 0x60, 0x1F, 0x40, 0x20, 0x17, 0x44, 0x84, 0x7C, 0x04, 0x04, 0x17, 0x20, 0x40, 0x00, 0x00}, /*"原",2*/

  24. //    {'子', 0x80, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0xE2, 0xA2, 0x92, 0x8A, 0x86, 0x82, 0x80, 0x80, 0x00,
  25. //    0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,} /*"子",3*/
  26. //};

  27. void OLED_DrawPoints(u8 x, u8 y, u8 t)
  28. {
  29.     u8 i, dat=t;

  30.     for (i = 0; i < 8; i++)
  31.     {
  32.         if (dat & 0x01)
  33.             OLED_DrawPoint(x, y++, 1);
  34.         else
  35.             OLED_DrawPoint(x, y++, 0);

  36.         dat >>= 1;
  37.     }
  38. }
  39. void OLED_Print(u8 x, u8 y, char *str)
  40. {
  41.     unsigned char i, k, t, length;
  42.     unsigned short Index = 0;
  43.     length = strlen(str);//取字符串总长
  44.     for (k = 0; k < length; k++)
  45.     {
  46.         //字符显示
  47.         if (*(str + k) <= 127)   //小于128是ASCII符号
  48.         {
  49.             OLED_ShowChar(x, y, *(str + k), 16, 1);
  50.             x += 8;//x坐标右移8
  51.         }
  52.         //中文显示
  53.         else if (*(str + k) > 127)   //大于127,为汉字,前后两个组成汉字内码
  54.         {
  55.             Index = (*(str + k) << 8) | (*(str + k + 1)); //取汉字的内码
  56.             for (i = 0; i < sizeof(zifu) / 34; i++)   //查数组    一个汉字34个字节
  57.             {
  58.                 if (Index == zifu[i].Index)
  59.                 {
  60.                     //查询到这个字
  61.                     for (t = 0; t < 16; t++)
  62.                     {
  63.                         OLED_DrawPoints(x+t, y, zifu[i].Msk[t]);
  64.                     }
  65.                     for (t = 0; t < 16; t++)
  66.                     {
  67.                         OLED_DrawPoints(x+t, y+8, zifu[i].Msk[t+16]);
  68.                     }
  69.                     x += 16;
  70.                     k += 1;     //汉字占两位,所以跳一位
  71.                 }
  72.             }
  73.         }
  74.     }
  75. }
复制代码
上面这部分代码是要添加的代码,在OLED例程上添加进去。这里我生成了正点原子四个字的字模,大家可以根据自己的需要生成字模。
这里其实完全可以根据自己字模生成的方式来进行修改,这里我生成的汉字是16x16的,而一个字节才8为,所以16个字节才显示上半个字,我是行列式,所以先显示每个字都先显示半个字,然后再回来显示下半个字。

附件放出来了,有需要的可以下载下来参考一下

实验12 OLED显示实验.zip

1.13 MB, 下载次数: 114

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

使用道具 举报

17

主题

161

帖子

0

精华

高级会员

Rank: 4

积分
955
金钱
955
注册时间
2022-7-21
在线时间
446 小时
发表于 2022-8-12 18:21:50 | 显示全部楼层
回复 支持 反对

使用道具 举报

4

主题

177

帖子

0

精华

高级会员

Rank: 4

积分
656
金钱
656
注册时间
2019-7-28
在线时间
60 小时
发表于 2022-11-9 17:57:42 | 显示全部楼层
程序最厉害的就是这部分,我一直在找高人是怎么做的,原来这里“正点”!
        //中文显示
        else if (*(str + k) > 127)   //大于127,为汉字,前后两个组成汉字内码
        {
            Index = (*(str + k) << 8) | (*(str + k + 1)); //取汉字的内码
            for (i = 0; i < sizeof(zifu) / 34; i++)   //查数组    一个汉字34个字节
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 23:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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