页面加载中,请稍候
来源:嵌入式大杂烩发布时间:2021-12-294389浏览
询问 AI1、芯片基本信息
16x16点阵的汉字库芯片;
支持GB2312国标简体汉字(含有国家信标委合法授权)、ASCII字符;
排列格式为竖置横排;
SPI 串行总线接口;
通过字符内码计算字库在芯片中的地址。



支持两种读取方式,一般读取(Read),快速读取(FAST_READ)。

1byte读取命令,3byte地址,后面紧跟着是芯片输出的字库数据。

1byte读取命令,3byte地址,1字节任意数据,后面紧跟着是芯片输出的字库数据。
每个汉字在芯片中是以汉字点阵字模的形式存储的,每个点用一个二进制位表示,存 1 的点, 当显示时可以在屏幕上显示亮点,存 0的点,则在屏幕上不显示。点阵排列格式为竖置横排:即一 个字节的高位表示下面的点,低位表示上面的点(如果用户按 16bit总线宽度读取点阵数据,请注意 高低字节的顺序),排满一行后再排下一行。这样把点阵信息用来直接在显示器上按上述规则显示, 则将出现对应的汉字。
一个15X16 点汉字的信息需要 32 个字节(BYTE 0 – BYTE 31)来表示,则点阵的排列顺序如下(这个与在LCD上显示的时候,写数据的顺序息息相关)
本文使用GD32F303VC读取字库,使用GPIO模拟SPI方式。
6.1、IO口定义以及初始化#defineZK_CS_OUT(level){if(level)\
{gpio_bit_set(GPIOB,GPIO_PIN_12);}\
else\
{gpio_bit_reset(GPIOB,GPIO_PIN_12);}\
}
#defineZK_SCK_OUT(level){if(level)\
{gpio_bit_set(GPIOB,GPIO_PIN_13);}\
else\
{gpio_bit_reset(GPIOB,GPIO_PIN_13);}\
}
#defineZK_SO_OUT(level){if(level)\
{gpio_bit_set(GPIOB,GPIO_PIN_14);}\
else\
{gpio_bit_reset(GPIOB,GPIO_PIN_14);}\
}
#defineZK_SI_IN()gpio_input_bit_get(GPIOB,GPIO_PIN_15)
staticvoidGT20L16S1YIoInit(void)6.2、SPI读写
{
rcu_periph_clock_enable(RCU_GPIOB);
gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14);
gpio_init(GPIOB,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_15);
}
staticvoidGT20L16S1YSendByte(uint32_taddr )6.3、GT20L16S1Y读写
{
uint8_ti;
addr addr |0x03000000;
for(i 0;i <32;i++)
{
ZK_SCK_OUT(0);
if(addr &0x80000000)
{
ZK_SO_OUT(1);
}
else
{
ZK_SO_OUT(0);
}
ZK_SCK_OUT(1);
addr addr <<1;
}
}
staticuint8_tGT20L16S1YReadByte(void)
{
uint8_ti;
uint8_tdat 0;
ZK_SCK_OUT(1);
for(i 0;i <8;i++)
{
ZK_SCK_OUT(0);
dat dat <<1;
if(ZK_SI_IN())
{
dat dat |0x01;
}
else
{
dat &=0xfe;
}
ZK_SCK_OUT(1);
}
returndat;
}
****************************************************6.4、GT20L16S1Y读字库
说明:从字库中读数据
Address :表示字符点阵在芯片中的字节地址。
byte_long:是读点阵数据字节数。
*p_arr :是保存读出的点阵数据的数组。
*****************************************************/
staticvoidGT20L16S1YRead(uint32_taddress,uint8_tbyte_long,uint8_t*p_arr )
{
unsignedintj 0;
ZK_CS_OUT(0);
GT20L16S1YSendByte(address );
for(j 0;j <byte_long;j++)
{
p_arr[j]GT20L16S1YReadByte();
}
ZK_CS_OUT(1);
}
***************************************6.5、GT20L16S1Y读写测试
ASCII字符集
ASCIICode:表示ASCII 码(8bits)
BaseAdd:说明该套字库在芯片中的起始地址。
r_dat_bat:是读点阵数据函数。
DZ_Data:是保存读出的点阵数据的数组。
***************************************/
uint8_tGT20L16S1YGetAsciiData(uint8_tASCIICode,uint32_tBaseAdd,uint8_t*S1YDZ_Data )
{
if((ASCIICode >=0x20)&&(ASCIICode <=0x7e))
{
switch(BaseAdd )
{
case0x3bfc0:
GT20L16S1YRead((ASCIICode -0x20)*8+BaseAdd,8,S1YDZ_Data );标准5X7,96个
break;
case0x66c0:
GT20L16S1YRead((ASCIICode -0x20)*8+BaseAdd,8,S1YDZ_Data );标准7X8,96个
break;
case0x3b7c0:
GT20L16S1YRead((ASCIICode -0x20)*16+BaseAdd,16,S1YDZ_Data );标准8X16,96
break;
case0x3cf80:
GT20L16S1YRead((ASCIICode -0x20)*26+BaseAdd,16,S1YDZ_Data );粗体8X16, 96
break;
case0x3c2c0:
GT20L16S1YRead((ASCIICode -0x20)*34+BaseAdd +2,32,S1YDZ_Data );16点阵不等宽,Arial(方头),96
break;
case0x3d580:
GT20L16S1YRead((ASCIICode -0x20)*34+BaseAdd +2,32,S1YDZ_Data );16 点阵不等宽,Times New Roman(白正),96
break;
default:
break;
}
return1;
}
else
{
return0;
}
}
***************************************************
16*16点GB2312 标准点阵字库
GBCode表示汉字内码。
MSB 表示汉字内码GBCode 的高8bits。
LSB 表示汉字内码GBCode 的低8bits。
Address 表示汉字或ASCII字符点阵在芯片中的字节地址。
BaseAdd:说明点阵数据在字库芯片中的起始地址。
r_dat_bat 是读点阵数据函数。
DZ_Data是保存读出的点阵数据的数组。
*****************************************************/
voidGT20L16S1YGetGb2312Data(uint8_tMSB,uint8_tLSB,uint8_t*S1YDZ_Data )
{
uint32_ttemp (MSB -0xB0)*94+LSB -0xA1;
uint32_tBaseAdd 0,Address;
if(MSB 0xA9&&LSB >=0xA1)GB2312 字符 ,A9区
{
Address (282+(LSB -0xA1))*32+BaseAdd;
}
elseif(MSB >=0xA1&&MSB <=0xA3&&LSB >=0xA1)GB2312 字符 ,A1-A3区,A1-A3、A9共376个字符
{
Address ((MSB -0xA1)*94+(LSB -0xA1))*32+BaseAdd;
}
elseif(MSB >=0xB0&&MSB <=0xF7&&LSB >=0xA1)GB2312 汉字 ,6763个
{
Address (846+temp )*32+BaseAdd;
}
GT20L16S1YRead(Address,32,S1YDZ_Data );
}
****************************************************
8*16点国际扩展字符,126个,AAA1-ABC0
BaseAdd:说明本套字库在字库芯片中的起始字节地址。
FontCode:表示字符内码(16bits).
Address:表示字符点阵在芯片中的字节地址。
r_dat_bat 是读点阵数据函数。
DZ_Data是保存读出的点阵数据的数组。
*****************************************************/
voidGT20L16S1YGetExt8x16Data(uint16_tFontCode,uint8_t*S1YDZ_Data )
{
uint32_tBaseAdd 0x3b7d0,Address;
uint32_ttemp1 (FontCode -0xAAA1);
uint32_ttemp2 (FontCode -0xABA1+95);
if(FontCode >=0xAAA1&&FontCode <=0xAAFE)
{
Address temp1 *16+BaseAdd;
}
elseif(FontCode >=0xABA1&&FontCode <=0xABC0)
{
Address temp2 *16+BaseAdd;
}
GT20L16S1YRead(Address,16,S1YDZ_Data );
}
手册给了字母“A”的字库,用于可以读取“A”的字库比对,验证驱动正确与否。
排置:Y(竖置横排)
点阵大小 8X16 字母"A"
点阵数据:00 E0 9C 82 9C E0 00 00 0F 00 00 00 00 00 0F 00
voidGT20L16S1YTest(void)
{
uint8_tzk[16];
uint8_tzk_str[32];
GT20L16S1YGetAsciiData('A',0x3b7c0,zk);
for(uint8_ti0;i<16;i++)
{
sprintf((char*)(&zk_str[3*i]),%02x",zk[i]);
}
log_debug([%s]\r\n",zk_str);
}
GB2312简体中文编码表:http://tools.jb51.net/table/gb2312

新闻来源:嵌入式大杂烩,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!

2026-06-28
2026-06-19

2026-07-07