驱动字库芯片GT23L24M0140

来源:互联网 发布:奇葩淘宝收货人姓名 编辑:程序博客网 时间:2024/05/18 03:59


驱动字库芯片GT23L24M0140


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

主机:WIN8

开发环境:MDK5.13

mcu: stm32f407VGIGH6

字库芯片:GT23L24M0140


说明:

GT23L24M0140是一款支持GB18030标准的字库芯片,有多种大小的字体可供选择。

本文驱动了其中常用的字体。


源代码:

drv_font.h

/**********************************************************************  字库芯片驱动层头文件*(c)copyright 2013,jdh*  All Right Reserved*新建日期:2015/2/2 by jdh*修改日期:2015/2/3 by jdh**********************************************************************//*********************************************************************硬件连接说明电路标号单片机引脚特殊功能SPI1_NSS         PA4SPI1_NSS     SPI1_MISOPA6SPI1_MISOSPI1_MOSIPA7SPI1_MOSISPI1_SCKPA5SPI1_SCK**********************************************************************/#ifndef _DRV_FONT_H_#define _DRV_FONT_H_/**********************************************************************头文件**********************************************************************/#include "stm32f4xx.h"/**********************************************************************函数**********************************************************************//**********************************************************************初始化字库芯片**********************************************************************/void drv_font_init(void);/**********************************************************************打开SPI使能**********************************************************************/void drv_font_enable(void);/**********************************************************************关闭SPI使能**********************************************************************/void drv_font_disable(void);/**********************************************************************spi发送一个字节*参数:dat:数据*返回:spi接收到的字节**********************************************************************/uint8_t drv_font_send_byte(uint8_t dat);#endif

drv_font.c

/**********************************************************************  字库芯片驱动层文件*(c)copyright 2015,jdh*  All Right Reserved*新建日期:2015/2/2 by jdh*修改日期:2015/2/3 by jdh**********************************************************************//**********************************************************************头文件**********************************************************************/#include "drv_font.h"/**********************************************************************静态函数**********************************************************************//**********************************************************************初始化spi**********************************************************************/static void init_spi(void);/**********************************************************************函数**********************************************************************//**********************************************************************初始化字库芯片**********************************************************************/void drv_font_init(void){//初始化spiinit_spi();}/**********************************************************************打开SPI使能**********************************************************************/void drv_font_enable(void){GPIO_ResetBits(GPIOA, GPIO_Pin_4);}/**********************************************************************关闭SPI使能**********************************************************************/void drv_font_disable(void){GPIO_SetBits(GPIOA, GPIO_Pin_4);}/**********************************************************************spi发送一个字节*参数:dat:数据*返回:spi接收到的字节**********************************************************************/uint8_t drv_font_send_byte(uint8_t dat){while ((SPI1->SR & SPI_I2S_FLAG_TXE) == (uint16_t)RESET);SPI1->DR = dat;while ((SPI1->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);return (SPI1->DR);}/**********************************************************************初始化spi**********************************************************************/static void init_spi(void){//定义IO初始化结构体GPIO_InitTypeDef GPIO_InitStructure ;//定义SPI初始化结构体SPI_InitTypeDef  SPI_InitStructure ;//配置CS//初始化时钟    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);GPIO_PinAFConfig(GPIOA,GPIO_PinSource4,GPIO_AF_SPI1);    //管脚模式:输出口    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;    //类型:推挽模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;    //上拉下拉设置GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;    //IO口速度GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    //管脚指定GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;    //初始化GPIO_Init(GPIOA, &GPIO_InitStructure);//关闭使能drv_font_disable();//初始化SPI//关闭SPISPI_Cmd(SPI1,DISABLE);//初始化SPI时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);//设置IO口时钟      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1);  GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1);GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1);    //管脚模式:输出口    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    //类型:推挽模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;    //上拉下拉设置GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//IO口速度GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    //管脚指定GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;    //初始化GPIO_Init(GPIOA, &GPIO_InitStructure);// SPI配置SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex ;SPI_InitStructure.SPI_Mode = SPI_Mode_Master ;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b ;SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low ;SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge ;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft ;//SPI波特率分频设置SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16 ;//SPI设置成LSB模式SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB ;SPI_InitStructure.SPI_CRCPolynomial = 7 ;SPI_Init( SPI1, &SPI_InitStructure ) ;//启动SPISPI_Cmd(SPI1,ENABLE);}

inf_font.h

