作者smartjay (高毛毛)
看板ASM
标题[问题] 晶片address计算错误
时间Sat Dec 21 00:53:23 2013
小弟之前上篇问过SPI晶片使用方式,
在英文方面已经可以正确获得SPI传回的资料。
参考GT21L16T1W 的说明要实做big5汉字的点阵,
传址的正确位置算不出来,主要看不懂部分在程倒数第二行如下
Index = Big5Table[Big5Index*2] * 256 + Big5Table[Big5Index*2+1];
请有经验的板友提供意见,谢谢
以下为datasheet提供的计算方式
参数说明:
FontCode表示汉字内码。
MSB 表示汉字内码FontCode的高8bits。
LSB 表示汉字内码FontCode的低8bits。
Address 表示汉字点阵在芯片中的字节地址。
BaseAdd:说明点阵数据在字库芯片中的起始地址。
Big5Table:表示BIG5 索引表。表的起始地址为 0x62410
Big5Index:表示该内码汉字在BIG5 索引表中的序号。由该序号可查BIG5 索引表得出汉
字在字库中的序
号
Index:表示该字符在字库中的序号。
计算方法:BaseAdd=0x00;
if(MSB >=0xA1 && MSB <= 0XC6)
{
if(LSB >=0x40 && LSB <= 0X7E)
Big5Index =(MSB - 0xA1) * 157 + (LSB - 0x40);
else if(LSB >=0XA1 && LSB <= 0XFE)
Big5Index =(MSB - 0xA1) * 157 + 63 + (LSB - 0xA1));
}
Index = Big5Table[Big5Index*2] * 256 + Big5Table[Big5Index*2+1];
Address =Index * 32 + BaseAdd;
而小弟照着参考资料用以下方式实做
long BaseAdd=0x00;
long Address=0x00;
long big5table=0x062410;
long Big5Index=0x00;
long index=0x00;
if(MSB >= 0xA1 && MSB <= 0xC6) {
if(LSB >= 0x40 && LSB <= 0x7E){
Big5Index=( MSB -0xA1 )*157+(LSB-0x40);
}else if(LSB >= 0xA1 && LSB <= 0xFE){
Big5Index=( MSB -0xA1 )*157+63+(LSB-0xA1);
}
};
index=(big5table+Big5Index*2)*256+big5table+(Big5Index*2+1);
Address=index*32+BaseAdd;
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.254.96.92
1F:推 saxontai:hint: a * 256 跟 a << 8 等效 12/21 22:44
2F:→ smartjay:板友谢谢,这hint我还是没办法体会。 12/22 21:08
3F:→ smartjay:index=(big5table+Big5Index*2)<<8+big5table....无效 12/22 21:09
4F:→ smartjay:我的问题点在於我并不知道阵列的资料大小,所以不会计算 12/22 21:10
5F:推 saxontai:我是提示你,你看不懂的那行程式是在做把两个1byte的资料 12/23 10:17
6F:→ saxontai:凑成一个2byte的index值,例如0x12跟0x34变成0x1234这样 12/23 10:18
7F:→ saxontai:另外我概略看了一下烂烂大五码的编码规则後发现, 12/23 10:19
8F:→ saxontai:datasheet中给的范例程式应该有误。建议你补充一下Big5编 12/23 10:20
10F:→ saxontai:查了一下这颗字库IC的出品公司GENITOP,中文叫「高通」XD 12/23 10:32
11F:→ saxontai:成立时间(1983)还比Qualcomm(1985)早...WTF... XDDDD 12/23 10:32
12F:→ smartjay:了解,感谢,写给这家公司也没回覆。 12/23 14:01