GT20L16S1Y字库IC驱动

GT20L16S1Y字库IC驱动

/**
 *  @file GT20L16S1Y.c
 *
 *  @date 2020-7-7
 *
 *  @author aron566
 *
 *  @copyright None
 *
 *  @brief GD20L16S1Y字库驱动
 *
 *  @details --
 *
 *  @version V1.0
 */
#ifdef __cplusplus ///
extern "C" {
#endif
/** Includes -----------------------------------------------------------------*/
/* Private includes ----------------------------------------------------------*/
#include "GT20L16S1Y.h"
/** Private typedef ----------------------------------------------------------*/

/** Private macros -----------------------------------------------------------*/

/** Private constants --------------------------------------------------------*/
/** Public variables ---------------------------------------------------------*/
/** Private variables --------------------------------------------------------*/

/** Private function prototypes ----------------------------------------------*/

/** Private user code --------------------------------------------------------*/
static void S1Y_SendByte(uint32_t cmd);
static uint8_t S1Y_ReadByte(void);
static uint8_t S1Y_ReadDataToBuf(uint32_t address ,uint8_t byte_long ,uint8_t *p_arr);
/** Private application code -------------------------------------------------*/
/*******************************************************************************
*
*       Static code
*
********************************************************************************
*/
/**
  ******************************************************************
	* @brief   从GT20字库中读数据
  * @param   [in]address字符点阵在芯片中的字节地址
  * @param   [in]byte_long读点阵数据字节数
  * @param   [in]p_arr保存读出的点阵数据的数组
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-7
  ******************************************************************
  */
static uint8_t S1Y_ReadDataToBuf(uint32_t address ,uint8_t byte_long ,uint8_t *p_arr)
{
    unsigned int j=0;
    S1Y_CS_L;
    S1Y_SendByte(address);
    for(j=0;j<byte_long;j++)
    {
      p_arr[j]=S1Y_ReadByte();
    }
    S1Y_CS_H;
    return p_arr[0];	
}

/**
  ******************************************************************
	* @brief   GT20 SPI发送一个字节
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-7
  ******************************************************************
  */
static void S1Y_SendByte(uint32_t cmd)
{
	uint8_t i;
	cmd=cmd|0x03000000;
	for(i=0;i<32;i++)
	{
		S1Y_CLK_L;
		if(cmd&0x80000000)
		{
			S1Y_SI_H;
		}
		else 
		{
			S1Y_SI_L;
		}
		S1Y_CLK_H;
		cmd=cmd<<1;
	}					
}

/**
  ******************************************************************
	* @brief   GT20 SPI读取一个字节
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-7
  ******************************************************************
  */
static uint8_t S1Y_ReadByte(void)
{
      uint8_t i;
      uint8_t dat=0;
      S1Y_CLK_H;
      for(i=0;i<8;i++)
      {
        S1Y_CLK_L;
        dat=dat<<1;
        if(S1Y_SO)
				{
          dat=dat|0x01;
				}
        else
				{
          dat&=0xFE;
				}
        S1Y_CLK_H	;		
      }	
      return dat;
}
/** Public application code --------------------------------------------------*/
/*******************************************************************************
*
*       Public code
*
********************************************************************************
*/
/**
  ******************************************************************
  * @brief   GT20初始化
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-7
  ******************************************************************
  */
void GT20_init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure = {0};

	/* enable the GPIOE clock */
    rcu_periph_clock_enable(RCU_GPIOE);

	/*配置 cs clk mosi为输出模式*/
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT;
	GPIO_InitStructure.Pin = GT20_MOSI_Pin|GT20_CS_Pin|GT20_CLK_Pin;
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
	GPIO_InitStructure.Pull = GPIO_NOPULL;
    GPIO_InitStructure.OutMode = GPIO_MODE_OUTPUT_PP;/*推挽输出模式*/
	HAL_GPIO_Init(GPIOE ,&GPIO_InitStructure);
	
	HAL_GPIO_WritePin(GT20_MOSI_Port ,GT20_MOSI_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GT20_CS_Port ,GT20_CS_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GT20_CLK_Port ,GT20_CLK_Pin, GPIO_PIN_SET);

	/*配置 miso为输入模式*/
	GPIO_InitStructure.Pin = GT20_MISO_Pin;
	GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
	HAL_GPIO_Init(GPIOE ,&GPIO_InitStructure);
}

/**
  ******************************************************************
  * @brief   ASCII 调用
  * @param   [in]ASCIICode:ASCII 码(8bits)
  * @param   [in]BaseAdd:说明该套字库在芯片中的起始地址
  * @param   [in]DZ_Data是保存读出的点阵数据的数组
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-7
  ******************************************************************
  */