/********************************************************************** 字库芯片接口层头文件*(c)copyright 2015,jdh*  All Right Reserved*新建日期:2015/2/3 by jdh*修改日期:2015/2/5 by jdh*修改日期:2015/2/6 by jdh**********************************************************************/#ifndef _INF_FONT_H_#define _INF_FONT_H_/**********************************************************************头文件**********************************************************************/#include "drv_font.h"/**********************************************************************宏定义**********************************************************************//**********************************************************************字体定义**********************************************************************//**********************************************************************7*8点阵ASCII标准字符**********************************************************************///字体#define ASCII_7X81//起始地址#define ASCII_7X8_ADDR_BASE0x080300//宽,位数#define ASCII_7X8_WIDTH8//高,位数#define ASCII_7X8_HEIGHT8//字节数#define ASCII_7X8_SIZE8/**********************************************************************7*8点阵ASCII粗体字符**********************************************************************///字体#define ASCII_BOLD_7X82//起始地址#define ASCII_BOLD_7X8_ADDR_BASE0x080600//宽,位数#define ASCII_BOLD_7X8_WIDTH8//高,位数#define ASCII_BOLD_7X8_HEIGHT8//字节数#define ASCII_BOLD_7X8_SIZE8/**********************************************************************6*12点阵ASCII标准字符**********************************************************************///字体#define ASCII_6X123//起始地址#define ASCII_6X12_ADDR_BASE0x080900//宽,位数#define ASCII_6X12_WIDTH8//高,位数#define ASCII_6X12_HEIGHT12//字节数#define ASCII_6X12_SIZE12/**********************************************************************8*16点阵ASCII标准字符**********************************************************************///字体#define ASCII_8X164//起始地址#define ASCII_8X16_ADDR_BASE0x080D80//宽,位数#define ASCII_8X16_WIDTH8//高,位数#define ASCII_8X16_HEIGHT16//字节数#define ASCII_8X16_SIZE16/**********************************************************************8*16点阵ASCII粗体字符**********************************************************************///字体#define ASCII_BOLD_8X165//起始地址#define ASCII_BOLD_8X16_ADDR_BASE0x081580//宽,位数#define ASCII_BOLD_8X16_WIDTH8//高,位数#define ASCII_BOLD_8X16_HEIGHT16//字节数#define ASCII_BOLD_8X16_SIZE16/**********************************************************************12*24点阵ASCII标准字符**********************************************************************///字体#define ASCII_12X246//起始地址#define ASCII_12X24_ADDR_BASE0x081B80//宽,位数#define ASCII_12X24_WIDTH12//高,位数#define ASCII_12X24_HEIGHT24//字节数#define ASCII_12X24_SIZE48/**********************************************************************16*32点阵ASCII标准字符**********************************************************************///字体#define ASCII_16X327//起始地址#define ASCII_16X32_ADDR_BASE0x082D80//宽,位数#define ASCII_16X32_WIDTH16//高,位数#define ASCII_16X32_HEIGHT32//字节数#define ASCII_16X32_SIZE64/**********************************************************************16*32点阵ASCII粗体字符**********************************************************************///字体#define ASCII_BOLD_16X328//起始地址#define ASCII_BOLD_16X32_ADDR_BASE0x084580//宽,位数#define ASCII_BOLD_16X32_WIDTH16//高,位数#define ASCII_BOLD_16X32_HEIGHT32//字节数#define ASCII_BOLD_16X32_SIZE64/**********************************************************************12*12点阵GB18030汉字**********************************************************************///字体#define GB18030_12X129//起始地址#define GB18030_12X12_ADDR_BASE0x093D0E//宽,位数#define GB18030_12X12_WIDTH12//高,位数#define GB18030_12X12_HEIGHT12//字节数#define GB18030_12X12_SIZE24/**********************************************************************16*16点阵GB18030汉字**********************************************************************///字体#define GB18030_16X1610//起始地址#define GB18030_16X16_ADDR_BASE0x114FDE//宽,位数#define GB18030_16X16_WIDTH16//高,位数#define GB18030_16X16_HEIGHT16//字节数#define GB18030_16X16_SIZE32/**********************************************************************24*24点阵GB18030汉字**********************************************************************///字体#define GB18030_24X2411//起始地址#define GB18030_24X24_ADDR_BASE0x1F43DE//宽,位数#define GB18030_24X24_WIDTH24//高,位数#define GB18030_24X24_HEIGHT24//字节数#define GB18030_24X24_SIZE72/**********************************************************************数据结构**********************************************************************//**********************************************************************字体结构**********************************************************************/struct _Font_Type{uint8_t type;uint32_t addr_base;uint8_t width;uint8_t height;uint8_t size;};/**********************************************************************函数**********************************************************************//**********************************************************************初始化字库芯片**********************************************************************/void inf_font_init(void);/**********************************************************************读取字库*参数:font:字体*     ch:待读取的字符*     buf:读取的数据*返回:读取数据的字节数**********************************************************************/uint8_t inf_font_read(uint8_t font,uint16_t ch,uint8_t *buf);/**********************************************************************将ASCII码转换成GB18030编码*说明:在emwin中调用中文字库,如果其中有ascii码,则必须先调用此函数转换*参数:dst:输入字符串*     src:输出字符串**********************************************************************/void inf_font_asc2gb18030(char *dst,char *src);#endif


