LCD显示GBK字库里面的汉字

文章目录

    • LCD显示GBK字库里面的汉字
  • 前言
  • 一、编码规则
  • 二、使用步骤
    • 1.需烧录的字库
    • 2.转码
    • 3.函数体
    • 3.显示汉字

前言

本文介绍如何把字库文件写入单片机的flash后,在单片机程序中添加代码直接显示汉字;或者显示接收上位机发送过来的UTF_8编码规则的信息。


提示:以下是本篇文章正文内容,下面案例可供参考

一、编码规则

从网上引来一段从UNICODE到UTF8的转换规则:

UTF-8: 1~3字节可变
UNICODE: 2字节一个字符
GB2312: 2字节一个字符
例子: “你”字的UTF-8编码: E4 BD A0      11100100 10111101 10100000
“你 ”的 Unicode 编码 :    4F 60           01001111 01100000
按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000
把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。
注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。
经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。
GBK与Unicode之间并没有很明确的对应关系,因此就实用性而言还是查表法为主,另外表格平时可保存在Flash中。

二、使用步骤

1.需烧录的字库

这里不讨论怎样把字库烧录到单片机外部Flash

需要烧录单片机外部Flash的文件有GBK.FON,Unicode.bin

2.转码

把UTF_8编码转换成Unicode编码,之后根据转换成的Unicode编码查找Flash中Unicode编码与GBK编码对应表格获得GBK编码。得到显示字库中的字节偏移量即可实现单片机显示中文字符的功能。

