前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >字库芯片GT20L16S1Y使用记录

字库芯片GT20L16S1Y使用记录

作者头像
ManInRoad
发布2021-12-29 08:41:15
1.1K0
发布2021-12-29 08:41:15
举报
文章被收录于专栏:物联网思考

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口定义以及初始化
代码语言:javascript
复制
#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)
代码语言:javascript
复制
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读写
代码语言:javascript
复制
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读写
代码语言:javascript
复制
/****************************************************
说明:从字库中读数据
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读字库
代码语言:javascript
复制
/***************************************
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

代码语言:javascript
复制
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显示

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 物联网思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、芯片基本信息
  • 2、字库内容
  • 3、芯片IO说明
  • 4、芯片操作
    • 4.1、一般读取
      • 4.2、快速读取
      • 5、 点阵排列格式(竖置横排)
      • 6、代码实现
        • 6.1、IO口定义以及初始化
          • 6.2、SPI读写
            • 6.3、GT20L16S1Y读写
              • 6.4、GT20L16S1Y读字库
                • 6.5、GT20L16S1Y读写测试
                • 7、扩展
                • 8、读取字库LCD显示
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档