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方式。
#define ZK_CS_OUT(level) { if(level) \
{ gpio_bit_set(GPIOB,GPIO_PIN_12);} \
else \
{ gpio_bit_reset(GPIOB,GPIO_PIN_12);} \
}
#define ZK_SCK_OUT(level) { if(level) \
{ gpio_bit_set(GPIOB,GPIO_PIN_13);} \
else \
{ gpio_bit_reset(GPIOB,GPIO_PIN_13);} \
}
#define ZK_SO_OUT(level) { if(level) \
{ gpio_bit_set(GPIOB,GPIO_PIN_14);} \
else \
{ gpio_bit_reset(GPIOB,GPIO_PIN_14);} \
}
#define ZK_SI_IN() gpio_input_bit_get(GPIOB,GPIO_PIN_15)
static void GT20L16S1YIoInit(void)
{
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);
}
static void GT20L16S1YSendByte( uint32_t addr )
{
uint8_t i;
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;
}
}
static uint8_t GT20L16S1YReadByte( void )
{
uint8_t i;
uint8_t dat = 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);
}
return dat;
}
/****************************************************
说明:从字库中读数据
Address : 表示字符点阵在芯片中的字节地址。
byte_long: 是读点阵数据字节数。
*p_arr : 是保存读出的点阵数据的数组。
*****************************************************/
static void GT20L16S1YRead( uint32_t address, uint8_t byte_long, uint8_t* p_arr )
{
unsigned int j = 0;
ZK_CS_OUT(0);
GT20L16S1YSendByte( address );
for( j = 0; j < byte_long; j++ )
{
p_arr[j] = GT20L16S1YReadByte();
}
ZK_CS_OUT(1);
}
/***************************************
ASCII字符集
ASCIICode:表示ASCII 码(8bits)
BaseAdd:说明该套字库在芯片中的起始地址。
r_dat_bat: 是读点阵数据函数。
DZ_Data:是保存读出的点阵数据的数组。
***************************************/
uint8_t GT20L16S1YGetAsciiData( uint8_t ASCIICode, uint32_t BaseAdd, uint8_t* S1YDZ_Data )
{
if( ( ASCIICode >= 0x20 ) && ( ASCIICode <= 0x7e ) )
{
switch( BaseAdd )
{
case 0x3bfc0:
GT20L16S1YRead( ( ASCIICode - 0x20 ) * 8 + BaseAdd, 8, S1YDZ_Data ); //标准5X7,96个
break ;
case 0x66c0:
GT20L16S1YRead( ( ASCIICode - 0x20 ) * 8 + BaseAdd, 8, S1YDZ_Data ); //标准7X8,96个
break ;
case 0x3b7c0:
GT20L16S1YRead( ( ASCIICode - 0x20 ) * 16 + BaseAdd, 16, S1YDZ_Data ); //标准8X16,96
break ;
case 0x3cf80:
GT20L16S1YRead( ( ASCIICode - 0x20 ) * 26 + BaseAdd, 16, S1YDZ_Data ); //粗体8X16, 96
break ;
case 0x3c2c0:
GT20L16S1YRead( ( ASCIICode - 0x20 ) * 34 + BaseAdd + 2, 32, S1YDZ_Data ); //16点阵不等宽,Arial(方头),96
break ;
case 0x3d580:
GT20L16S1YRead( ( ASCIICode - 0x20 ) * 34 + BaseAdd + 2, 32, S1YDZ_Data ); //16 点阵不等宽,Times New Roman(白正),96
break ;
default:
break;
}
return 1;
}
else
{
return 0;
}
}
/***************************************************
16*16点GB2312 标准点阵字库
GBCode表示汉字内码。
MSB 表示汉字内码GBCode 的高8bits。
LSB 表示汉字内码GBCode 的低8bits。
Address 表示汉字或ASCII字符点阵在芯片中的字节地址。
BaseAdd:说明点阵数据在字库芯片中的起始地址。
r_dat_bat 是读点阵数据函数。
DZ_Data是保存读出的点阵数据的数组。
*****************************************************/
void GT20L16S1YGetGb2312Data( uint8_t MSB, uint8_t LSB, uint8_t* S1YDZ_Data )
{
uint32_t temp = ( MSB - 0xB0 ) * 94 + LSB - 0xA1;
uint32_t BaseAdd = 0, Address;
if( MSB == 0xA9 && LSB >= 0xA1 ) //GB2312 字符 ,A9区
{
Address = ( 282 + ( LSB - 0xA1 ) ) * 32 + BaseAdd;
}
else if( MSB >= 0xA1 && MSB <= 0xA3 && LSB >= 0xA1 ) //GB2312 字符 ,A1-A3区,A1-A3、A9共376个字符
{
Address = ( ( MSB - 0xA1 ) * 94 + ( LSB - 0xA1 ) ) * 32 + BaseAdd;
}
else if( 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是保存读出的点阵数据的数组。
*****************************************************/
void GT20L16S1YGetExt8x16Data( uint16_t FontCode, uint8_t* S1YDZ_Data )
{
uint32_t BaseAdd = 0x3b7d0, Address;
uint32_t temp1 = ( FontCode - 0xAAA1 );
uint32_t temp2 = ( FontCode - 0xABA1 + 95 );
if( FontCode >= 0xAAA1 && FontCode <= 0xAAFE )
{
Address = temp1 * 16 + BaseAdd;
}
else if( 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
void GT20L16S1YTest(void)
{
uint8_t zk[16];
uint8_t zk_str[32];
GT20L16S1YGetAsciiData( 'A', 0x3b7c0, zk);
for(uint8_t i=0;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