inf_font.c

/**********************************************************************  字库芯片接口层文件*(c)copyright 2015,jdh*  All Right Reserved*新建日期:2015/2/3 by jdh*修改日期:2015/2/5 by jdh*修改日期:2015/2/6 by jdh**********************************************************************//**********************************************************************头文件**********************************************************************/#include "inf_font.h"#include "string.h"/**********************************************************************宏定义**********************************************************************//**********************************************************************字体数量**********************************************************************/#define FONT_NUM5/**********************************************************************静态变量**********************************************************************//**********************************************************************字体结构**********************************************************************/static struct _Font_Type Font_Type[FONT_NUM];/**********************************************************************静态函数**********************************************************************//**********************************************************************初始化字体类型**********************************************************************/static void init_font_type(void);/**********************************************************************得到地址*参数:font:字体*     ch:待读取的字符*返回:地址**********************************************************************/static uint32_t get_address(uint8_t font,uint16_t ch);/**********************************************************************得到字体地址*参数:ch1:字符编码第1个字节*     ch2:字符编码第2个字节*     ch3:字符编码第3个字节*     ch4:字符编码第4个字节*返回:地址**********************************************************************/static uint32_t get_address_GB18030_12X12(uint8_t c1,uint8_t c2,uint8_t c3,uint8_t c4);/**********************************************************************得到字体地址*参数:ch1:字符编码第1个字节*     ch2:字符编码第2个字节*     ch3:字符编码第3个字节*     ch4:字符编码第4个字节*返回:地址**********************************************************************/static uint32_t get_address_GB18030_16X16(uint8_t c1,uint8_t c2,uint8_t c3,uint8_t c4);/**********************************************************************函数**********************************************************************//**********************************************************************初始化字库芯片**********************************************************************/void inf_font_init(void){//初始化字库芯片drv_font_init();//初始化字体类型init_font_type();}/**********************************************************************读取字库*参数:font:字体*     ch:待读取的字符*     buf:读取的数据*返回:读取数据的字节数**********************************************************************/uint8_t inf_font_read(uint8_t font,uint16_t ch,uint8_t *buf){uint32_t address = 0;uint8_t i = 0;uint8_t ch1 = ch >> 8;uint8_t ch2 = ch;//开始读取drv_font_enable();drv_font_send_byte(0x03);//得到地址address = get_address(font,ch);//读取数据drv_font_send_byte(address >> 16);drv_font_send_byte(address >> 8);drv_font_send_byte(address);for (i = 0;i < Font_Type[font].size;i++){buf[i] = drv_font_send_byte(0);}//关闭读取drv_font_disable();}/**********************************************************************将ASCII码转换成GB18030编码*说明:在emwin中调用中文字库,如果其中有ascii码,则必须先调用此函数转换*参数:dst:输入字符串*     src:输出字符串**********************************************************************/void inf_font_asc2gb18030(char *dst,char *src){uint8_t len = strlen(src);uint8_t i = 0;uint8_t j = 0;uint16_t temp = 0;for (i = 0;i < len;i++){if ((uint8_t)src[i] < 0x80 && (uint8_t)src[i] != 0){temp = (uint8_t)src[i] + 0xa380;dst[j++] = temp >> 8;dst[j++] = temp;}else{dst[j++] = src[i];}}}/**********************************************************************初始化字体类型**********************************************************************/static void init_font_type(void){Font_Type[ASCII_7X8].addr_base = ASCII_7X8_ADDR_BASE;Font_Type[ASCII_7X8].width = ASCII_7X8_WIDTH;Font_Type[ASCII_7X8].height = ASCII_7X8_HEIGHT;Font_Type[ASCII_7X8].size = ASCII_7X8_SIZE;Font_Type[ASCII_BOLD_7X8].addr_base = ASCII_BOLD_7X8_ADDR_BASE;Font_Type[ASCII_BOLD_7X8].width = ASCII_BOLD_7X8_WIDTH;Font_Type[ASCII_BOLD_7X8].height = ASCII_BOLD_7X8_HEIGHT;Font_Type[ASCII_BOLD_7X8].size = ASCII_BOLD_7X8_SIZE;Font_Type[ASCII_6X12].addr_base = ASCII_6X12_ADDR_BASE;Font_Type[ASCII_6X12].width = ASCII_6X12_WIDTH;Font_Type[ASCII_6X12].height = ASCII_6X12_HEIGHT;Font_Type[ASCII_6X12].size = ASCII_6X12_SIZE;Font_Type[ASCII_8X16].addr_base = ASCII_8X16_ADDR_BASE;Font_Type[ASCII_8X16].width = ASCII_8X16_WIDTH;Font_Type[ASCII_8X16].height = ASCII_8X16_HEIGHT;Font_Type[ASCII_8X16].size = ASCII_8X16_SIZE;Font_Type[ASCII_BOLD_8X16].addr_base = ASCII_BOLD_8X16_ADDR_BASE;Font_Type[ASCII_BOLD_8X16].width = ASCII_BOLD_8X16_WIDTH;Font_Type[ASCII_BOLD_8X16].height = ASCII_BOLD_8X16_HEIGHT;Font_Type[ASCII_BOLD_8X16].size = ASCII_BOLD_8X16_SIZE;Font_Type[ASCII_12X24].addr_base = ASCII_12X24_ADDR_BASE;Font_Type[ASCII_12X24].width = ASCII_12X24_WIDTH;Font_Type[ASCII_12X24].height = ASCII_12X24_HEIGHT;Font_Type[ASCII_12X24].size = ASCII_12X24_SIZE;Font_Type[ASCII_16X32].addr_base = ASCII_16X32_ADDR_BASE;Font_Type[ASCII_16X32].width = ASCII_16X32_WIDTH;Font_Type[ASCII_16X32].height = ASCII_16X32_HEIGHT;Font_Type[ASCII_16X32].size = ASCII_16X32_SIZE;Font_Type[ASCII_BOLD_16X32].addr_base = ASCII_BOLD_16X32_ADDR_BASE;Font_Type[ASCII_BOLD_16X32].width = ASCII_BOLD_16X32_WIDTH;Font_Type[ASCII_BOLD_16X32].height = ASCII_BOLD_16X32_HEIGHT;Font_Type[ASCII_BOLD_16X32].size = ASCII_BOLD_16X32_SIZE;Font_Type[GB18030_12X12].addr_base = GB18030_12X12_ADDR_BASE;Font_Type[GB18030_12X12].width = GB18030_12X12_WIDTH;Font_Type[GB18030_12X12].height = GB18030_12X12_HEIGHT;Font_Type[GB18030_12X12].size = GB18030_12X12_SIZE;Font_Type[GB18030_16X16].addr_base = GB18030_16X16_ADDR_BASE;Font_Type[GB18030_16X16].width = GB18030_16X16_WIDTH;Font_Type[GB18030_16X16].height = GB18030_16X16_HEIGHT;Font_Type[GB18030_16X16].size = GB18030_16X16_SIZE;Font_Type[GB18030_24X24].addr_base = GB18030_24X24_ADDR_BASE;Font_Type[GB18030_24X24].width = GB18030_24X24_WIDTH;Font_Type[GB18030_24X24].height = GB18030_24X24_HEIGHT;Font_Type[GB18030_24X24].size = GB18030_24X24_SIZE;}/**********************************************************************得到地址*参数:font:字体*     ch:待读取的字符*返回:地址**********************************************************************/static uint32_t get_address(uint8_t font,uint16_t ch) { uint32_t address = 0;uint8_t ch1 = ch >> 8;uint8_t ch2 = ch;    switch (font){case ASCII_7X8:case ASCII_BOLD_7X8:case ASCII_6X12:case ASCII_8X16:case ASCII_BOLD_8X16:case ASCII_12X24:case ASCII_16X32:{address = Font_Type[font].addr_base + (ch - 0x20) * Font_Type[font].size;break;}case ASCII_BOLD_16X32:{//芯片bug,弄反了几个符号的asciido{if (ch == ';'){ch = ':';break;}if (ch == ':'){ch = ';';break;}if (ch == '_'){ch = '^';break;}if (ch == '^'){ch = '_';break;}} while (0);address = Font_Type[font].addr_base + (ch - 0x20) * Font_Type[font].size;break;}case GB18030_12X12:{address = Font_Type[font].addr_base + get_address_GB18030_12X12(ch1,ch2,0,0) * Font_Type[font].size;break;}case GB18030_16X16:case GB18030_24X24:{address = Font_Type[font].addr_base + get_address_GB18030_16X16(ch1,ch2,0,0) * Font_Type[font].size;break;}}}/**********************************************************************得到字体地址*参数:ch1:字符编码第1个字节*     ch2:字符编码第2个字节*     ch3:字符编码第3个字节*     ch4:字符编码第4个字节*返回:地址**********************************************************************/static uint32_t get_address_GB18030_12X12(uint8_t c1,uint8_t c2,uint8_t c3,uint8_t c4) {     uint32_t h = 0;     if (c2 == 0x7f) {return h; }    if (c1 >= 0xA1 && c1 <= 0xa9 && c2 >= 0xa1){//Section 1         h = (c1 - 0xA1) * 94 + (c2 - 0xA1); }    else {if (c1 >= 0xa8 && c1 <= 0xa9 && c2 < 0xa1)   { //Section 5 if (c2 > 0x7f) {c2--;  }h = (c1 - 0xa8) * 96 + (c2 - 0x40) + 846;   }    }      if (c1 >= 0xb0 && c1 <= 0xf7 && c2 >= 0xa1)      {//Section 2         h = (c1 - 0xB0) * 94 + (c2 - 0xA1) + 1038; }    else {if (c1 < 0xa1 && c1 >= 0x81 && c2 >= 0x40 )   { //Section 3 if (c2 > 0x7f)  {c2--;   }h = (c1 - 0x81) * 190 + (c2 - 0x40) + 1038 + 6768; } else {if(c1 >= 0xaa && c2 < 0xa1)                 { //Section 4if (c2 > 0x7f)  {c2--; }h = (c1 - 0xaa) * 96 + (c2 - 0x40) + 1038 + 12848; } }}    return h; }/**********************************************************************得到字体地址*参数:ch1:字符编码第1个字节*     ch2:字符编码第2个字节*     ch3:字符编码第3个字节*     ch4:字符编码第4个字节*返回:地址**********************************************************************/static uint32_t get_address_GB18030_16X16(uint8_t c1,uint8_t c2,uint8_t c3,uint8_t c4) {     uint32_t h = 0;     if (c2 == 0x7f) {return h; }    if (c1 >= 0xA1 && c1 <= 0xa9 && c2 >= 0xa1){//Section 1         h = (c1 - 0xA1) * 94 + (c2 - 0xA1); }    else {if (c1 >= 0xa8 && c1 <= 0xa9 && c2 < 0xa1)   { //Section 5 if (c2 > 0x7f) {c2--;  }h = (c1 - 0xa8) * 96 + (c2 - 0x40) + 846;   }    }      if (c1 >= 0xb0 && c1 <= 0xf7 && c2 >= 0xa1)      {//Section 2         h = (c1 - 0xB0) * 94 + (c2 - 0xA1) + 1038; }    else {if (c1 < 0xa1 && c1 >= 0x81 && c2 >= 0x40 )   { //Section 3 if (c2 > 0x7f)  {c2--;   }h = (c1 - 0x81) * 190 + (c2 - 0x40) + 1038 + 6768; } else {if(c1 >= 0xaa && c2 < 0xa1)                 { //Section 4if (c2 > 0x7f)  {c2--; }h = (c1 - 0xaa) * 96 + (c2 - 0x40) + 1038 + 12848; } else{if(c1 == 0x81 && c2 >= 0x39) { //四字节区1h = 1038 + 21008 + (c3 - 0xEE) * 10 + c4 - 0x39; } else{if(c1 == 0x82){ //四字节区2h = 1038 + 21008 + 161 + (c2 - 0x30) * 1260 + (c3 - 0x81) * 10 + c4 - 0x30; } }}}}    return h; }

测试代码:

uint8_t buf[30] = {0};inf_font_read(ASCII_6X12,'b',buf);




1 0
原创粉丝点击