字库芯片学习之汉字内码

前言:

 汉字机内码,又称“汉字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

你可能感兴趣的:(其他知识点)