GT20L16S1Y字库IC驱动
/**
* @file GT20L16S1Y.c
*
* @date 2020-7-7
*
* @author aron566
*
* @copyright None
*
* @brief GD20L16S1Y字库驱动
*
* @details --
*
* @version V1.0
*/
#ifdef __cplusplus ///<use C compiler
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 ///<end extern c
}
#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 ///<use C compiler
extern "C" {
#endif
/** Includes -----------------------------------------------------------------*/
#include <stdint.h> /**< need definition of uint8_t */
#include <stddef.h> /**< need definition of NULL */
//#include <stdbool.h>/**< need definition of BOOL */
#include <stdio.h> /**< if need printf */
#include <stdlib.h>
#include <string.h>
/** 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 ///<end extern c
}
#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。