uint8_t S1Y_ASCII_GetData(uint8_t ASCIICode ,uint32_t BaseAdd ,uint8_t *S1YDZ_Data)
{
	if((ASCIICode >= 0x20)&&(ASCIICode<=0x7E))
	{	
		switch(BaseAdd)
		{
			case 0x3bfc0:
				/*读点阵数据*/
				S1Y_ReadDataToBuf((ASCIICode-0x20)*8+BaseAdd,8,S1YDZ_Data); //5X7
				break;
			case 0x66c0:
				/*读点阵数据*/
				S1Y_ReadDataToBuf((ASCIICode-0x20)*8+BaseAdd,8,S1YDZ_Data); //7X8
				break;
			case 0x3b7c0:
				/*读点阵数据*/
				S1Y_ReadDataToBuf((ASCIICode-0x20)*16+BaseAdd,16,S1YDZ_Data); //8X16 A
				break;
			case 0x3cf80:
				/*读点阵数据*/
				S1Y_ReadDataToBuf((ASCIICode-0x20)*26+BaseAdd,16,S1YDZ_Data); //8X16 F
				break;
			case 0x3c2c0:
				/*读点阵数据*/
				S1Y_ReadDataToBuf((ASCIICode-0x20)*34+BaseAdd+2,32,S1YDZ_Data); //16X16 Arial
				break;
			case 0x3d580:
				/*读点阵数据*/
				S1Y_ReadDataToBuf((ASCIICode-0x20)*34+BaseAdd+2,32,S1YDZ_Data);//16X16 T
				break;
			default:
				break;
		}
		return 1;
	}
	else  
	{
		return 0;
	}
}

/**
  ******************************************************************
  * @brief   16 点GB2312 标准点阵字库
  * @param   [in]MSB 表示汉字内码GBCode 的高8bits
  * @param   [in]LSB 表示汉字内码GBCode 的低8bits
  * @param   [in]DZ_Data是保存读出的点阵数据的数组
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-7
  ******************************************************************
  */
void S1Y_gt16_GetData (uint8_t MSB ,uint8_t LSB ,uint8_t *S1YDZ_Data)
{
  	uint32_t temp=(MSB-0xB0)*94+LSB-0xA1;
	/*BaseAdd点阵数据在字库芯片中的起始地址*/
  	uint32_t BaseAdd=0,Address;
	
  	if(MSB == 0xA9 && LSB >=0xA1)
	{
		/*Address 表示汉字或ASCII字符点阵在芯片中的字节地址*/
		Address = (282 + (LSB - 0xA1))*32+BaseAdd;
	}
  	else if(MSB >=0xA1 && MSB <= 0xA3 && LSB >=0xA1)
	{
		Address =( (MSB - 0xA1) * 94 + (LSB - 0xA1))*32+ BaseAdd;
	}		
  	else if(MSB >=0xB0 && MSB <= 0xF7 && LSB >=0xA1)
	{
		Address = (846+temp)*32+ BaseAdd;
	}
	
	/*读点阵数据*/
  	S1Y_ReadDataToBuf(Address,32,S1YDZ_Data);
}
//Address=((MSB-0xB0)*94+(LSB-0xA1)+846)*32+BaseAdd;

/**
  ******************************************************************
  * @brief   8X16 点国标扩展字符
  * @param   [in]FontCode:表示字符内码(16bits)
  * @param   [in]DZ_Data是保存读出的点阵数据的数组
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-7
  ******************************************************************
  */
void S1Y_GB_EXT_816(uint16_t FontCode ,uint8_t *S1YDZ_Data)
{
	/*BaseAdd字库在字库芯片中的起始字节地址*/
    uint32_t BaseAdd=0x3b7d0,Address;
    uint32_t temp1=(FontCode-0xAAA1 );
    uint32_t temp2=(FontCode-0xABA1+95);
	
    if (FontCode>= 0xAAA1 && FontCode<=0xAAFE)
	{
		/*Address字符点阵在芯片中的字节地址*/
		Address = temp1*16+BaseAdd;
	}
    else if(FontCode>= 0xABA1&&FontCode<=0xABC0)
	{
		/*Address字符点阵在芯片中的字节地址*/
		Address = temp2*16+BaseAdd;
	}
		
	/*读点阵数据*/
    S1Y_ReadDataToBuf(Address ,16 ,S1YDZ_Data);
}
#ifdef __cplusplus ///
}
#endif

  • API接口文件
    GT20L16S1Y.h
/**
 *  @file GT20L16S1Y.h
 *
 *  @date 2020-7-7
 *
 *  @author aron566
 *
 *  @brief GD20L16S1Y字库驱动
 *  
 *  @version V1.0
 */
