1.字符编码

由于计算机只能识别 0 和 1,文字也只能以 0 和 1 的形式在计算机里存储,所以我们需要对文字进行编码才能让计算机处理,编码的过程就是规定特定的 01 数字串表示特定的文字,最简单的字符编码例子是 ASCII 码。

2.中文编码

(1).GB2312 标准

当我们设定系统使用 GB2312 标准的时候,它遇到一个字符串时,会按字节检测字符值的大小,若遇到连续两个字节的数值都大于 127 时就把这两个连续的字节合在一起,用 GB2312 解码,若遇到的数值小于 127,就直接用 ASCII 把它解码。



区位码

在 GB2312 编码的实际使用中,有时会用到区位码的概念,见图 28-1。 GB2312 编码对所收录字符进行了“分区”处理,共 94 个区,每区含有 94 个位,共 8836 个码位。 而区位码实际是 GB2312 编码的内部形式,它规定对收录的每个字符采用两个字节表示,第一个字节为“高字节”,对应 94 个区;第二个字节为“低字节”,对应 94 个位。所以它的区位码范围是: 0101-9494。为兼容 ASCII 码,区号和位号分别加上 0xA0 偏移就得到GB2312 编码。在区位码上加上 0xA0 偏移,可求得 GB2312 编码范围: 0xA1A1-0xFEFE,其中汉字的编码范围为 0xB0A1-0xF7FE,第一字节 0xB0-0xF7(对应区号: 16-87),第二个字节 0xA1-0xFE(对应位号: 0194)。

例如,“啊”字是 GB2312 编码中的第一个汉字,它位于 16 区的 01 位,所以它的区

位码就是 1601,加上 0xA0 偏移,其 GB2312 编码为 0xB0A1。其中区位码为 0101 的码位表示的是“空格”符。

(2).GBK 编码

(3).GB18030

(4).Big5 编码

3.Unicode 字符集和编码

(1).UTF-32

(2).UTF-16

(3).UTF-8

4.BOM

5.字模

如果仅有字符编码,计算机还不知道该如何表达该字符,因为字符实际上是一个个独特的图形,计算机必须把字符编码转化成对应的字符图形人类才能正常识别,因此我们要给计算机提供字符的图形数据,这些数据就是字模,多个字模数据组成的文件也被称为字库。计算机显示字符时,根据字符编码与字模数据的映射关系找到它相应的字模数据,液晶屏根据字模数据显示该字符。

(1).字模的构成

已知字模是图形数据,而图形在计算机中是由一个个像素点组成的,所以字模实质是一个个像素点数据。为方便处理,我们把字模定义成方块形的像素点阵,且每个像素点只有 0 和 1 这两种状态(可以理解为单色图像数据)。

(2).字模显示原理

如果使用 LCD 的画点函数,按位来扫描这些字模数据,把为 1 的位以黑色来显示(也可以使用其它颜色),为 0 的数据位以白色来显示,即可把整个点阵还原出来,显示在液晶屏上。

