驱动字库芯片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 PA4 SPI1_NSS SPI1_MISO PA6 SPI1_MISO SPI1_MOSI PA7 SPI1_MOSI SPI1_SCK PA5 SPI1_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) { //初始化spi init_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 //关闭SPI SPI_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 ) ; //启动SPI SPI_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_7X8 1 //起始地址 #define ASCII_7X8_ADDR_BASE 0x080300 //宽,位数 #define ASCII_7X8_WIDTH 8 //高,位数 #define ASCII_7X8_HEIGHT 8 //字节数 #define ASCII_7X8_SIZE 8 /********************************************************************* * 7*8点阵ASCII粗体字符 **********************************************************************/ //字体 #define ASCII_BOLD_7X8 2 //起始地址 #define ASCII_BOLD_7X8_ADDR_BASE 0x080600 //宽,位数 #define ASCII_BOLD_7X8_WIDTH 8 //高,位数 #define ASCII_BOLD_7X8_HEIGHT 8 //字节数 #define ASCII_BOLD_7X8_SIZE 8 /********************************************************************* * 6*12点阵ASCII标准字符 **********************************************************************/ //字体 #define ASCII_6X12 3 //起始地址 #define ASCII_6X12_ADDR_BASE 0x080900 //宽,位数 #define ASCII_6X12_WIDTH 8 //高,位数 #define ASCII_6X12_HEIGHT 12 //字节数 #define ASCII_6X12_SIZE 12 /********************************************************************* * 8*16点阵ASCII标准字符 **********************************************************************/ //字体 #define ASCII_8X16 4 //起始地址 #define ASCII_8X16_ADDR_BASE 0x080D80 //宽,位数 #define ASCII_8X16_WIDTH 8 //高,位数 #define ASCII_8X16_HEIGHT 16 //字节数 #define ASCII_8X16_SIZE 16 /********************************************************************* * 8*16点阵ASCII粗体字符 **********************************************************************/ //字体 #define ASCII_BOLD_8X16 5 //起始地址 #define ASCII_BOLD_8X16_ADDR_BASE 0x081580 //宽,位数 #define ASCII_BOLD_8X16_WIDTH 8 //高,位数 #define ASCII_BOLD_8X16_HEIGHT 16 //字节数 #define ASCII_BOLD_8X16_SIZE 16 /********************************************************************* * 12*24点阵ASCII标准字符 **********************************************************************/ //字体 #define ASCII_12X24 6 //起始地址 #define ASCII_12X24_ADDR_BASE 0x081B80 //宽,位数 #define ASCII_12X24_WIDTH 12 //高,位数 #define ASCII_12X24_HEIGHT 24 //字节数 #define ASCII_12X24_SIZE 48 /********************************************************************* * 16*32点阵ASCII标准字符 **********************************************************************/ //字体 #define ASCII_16X32 7 //起始地址 #define ASCII_16X32_ADDR_BASE 0x082D80 //宽,位数 #define ASCII_16X32_WIDTH 16 //高,位数 #define ASCII_16X32_HEIGHT 32 //字节数 #define ASCII_16X32_SIZE 64 /********************************************************************* * 16*32点阵ASCII粗体字符 **********************************************************************/ //字体 #define ASCII_BOLD_16X32 8 //起始地址 #define ASCII_BOLD_16X32_ADDR_BASE 0x084580 //宽,位数 #define ASCII_BOLD_16X32_WIDTH 16 //高,位数 #define ASCII_BOLD_16X32_HEIGHT 32 //字节数 #define ASCII_BOLD_16X32_SIZE 64 /********************************************************************* * 12*12点阵GB18030汉字 **********************************************************************/ //字体 #define GB18030_12X12 9 //起始地址 #define GB18030_12X12_ADDR_BASE 0x093D0E //宽,位数 #define GB18030_12X12_WIDTH 12 //高,位数 #define GB18030_12X12_HEIGHT 12 //字节数 #define GB18030_12X12_SIZE 24 /********************************************************************* * 16*16点阵GB18030汉字 **********************************************************************/ //字体 #define GB18030_16X16 10 //起始地址 #define GB18030_16X16_ADDR_BASE 0x114FDE //宽,位数 #define GB18030_16X16_WIDTH 16 //高,位数 #define GB18030_16X16_HEIGHT 16 //字节数 #define GB18030_16X16_SIZE 32 /********************************************************************* * 24*24点阵GB18030汉字 **********************************************************************/ //字体 #define GB18030_24X24 11 //起始地址 #define GB18030_24X24_ADDR_BASE 0x1F43DE //宽,位数 #define GB18030_24X24_WIDTH 24 //高,位数 #define GB18030_24X24_HEIGHT 24 //字节数 #define GB18030_24X24_SIZE 72 /********************************************************************* * 数据结构 **********************************************************************/ /********************************************************************* * 字体结构 **********************************************************************/ 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_NUM 5 /********************************************************************* * 静态变量 **********************************************************************/ /********************************************************************* * 字体结构 **********************************************************************/ 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,弄反了几个符号的ascii do { 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 4 if (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 4 if (c2 > 0x7f) { c2--; } h = (c1 - 0xaa) * 96 + (c2 - 0x40) + 1038 + 12848; } else { if(c1 == 0x81 && c2 >= 0x39) { //四字节区1 h = 1038 + 21008 + (c3 - 0xEE) * 10 + c4 - 0x39; } else { if(c1 == 0x82) { //四字节区2 h = 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);