字库芯片GT20L16S1Y使用记录

1、芯片基本信息

16x16点阵的汉字库芯片
支持GB2312国标简体汉字(含有国家信标委合法授权)、ASCII字符
排列格式为竖置横排
SPI 串行总线接口
通过字符内码计算字库在芯片中的地址

2、字库内容

字库芯片GT20L16S1Y使用记录_第1张图片

3、芯片IO说明

字库芯片GT20L16S1Y使用记录_第2张图片

4、芯片操作

字库芯片GT20L16S1Y使用记录_第3张图片
支持两种读取方式,一般读取(Read),快速读取(FAST_READ)。

4.1一般读取

字库芯片GT20L16S1Y使用记录_第4张图片
1byte读取命令,3byte地址,后面紧跟着是芯片输出的字库数据。

4.2快速读取

字库芯片GT20L16S1Y使用记录_第5张图片
1byte读取命令,3byte地址,1字节任意数据,后面紧跟着是芯片输出的字库数据。

5、 点阵排列格式(竖置横排)

每个汉字在芯片中是以汉字点阵字模的形式存储的,每个点用一个二进制位表示,存 1 的点, 当显示时可以在屏幕上显示亮点,存 0的点,则在屏幕上不显示。点阵排列格式为竖置横排:即一 个字节的高位表示下面的点,低位表示上面的点(如果用户按 16bit总线宽度读取点阵数据,请注意 高低字节的顺序),排满一行后再排下一行。这样把点阵信息用来直接在显示器上按上述规则显示, 则将出现对应的汉字。

一个15X16 点汉字的信息需要 32 个字节(BYTE 0 – BYTE 31)来表示,则点阵的排列顺序如下(这个与在LCD上显示的时候,写数据的顺序息息相关)
字库芯片GT20L16S1Y使用记录_第6张图片

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显示

字库芯片GT20L16S1Y使用记录_第7张图片

你可能感兴趣的:(mcu,单片机,嵌入式硬件,16X16字库,lcd字库,GT20L16S1Y)