#ifndef _GT20L16S1Y_H_
#define _GT20L16S1Y_H_
#ifdef __cplusplus ///
extern "C" {
#endif
/** Includes -----------------------------------------------------------------*/
#include  /**< need definition of uint8_t */
#include  /**< need definition of NULL    */
//#include /**< need definition of BOOL    */
#include   /**< if need printf             */
#include 
#include 
/** Private includes ---------------------------------------------------------*/
#include "main.h"
/** Private defines ----------------------------------------------------------*/
#define S1Y_CLK_L   HAL_GPIO_WritePin(GT20_CLK_Port, GT20_CLK_Pin ,GPIO_PIN_RESET)   /**< SCLK LOW*/
#define S1Y_CLK_H   HAL_GPIO_WritePin(GT20_CLK_Port, GT20_CLK_Pin ,GPIO_PIN_SET)     /**< SCLK HI*/

#define S1Y_CS_L    HAL_GPIO_WritePin(GT20_CS_Port, GT20_CS_Pin ,GPIO_PIN_RESET)   /**< CS LOW*/
#define S1Y_CS_H    HAL_GPIO_WritePin(GT20_CS_Port, GT20_CS_Pin ,GPIO_PIN_SET)     /**< CS HI*/

#define S1Y_SI_L    HAL_GPIO_WritePin(GT20_MOSI_Port, GT20_MOSI_Pin ,GPIO_PIN_RESET)   /**< SI LOW*/
#define S1Y_SI_H    HAL_GPIO_WritePin(GT20_MOSI_Port, GT20_MOSI_Pin ,GPIO_PIN_SET)     /**< SI HI*/

#define S1Y_SO      HAL_GPIO_ReadPin(GT20_MISO_Port, GT20_MISO_Pin)  /**< MO READ*/
/** Exported typedefines -----------------------------------------------------*/

/** Exported constants -------------------------------------------------------*/

/** Exported macros-----------------------------------------------------------*/
/** Exported variables -------------------------------------------------------*/
/** Exported functions prototypes --------------------------------------------*/
void GT20_init(void); 
uint8_t  S1Y_ASCII_GetData(uint8_t ASCIICode,uint32_t BaseAdd,uint8_t *S1YDZ_Data);
void S1Y_gt16_GetData (uint8_t MSB,uint8_t LSB,uint8_t *S1YDZ_Data);
void S1Y_GB_EXT_816(uint16_t FontCode,uint8_t *S1YDZ_Data);
#ifdef __cplusplus ///
}
#endif
#endif
/******************************** End of file *********************************/


GB2312字符集及其编码

等计算机传到中国来,一个字节(一个字节是8位,共可以表达2^8 =256个字符)的所有编码已经用完,没有可以使用的编码来表示汉字了,而且一个字节不能表示6000多个常用的汉字,所以汉字就需要2个字节来表示。

第一个字节从编号0到编号127的字符不变,还是表示ASCII,而之后的0xA1到0xFE用于汉字编码,这个字节被称为汉字的区号或者高位字节,0xA1到0xFE换算成区号就是从01区到94区(换算关系就是对编码值减去0xA0)。

第二个字节的0xA1到0xFE用于汉字编码,这个字节被称为汉字的位号或者低位字节,0xA1到0xFE换算成位号就是从位号01到位号94(换算关系就是对编码值减去0xA0)。根据区号和位号的设置,那么就有94*94 = 8836个编码可供使用。在这些编码里,我们还把数学符号、罗马希腊字母、日文的假名都编码进去了,连在 ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,即全角字符,而原来在127号之前的那些字符称为半角字符。

由这些编码组成的字符,我们为其取了一个名字叫GB2312,GB2312是对ASCII字符集的简体中文扩展,这个就是GB2312的由来。GB2312编码全称《信息交换用汉字编码字符集——基本集》,由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是GB 2312—1980。

GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆,新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。基本集共收入汉字6763个以及非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。其中,这94个区的分配如下:

01-09区为特殊全角符号共682个

16-55区为一级汉字共3755个,按音序排

56-87区为二级汉字共3008个,按部首/笔画排序

10-15区和88-94区共13个区暂未编码

区位码和汉字编码:

为了编码兼容ASCII码且机内存储不与ASCII码冲突,GB2312并不直接使用0x0101-0x5E5E(区位码)对字符进行表示和存储,而是使用实际的编码范围0XA1A1到0XFEFE。例如“啊”字在大多数程序中,会以两个字节0xB0A1储存。而区位码就是0x1001,他们之间的关系就是高位字节和低位字节都差0xA0。0xB0 - 0x10 = 0xA0,0xA1 - 0x01 = 0xA0。

你可能感兴趣的:(芯片驱动)