新手使用字库芯片(如GT23L32S4W),表示对数据手册中汉字地址计算有疑惑,计算公式如:
函数:unsigned long gt(unsigned char c1, unsigned char c2, unsigned char c3, unsigned char c4)
功能:计算汉字点阵在芯片中的地址
参数: c1,c2,c3,c4: 4 字节汉字内码通过参数 c1,c2,c3,c4 传入,双字节内码通过参数 c1,c2 传入, c3=0,c4=0
返回:汉字点阵的字节地址(byte address)。如果用户是按 word mode 读取点阵数据,则其地址(word
address)为字节地址除以 2,即:word address = byte address / 2 .
例如:BaseAdd: 说明汉字点阵数据在字库芯片中的起始地址,即 BaseAdd=0x0000;
“啊”字的内码为 0xb0a1,则 byte address = gt(0xb0,0xa1,0x00,0x00) *24+BaseAdd
word address = byte address / 2
“ ”字的内码为 0x8139ee39,则 byte address = gt(0x81,0x39,0xee,0x39) *24+ BaseAdd
word address = byte address / 2
****************************************************************************************************/
static uint32_t gt(uint8_t c1, uint8_t c2, uint8_t c3, uint8_t c4)
{
uint32_t h=0;
if(c2==0x7f)
{
return (h);
}
if(c1>=0xA1 && c1 <= 0Xa9 && c2>=0xa1) //Section 1
{
h= (c1 - 0xA1) * 94 + (c2 - 0xA1);
}
else if(c1>=0xa8 && c1 <= 0xa9 && c2<0xa1) //Section 5
{
if(c2>0x7f)
c2--;
h=(c1-0xa8)*96 + (c2-0x40)+846;
}
if(c1>=0xb0 && c1 <= 0xf7 && c2>=0xa1) //Section 2
{
h= (c1 - 0xB0) * 94 + (c2 - 0xA1)+1038;
}
else if(c1<0xa1 && c1>=0x81 && c2>=0x40 ) //Section 3
{
if(c2>0x7f)
c2--;
h=(c1-0x81)*190 + (c2-0x40) + 1038 +6768;
}
else if(c1>=0xaa && c2<0xa1) //Section 4
{
if(c2>0x7f)
c2--;
h=(c1-0xaa)*96 + (c2-0x40) + 1038 +12848;
}
else if(c1==0x81 && c2>=0x39) //四字节区 1
{
h =1038 + 21008+(c3-0xEE)*10+c4-0x39;
}
else if(c1==0x82)//四字节区 2
{
h =1038 + 21008+161+(c2-0x30)*1260+(c3-0x81)*10+c4-0x30;
}
return(h);
}
对于这个汉字内码,如何获取,甚是不解?望大神不吝赐教! (总不会用取内码软件,去的汉字内码,然后封装在一个数组里,需要显示就去调用数组?) |