字库芯片学习之汉字内码
前言:
汉字机内码,又称“汉字ASCII码”,简称“内码”,指计算机内部存储,处理加工和传输汉字时所用的由0和1符号组成的代码。输入码被接受后就由汉字操作系统的“输入码转换模块”转换为机内码,与所采用的键盘输入法无关。机内码是汉字最基本的编码,不管是什么汉字系统和汉字输入方法,输入的汉字外码到机器内部都要转换成机内码,才能被存储和进行各种处理。
汉字在计算机内部其内码是唯一的,GB码的机内码为二字节长的代码。 GB码的机内码为二字节长的代码,它是在相应GB码的每个字节最高位上加“1”,即 汉字机内码=汉字国标码+8080H 例如,上述“啊”字的国标码是3021H,其汉字机内码则是B0A1H。 汉字机内码的基础是汉字国际码。 机内码:为了避免ASCII码和国标码同时使用时产生二义性问题,大部分汉字系统都采用将国标码每个字节高位置1作为汉字机内码。这样既解决了汉字机内码与西文机内码之间的二义性,又使汉字机内码与国标码具有极简单的对应关系。 汉字机内码、国标码和区位码三者之间的关系为:区位码(十进制)的两个字节分别转换为十六进制后加20H得到对应的国标码;机内码是汉字交换码(国标码)两个字节的最高位分别加1,即汉字交换码(国标码)的两个字节分别加80H得到对应的机内码;区位码(十进制)的两个字节分别转换为十六进制后加A0H得到对应的机内码。 举例:机内码位BEDF,求区位码? 有两种解法:1.BEDFH-A0A0H=1E3FH=3063D;
2.BEDFH-8080H=3E5FH(国标码),3E5FH-2020H=1E3FH=3063D.
正文:
在使用字库芯片时,用户只要知道字符的内码,就可以计算出该字符点阵在芯片中的地址,然后就可从该地址连续读出
点阵信息用于显示。
也就是说给字库芯片输入的是汉字的内码,从芯片里面输出的是字符点阵,比如 8*8点阵,8*16 点阵 15*16 点阵, 这些点阵也就是汉字显示在屏幕上的模,可以直接显示在液晶屏上。这些点阵也是一系列的二进制或者16进制组成,在没有办法显示在液晶上的时候,可以比对 在其他地方读出的点阵 二进制测试字库芯片是否正确读出数据。
字符点阵实例8*8写“王”:
11111111
00011000
00011000
11111111
00011000
00011000
00011000
11111111
那么写入芯片的字库内码怎么得到?上面已经说了,“不管是什么汉字系统和汉字输入方法,输入的汉字外码到机器内部都要转换成机内码,才能被存储和进行各种处理”,也就是会说,在程序中写入的汉字就是用汉字内码的形式存储的,只要将存储汉字的地址里的内容取出就行了,里面就是内码!!OK!现在对于字库芯片的理解已经说完。接下来就是连接设置芯片引脚什么的了,在此就不多赘述。
lcd 输入实例:
print_24 ( 0,36,"刘艳磊",0x00 );
程序范例(在字库芯片 .c 文件中):
现在使用的字库芯片是用SPI通信的,其读写代码如下:
void GT23_Write( uint32_t f )
{
uint8_t x;
uint32_t smj;
smj= ( ( READ<<24 ) | f );
for ( x=0; x<32; x++ )
{
GT_sclk0;
if ( ( smj&0x80000000 ) )
{GT_si1;}
else
{GT_si0;}
smj=smj<<1;
GT_sclk1;
}
}
uint8_t GT23_Read()
{
uint8_t x,GY23_addr=0x00,ss;
for ( x=0; x<8; x++ )
{
GT_sclk0;//下降沿
GY23_addr=GY23_addr<<1;
for(ss=0;ss<1;ss++){;};
if ( 0x04==P1_26 ) //判断数据值
{GY23_addr= (GY23_addr|0x01);}
else //写出数据值
{GY23_addr= (GY23_addr|0x00);}
GT_sclk1;
}
return GY23_addr;
}
字库芯片中字符地址计算函数:
uint32_t GT23_write_15( const char *a ) //*a为写入芯片的字,将汉字写入函数,函数会自动算出字符矩阵(模)在字库芯片里面的地址,可以用来直接显示在LCD上。
{
uint32_t Address15=0;
uint8_t MSB15,LSB15;
MSB15=*a;
a++;
LSB15=*a;
if ( MSB15 >=0xA1 && MSB15 <= 0Xa9 && LSB15 >=0xA1 )
Address15 = ( ( MSB15 - 0xA1 ) * 94 + ( LSB15 - 0xA1 ) ) *32+ BaseAdd15; //计算字符在芯片里面地址的算法
else if ( MSB15 >=0xB0 && MSB15 <= 0xF7 && LSB15 >=0xA1 )
Address15 = ( ( MSB15 - 0xB0 ) * 94 + ( LSB15 - 0xA1 ) + 846 ) *32+ BaseAdd15;//计算字符在芯片里面地址的算法
return Address15;
}
补(下面这些算法字库芯片手册里面会有的):
15X16点GB2312标准点阵字库
参数说明:
GBCode表示汉字内码。
MSB 表示汉字内码GBCode 的高8bits。
LSB 表示汉字内码GBCode 的低8bits。
Address 表示汉字或ASCII字符点阵在芯片中的字节地址。
BaseAdd:说明点阵数据在字库芯片中的起始地址。
计算方法:
BaseAdd=0x5F4C0;
if(MSB >=0xA1 && MSB <= 0Xa3 && LSB >=0xA1)//全角字符1区1部分
Address =( (MSB - 0xA1) * 94 + (LSB - 0xA1))*32+ BaseAdd;
else if(MSB ==0xA6 && LSB >=0xA1)//全角字符1区2部分
Address =( (MSB - 0xA1) * 94 + (LSB - 0xA1)-94*2 )*32+ BaseAdd;
else if(MSB ==0xA9 && LSB >=0xA1)//全角字符1区3部分
Address =( (MSB - 0xA1) * 94 + (LSB - 0xA1)-94*4 )*32+ BaseAdd;
else if(MSB >=0xB0 && MSB <= 0xF7 && LSB >=0xA1)//16点阵汉字区
Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 662)*32+ BaseAdd;
结尾:
关于对于字库芯片哪有有误的,欢迎留言!!
转载请附连接:http://blog.csdn.net/lyl494223339/article/details/7912554#reply
字库芯片学习之汉字内码相关推荐
- 高通字库芯片GT20L16S1Y驱动 0.96寸 OLED 任意显示中文
连续两个月的加班,给ODM客户生产温控器订单,今天终于顺利发货,对于工程师出身的我,终于可以对着电脑,消停几天,研究技术,分享技术了,闲话少说,直接进入正题: 半年前有个老客户介绍个中央某院的项目,我 ...
- 字库芯片GT20L16S1Y使用记录
1.芯片基本信息 16x16点阵的汉字库芯片 支持GB2312国标简体汉字(含有国家信标委合法授权).ASCII字符 排列格式为竖置横排 SPI 串行总线接口 通过字符内码计算字库在芯片中的地址 2. ...
- c语言对字库的查找程序,把已经调好的GT20L16S1Y字库芯片C语言驱动代码分享给大家。...
#include "stm8s.h" #include "GT20L16S1Y.h" #include "delay.h" /****** ...
- SPI方式读取汉字字库芯片
需求: 在液晶屏上显示指定的汉字 方案1:以带有汉字的图片形式显示 否定原因: 1)在画面展示时,会覆盖显示背景,不美观协调 2)需要先由图片格式转换成位图格式,不连贯,不方便 方案2:通过直接读取汉 ...
- stm32【GT30L32S4W字库芯片】
GT30L32S4W字库芯片调试 测试平台:STM32F103RFT6 库版本:官方标准库3.5.0版本 字库芯片:GT30L32S4W 字库标准:GB2312国标汉字,ASCII字符 点阵排列方式: ...
- 集通字库芯片GT20L16S1Y 读取字体数据
[本文发布地址https://blog.csdn.net/Stack_/article/details/120432945,未经许可不得转载,转载须注明出处] 这个字库芯片的厂家叫高通,但不是美国那个 ...
- 字库芯片介绍与使用(附STM32程序~~~)
不知道大家是否了解字库芯片(网上这方面的资料好像挺少的),今天给大家简单介绍一下字库芯片. 先举个例子,如果我们想在点阵屏或液晶屏上面显示一个88的正方形,我们该怎么做. 很简单,假设屏上面" ...
- “高通”字库芯片的使用方法
STM32+字库 "高通"字库芯片的使用方法 "高通"字库芯片的使用方法 STM32+字库 前言 一.电路设计 二.程序设计 代码如下: 整体代码部分 1.字库 ...
- 驱动字库芯片GT23L24M0140
驱动字库芯片GT23L24M0140 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN8 开发环境:MDK5.13 mcu: ...
最新文章
- docker用gpu的参数_从零开始入门 K8s | GPU 管理和 Device Plugin 工作机制
- 共享卫士2.0版设置说明
- Mac安装MySQL数据库
- 互联网1分钟 |1120
- mysql连接数紧张_Mysql 查看连接数,状态,最大并发数
- 量子计算机理论基础,所谓量子计算机,是指建立在量子力学理论基础上的计算机...
- iOS中安全结束 子线程 的方法
- xtrabackup备份mysql“ib_logfile0 is of different”错误分析
- ubuntu安装nginx及其默认目录结构
- 服务器TIME_WAIT和CLOSE_WAIT分析和解决办法
- base64原理与实现
- 计算机科学导论考试A卷试题,计算机科学导论试题A答案
- 下载新版火狐后无法同步书签_firefox无法同步书签,恢复备份文件失败的解决办法...
- PyTorch注意力机制【动手学深度学习v2】
- 最简单的让IjkPlayer自动旋转带有rotation视频的方法
- deepinV20 显卡驱动 cuda10.2+cudnn配置
- 前端vue方法导出为xsml
- 服装店如何根据自身情况使用进销存软件?
- 新旧两种方法给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y)
- 无法正常启动0xc0000142的错误