/* 当(0)字模数据
*/
//24*24
uint8_t charater[] =
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x0C,0x18,0x70,0x06,0x18,0x60,0x03,0x18,0x80,0x01,0x19,0x00,
0x00,0x1A,0x00,0x00,0x18,0x08,0x1F,0xFF,0xFC,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x0F,0xFF,0xF8,
0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x1F,0xFF,0xF8,0x00,0x00,0x18,0x00,0x00,0x00};/*"当",0*/ //x和y为汉字显示的起始坐标,charater为汉字的gb2312编码
void dis_charater(uint16_t x, uint16_t y, uint16_t charater) //读取出Flash存储的字模代表的汉字,并显示在液晶上;
{
uint8_t i,j ; uint32_t *p = (uint32_t *)(LCD_LAYER2_START_ADDR + x*4+(y*LCD_WIDTH*4) ); for(i=0;i<24;i++) //扫描N行
{
//扫描一行内的第一个字节数据
for(j=0;j<8;j++) //扫描各个像素点
{
if(((charater [3*i] << j )&0x80) ) //如果运算结果为非0值,表示像素点有笔迹,为0表示空白
//printf("*"); //笔迹像素点,输出*号
*p = 0xFFFF0000; //笔迹像素点,输出红色 else
//printf(" "); //空白像素点,输出空格
*p = 0xFF000000; //笔迹像素点,输出黑色 p++; //指向下一个像素点的显存空间
} //扫描一行内的第二个字节数据
for(j=0;j<8;j++) //扫描各个像素点
{
if(((charater [3*i+1] << j )&0x80) ) //如果运算结果为非0值,表示像素点有笔迹,为0表示空白
//printf("*"); //笔迹像素点,输出*号
*p = 0xFFFF0000; //笔迹像素点,输出红色
else
//printf(" "); //空白像素点,输出空格
*p = 0xFF000000; //笔迹像素点,输出黑色 p++; //指向下一个像素点的显存空间
} //扫描一行内的第三个字节数据
for(j=0;j<8;j++) //扫描各个像素点
{
if(((charater [3*i+2] << j )&0x80) ) //如果运算结果为非0值,表示像素点有笔迹,为0表示空白
//printf("*"); //笔迹像素点,输出*号
*p = 0xFFFF0000; //笔迹像素点,输出红色
else
//printf(" "); //空白像素点,输出空格
*p = 0xFF000000; //笔迹像素点,输出黑色 p++; //指向下一个像素点的显存空间 } } }

(3).字模寻址公式

Addr = (((CodeH-0xA0-1)*94) +(CodeL-0xA0-1))*24*24/8

每个字模的大小为 24x24/8=72 字节,需要根据字体大小修改。

6.直接显示汉字在LED上

因为KEIL5设置为GB2312编码,所以字符串的格式在KEIL中是GB2312编码的格式存储!

uint8_t charater_data_buffer[72]={0};

//GetCharaterData(charater_data_buffer,0xBABA); 'C'  \0
void GetCharaterData(uint8_t *pBuffer,uint16_t charater) //读取出Flash存储的字模代表的汉字
{
uint8_t CodeH,CodeL;
uint32_t Addr; CodeH = (charater&0xFF00)>>8;
CodeL = (charater&0x00FF); //字模数据在文件中的偏移地址
Addr = (((CodeH-0xA0-1)*94) +(CodeL-0xA0-1))*24*24/8 ; //加上文件在SPI FLASH的地址偏移
Addr += 1360*4096; //从字模的spi flash存储空间中读出字模数据
SPI_FLASH_BufferRead(pBuffer,Addr,24*24/8); } /* 当(0)字模数据
*/
//24*24
uint8_t charater[] =
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x0C,0x18,0x70,0x06,0x18,0x60,0x03,0x18,0x80,0x01,0x19,0x00,
0x00,0x1A,0x00,0x00,0x18,0x08,0x1F,0xFF,0xFC,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x0F,0xFF,0xF8,
0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x1F,0xFF,0xF8,0x00,0x00,0x18,0x00,0x00,0x00};/*"当",0*/ //x和y为汉字显示的起始坐标,charater为汉字的gb2312编码
void dis_charater(uint16_t x, uint16_t y, uint16_t charater) //读取出Flash存储的字模代表的汉字,并显示在液晶上;
{
uint8_t i,j ; GetCharaterData(charater_data_buffer,charater); //读取出Flash存储的字模代表的汉字, uint32_t *p = (uint32_t *)(LCD_LAYER2_START_ADDR + x*4+(y*LCD_WIDTH*4) ); for(i=0;i<24;i++) //扫描N行
{
//扫描一行内的第一个字节数据
for(j=0;j<8;j++) //扫描各个像素点
{
if(((charater_data_buffer[3*i] << j )&0x80) ) //如果运算结果为非0值,表示像素点有笔迹,为0表示空白
//printf("*"); //笔迹像素点,输出*号
*p = 0xFFFF0000; //笔迹像素点,输出红色 else
//printf(" "); //空白像素点,输出空格
*p = 0xFF000000; //笔迹像素点,输出黑色 p++; //指向下一个像素点的显存空间
} //扫描一行内的第二个字节数据
for(j=0;j<8;j++) //扫描各个像素点
{
if(((charater_data_buffer[3*i+1] << j )&0x80) ) //如果运算结果为非0值,表示像素点有笔迹,为0表示空白
//printf("*"); //笔迹像素点,输出*号
*p = 0xFFFF0000; //笔迹像素点,输出红色
else
//printf(" "); //空白像素点,输出空格
*p = 0xFF000000; //笔迹像素点,输出黑色 p++; //指向下一个像素点的显存空间
} //扫描一行内的第三个字节数据
for(j=0;j<8;j++) //扫描各个像素点
{
if(((charater_data_buffer[3*i+2] << j )&0x80) ) //如果运算结果为非0值,表示像素点有笔迹,为0表示空白
//printf("*"); //笔迹像素点,输出*号
*p = 0xFFFF0000; //笔迹像素点,输出红色
else
//printf(" "); //空白像素点,输出空格
*p = 0xFF000000; //笔迹像素点,输出黑色 p++; //指向下一个像素点的显存空间 } p += (LCD_WIDTH-24); //指向下一行字模矩阵所在的显存空间
//printf("\n");
}
} //dis_string("汉字演示") // 0xBABA 0xXXXX 0xXXXX 0xXXXX\0
void dis_string(uint16_t x, uint16_t y,char *pString) //获取到GB2312的编码
{
uint16_t charater;
uint16_t x_dis = x; while(*pString != '\0')
{
charater = *(uint16_t *)pString ;
charater = ((charater&0x00FF) <<8) | ((charater&0xFF00) >>8); dis_charater(x_dis,y,charater); x_dis += 24; pString += 2;
}
}

28-1-LTDC显示中英文的更多相关文章

  1. 第28章 LTDC—液晶显示中英文—零死角玩转STM32-F429系列

    第28章     LTDC—液晶显示中英文 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  2. 第28章 LTDC—液晶显示中英文

    本章参考资料:<STM32F76xxx参考手册>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>. 关于开发板配 ...

  3. powderdesinger显示中英文表名

     菜单->Tool->Model Options->Name Convention->右侧display中选择显示name还是code.不支持同时显示,但可以选择显示code, ...

  4. 修改 cmd 控制台字体、巧用 FontLink 使中英文独立设置

    众所周知,Windows 中 cmd 控制台窗口的字体难看,但是修改注册表是可以实现修改其字体的,但很多很棒的编程字体是没有中文的,所以在显示中文时直接调用了宋体,这绝妙的反差实在是 不忍直视.但是, ...

  5. IE 浏览器中英文切换

    Oracle相关产品浏览器中可以调节显示中英文

  6. Linux命令应用大词典-第28章 硬件管理

    28.1 lscpu:显示有关CPU架构的信息 28.2 nproc:显示当前进程可用的CPU数目 28.3 chcpu:配置CPU

  7. TI IPNC Web网页之流程分析

    流程 Appro IPNC使用的web服务器是boa. 请仔细理解下面这段话. boa这个web服务器是GUI界面和IPNC应用程序之间的通信的桥梁.它的责任是从web GUI中接收HTTP请求,并且 ...

  8. web前端开发中的浏览器兼容性总结

    1.居中问题 div里的内容,IE默认为居中,而FF默认为左对齐,可以尝试增加代码margin: 0 auto; 2.高度问题 两上下排列或嵌套的div,上面的div设置高度(height),如果di ...

  9. 【web前端开发】浏览器兼容性处理

    1.居中问题div里的内容,IE默认为居中,而FF默认为左对齐,可以尝试增加代码margin: 0 auto;2.高度问题两上下排列或嵌套的div,上面的div设置高度(height),如果div里的 ...

随机推荐

  1. Linux下搭建LAMP环境(YUM)

    安装Apache 1.安装Apache yum -y install httpd 2. Apache配置httpd.conf 通过命令 find / -name httpd.conf 找到Apache ...

  2. Cisco VLAN ACL配置

    什么是ACL? ACL全称访问控制列表(Access Control List),主要通过配置一组规则进行过滤路由器或交换机接口进出的数据包, 是控制访问的一种网络技术手段, ACL适用于所有的被路由 ...

  3. linux mysql卸载

    卸载mysql 1.查找以前是否装有mysql 命令:rpm -qa|grep -i mysql 可以看到mysql的包: mysql-libs-5.1.71-1.el6.x86_64 2.删除mys ...

  4. js - 常用功能方法汇总(updating...)

    一.查值的类型(可用于拷贝) /* * @Author: guojufeng@ * @Date: 2017-12-20 15:07:06 * @purpose 获取一个值的类型 * @param {v ...

  5. NLP入门资料

    <统计自然语言处理> 一些基础理论概念,涉及统计自然语言处理的基本概念.理论方法和新研究进展,内容包括形式语言与自动机及其在自然语言处理中的应用.语言模型.隐马尔可夫模型.语料库技术.汉语 ...

  6. Spring的标签和验证等模块

    使用了spring,真的可以简化很多开发,但前提是你懂spring技术,并且环境,架包没错. 今天编写了登录验证的模块,但是就是验证不了,不知道哪里出错了,但是也不好改错,这样还是很费时间的. 错误提 ...

  7. 在数组中寻找和为定值的n个数

    /*-------------------------------------------------------*/ /*寻找和为定值的两个数 输入一个数组A[0,N-1]和一个数字Sum,在数组中 ...

  8. Code first 数据迁移

    前段时间用到了EF,整理一下 EF ,全称Entity FramWork.就是微软以ADO.NET为基础发展的所谓ORM(对象关系映射框架,或者说是数据持久化框架). 简单说就是根据实体对象操作数据库 ...

  9. nginx启用TCP反向代理日志配置

    Nginx使用TCP反向代理日志配置不同于http 修改nginx配置文档/usr/local/nginx/conf/nginx.conf 设置日志格式 stream { log_format pro ...

  10. 怎样将M4A音频格式转换成MP3格式

    因为MP3音频格式应用的广泛性,所以很多时候我们都需要将不同的音频格式转换成MP3格式的,那么如果我们需要将M4A音频格式转换成MP3格式,我们应该怎样进行实现呢?下面我们就一起来看一下吧. 操作步骤 ...