字库芯片,了解一下!
Posted 嵌入式大杂烩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字库芯片,了解一下!相关的知识,希望对你有一定的参考价值。
来源:物联网思考
1、芯片基本信息
16x16点阵的汉字库芯片;
支持GB2312国标简体汉字(含有国家信标委合法授权)、ASCII字符;
排列格式为竖置横排;
SPI 串行总线接口;
通过字符内码计算字库在芯片中的地址。
2、字库内容
3、芯片IO说明
4、芯片操作
支持两种读取方式,一般读取(Read),快速读取(FAST_READ)。
4.1、一般读取
1byte读取命令,3byte地址,后面紧跟着是芯片输出的字库数据。
4.2、快速读取
1byte读取命令,3byte地址,1字节任意数据,后面紧跟着是芯片输出的字库数据。
5、 点阵排列格式(竖置横排)
每个汉字在芯片中是以汉字点阵字模的形式存储的,每个点用一个二进制位表示,存 1 的点, 当显示时可以在屏幕上显示亮点,存 0的点,则在屏幕上不显示。点阵排列格式为竖置横排:即一 个字节的高位表示下面的点,低位表示上面的点(如果用户按 16bit总线宽度读取点阵数据,请注意 高低字节的顺序),排满一行后再排下一行。这样把点阵信息用来直接在显示器上按上述规则显示, 则将出现对应的汉字。
一个15X16 点汉字的信息需要 32 个字节(BYTE 0 – BYTE 31)来表示,则点阵的排列顺序如下(这个与在LCD上显示的时候,写数据的顺序息息相关)
6、代码实现
本文使用GD32F303VC读取字库,使用GPIO模拟SPI方式。
6.1、IO口定义以及初始化
#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);
6.2、SPI读写
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;
6.3、GT20L16S1Y读写
/****************************************************
说明:从字库中读数据
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);
6.4、GT20L16S1Y读字库
/***************************************
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 );
6.5、GT20L16S1Y读写测试
手册给了字母“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);
7、扩展
GB2312简体中文编码表:http://tools.jb51.net/table/gb2312
8、读取字库LCD显示
——————END——————
以上是关于字库芯片,了解一下!的主要内容,如果未能解决你的问题,请参考以下文章
说说字库和字模的故事,然后在 MaixPy 里实现打印中文字体(任意字体)吧!
甜味芯片打印法了解一下:科学家用糖实现微电路曲面打印,连针尖发丝都可以 | Science...