/*
*pszBufIn:需要转换的UTF_8内码
*nBufInLen:转换长度
*pszBufOut:转换后的Unicode内码
*pnBufOutLen:转换后的Unicode内码长度
*/
int UTF_8ToUnicode(const unsigned char* pszBufIn, int nBufInLen, unsigned char* pszBufOut, int* pnBufOutLen)
{int i = 0;int j = 0;unsigned short unicode;unsigned short gbk;for(; i < nBufInLen; i++, j++){if((pszBufIn[i] & 0x80) == 0x00)       // 1位{pszBufOut[j]= pszBufIn[i];}/*    else if((pszBufIn[i] & 0xE0) == 0xC0)// 2位{nLen = 2;unicode = (pszBufIn[i] & 0x1F << 6) | (pszBufIn[i+1]& 0x3F);}*/else if ((pszBufIn[i] & 0xF0) == 0xE0) // 3位 {if (i+ 2 >= nBufInLen) return -1; unicode = (((int)(pszBufIn[i] & 0x0F)) << 12) | (((int)(pszBufIn[i+1] & 0x3F)) << 6) | (pszBufIn[i+2]  & 0x3F); Read_flash_unicode(mb_uni2gb_table,(unicode-0x4e00)*2,2);gbk = *mb_uni2gb_table;pszBufOut[j]= gbk/256;pszBufOut[j+1] = gbk%256;j++;i+=2;}else{return -1;}}*pnBufOutLen = j;return 0;
}

3.函数体

//在指定位置开始显示一个字符串
//支持自动换行
//(x,y):起始坐标
//width,height:区域
//str  :字符串
//size :字体大小
//mode:0,非叠加方式;1,叠加方式
void Show_Str_font(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint8_t*str,uint16_t fc)
{       uint16_t x0=x;uint16_t y0=y;                                uint8_t bHz=0;     //字符或者中文  while(*str!=0)//数据未结束{ if(!bHz){if(*str>0x80)bHz=1;//中文 else              //字符{      if(x>(x0+width-size/2))//换行{                 y+=size;x=x0;    }                                if(y>(y0+height-size))break;//越界返回      if(*str==13)//换行符号{         y+=size;x=x0;str++; }  else LCD_ShowChar(x,y,*str,fc);//有效部分写入                       str++; x+=size/2; //字符,为全字的一半 }}else//中文 {     bHz=0;//有汉字库    if(x>(x0+width-size))//换行{      y+=size;x=x0;          }if(y>(y0+height-size))break;//越界返回                            Show_Font(x,y,str,fc); //显示这个汉字,空心显示 str+=2; x+=size;//下一个汉字偏移     }                        }if(*str>0x80)  lcd_full_black(0,0,240,8);  }
//显示一个指定大小的汉字
//x,y :汉字的坐标
//font:汉字GBK码
//size:字体大小
//mode:0,正常显示,1,叠加显示
void Show_Font(uint16_t x,uint16_t y,uint8_t *font,uint16_t fc)
{//  uint8_t size = 24;uint8_t temp,t,t1;uint16_t y0=y;uint8_t dzk[72];   uint8_t csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数  if(size!=12&&size!=16&&size!=24)return; //不支持的sizeGet_HzMat(font,dzk);  //得到相应大小的点阵数据   //输出GPIO_Pin_Clear(U32BIT(LCD_CS));for(t=0;t<csize;t++){                                                     temp=dzk[t];            //得到点阵数据for(t1=0;t1<8;t1++){      if(temp&0x80)Gui_DrawPoint(x,y,fc);temp<<=1;y++;if((y-y0)==size){y=y0;x++;break;}}     } GPIO_Pin_Set(U32BIT(LCD_CS));
}

3.显示汉字

...........
#define Color_White     0xFFFF //白
#define Color_Red       0xF800 //红
............
int main()
{Show_St_font(0,0,240,240,“你好”,Color_White);
Show_St_font(0,40,240,240,“你好”,Color_red);while(1)
}

!


LCD显示GBK字库里面的汉字相关推荐

  1. [电子书]项目储备一: 字符编码与LCD显示单个字母/汉字

    [电子书]项目储备一: 字符编码与LCD显示单个字母/汉字 1 字符编码 2 LCD显示单个字母/汉字 2.1 编程思路 2.2 代码实现 2.3 编译.测试与bug 3 总结与下文预告 1 字符编码 ...

  2. 北邮实验:ARM实验板移植Linux操作系统,LCD显示汉字

    ARM实验板移植Linux操作系统,LCD显示汉字 一. 实验目的 1. 熟悉点阵字库的使用2. 熟悉Linux操作系统的使用3. 熟悉ARM嵌入式系统开发的过程 二. 实验内容 1. pc端编写用* ...

  3. 潘多拉开发板STM32L475之LCD与GBK(含GB2312)字体显示

    一.GBK字体的内码获取 #include <stdio.h> #include <stdint.h> int main(void) { uint8_t *str=" ...

  4. 数码相框(三、LCD显示文字)

    注:本人已购买韦东山第三期项目视频,内容来源<数码相框项目视频>,只用于学习记录,如有侵权,请联系删除.     文字在LCD上的显示其实就是LCD上的一些点的显示与不显示,这些显示的点就 ...

  5. 嵌入式linux调试dsi,做嵌入式开发时,你是怎么实现LCD显示的?

    原标题:做嵌入式开发时,你是怎么实现LCD显示的? 1.本文目的 做嵌入式图形开发,我们往往都会利用到各种GUI进行交互设计,但是对于GUI的字符串处理与中文字库显示,也许并不会特别关注,因为GUI已 ...

  6. I.MX6ULL之LCD显示

    I.MX6ULL之LCD显示 代码放在git仓库,有需要的可以自行下载:Gitee LCD的操作原理: 在Linux系统中通过Framebuffer驱动程序来控制LCD.我们只需要知道怎么获取LCD的 ...

  7. 基于单片机病房呼叫系统数码管显示房号设计-基于单片机工业生产现场的光照强度控制设计-基于单片机多功能智能台灯设计-基于单片机二维码LCD显示设计-基于单片机多功能时钟闹钟万年历控制系统设计【毕设分享】

    1641基于单片机病房呼叫系统数码管显示房号设计 设计思路:此设计实现的功能通过按键模拟房号,当按键按下时会将房号编号发送到数目管上进行显示,并通过声光进行提示.包含的电路有:数码管显示电路.按键电路 ...

  8. 基于战舰V3的LCD显示实验详解和剖析

    基于STM32的4.3寸TFTLCD的使用 在这里,我们只剖析NT35510部分的代码. LCD显示方向设置函数 代码示例 //设置LCD显示方向 //dir:0,竖屏:1,横屏 void LCD_D ...

  9. Arduino TFT_eSPI库来驱动SPI接口的LCD显示文字详解

    Arduino TFT_eSPI库来驱动SPI接口的LCD显示详解 相关库github地址:https://github.com/Bodmer/TFT_eSPI 文字显示过程详解 TFT eSPI显示 ...

  10. ESP8266-Arduino编程实例-二维码(QR Code)生成与TFT LCD显示

    二维码(QR Code)生成与TFT LCD显示 QR 码(快速响应码的缩写)是一种矩阵条码(或二维条码,由日本汽车公司 Denso Wave 于 1994 年发明.条形码是一种机器可读的光学标签,可 ...

最新文章

  1. ShaderLab学习小结(十九)RenderToCubemap创建能反射周围环境的效果
  2. redis的通用命令 || redis持久化机制:(RDB  ||  AOF)
  3. why SAP CRM object family error message is filtered out
  4. Python实现访问者模式
  5. 618物流压力怎么扛?
  6. Java的native方法java.lang.UnsatisfiedLinkError
  7. Python之网络编程(基于tcp实现远程执行命令)
  8. 数据--第28课 - 进阶星移
  9. python 新手常见问题
  10. 迪兰RX550超能4G,这玩意儿居然可以开核?!!
  11. 北、上、广、深数据分析职位分析
  12. 【前端开发】:行间距和首行缩进
  13. 【前端笔记】Ant Design Form组件 resetFields() 与 setFieldsValue() 之比较
  14. golang实现稀疏数组(Sparse array)
  15. HTML5 新增标签
  16. FCM公式详细推及代码
  17. java图片压缩工具类
  18. 通过Url访问服务器的文件
  19. 海关179对接微信/支付宝/通联支付及报关
  20. iPhone开发入门(1)----程序员眼中的iPhone

热门文章

  1. 考研高等数学张宇30讲笔记——第八讲 一元函数积分学的概念与计算
  2. Java 通过银行卡号获取银行名称
  3. ojdbc14.jar 和mysql_Oracle数据库的驱动包ojdbc*.jar之间的差别
  4. 离散数学 习题篇 —— 关系的性质
  5. noip2017提高组初赛(答案+选择题题目+个人分析)
  6. 4019 设备树 Linux device tree 概述
  7. 深度学习面试基础--BN层
  8. secoclient全版本下载分享
  9. java两天速成_JAVA速成
  10. 【交换机在江湖】第十五章 VLAN隔离篇