当需要液晶显示的时候,汉字的显示一直不是那么方便(在没有*字库的情况下)。
如果纯粹取模的话,就要考虑自作一个字库需要花费的时间和占用的flash资源。对于UCOS来说,就像楼主使用的破开发板,只有256Kflash,一个16*16 GB点阵字库就要占用200K+,自然是不可能放入用户源码的。
于是乎,楼主开始使用*字库,关于*字库碰到的一些问题在这里给大家简单说说,有用的话的就给楼主赞一个,哈哈哈
1.关于GB2312,可百度。
2.字库一般选用flash器件,采用SPI协议通信,通常4兆的片子足够使用常用字库的存储。
3.自制字库,最后会放上楼主曾用过的资源。纤细过程(加一些格式,好看得清楚,哈哈哈):
第一步,当然需要你将你所用的SPIflasn的初始化以及读写函数写好(我使用W25X16,2M,传输速率最大74MHZ,很快的;写函数:void W25X_Write_Bytes(uint32_t addr,u8* pBuffer, u16 nBytes) 注:W25X16写时,需要先擦除。读函数:void W25X_Read_Bytes(uint32_t addr, u8* pBuffer, u16 nBytes)
第二步,编写串口传输函数,采用串口中断的方式,波特率设置为115200(测试没有问题),接收外部输入的一个字节后立马将其写入SPI FLASH。与之前两个字符表示一个字节的方法速度提升一倍。
代码:
u8 result; u32 pAddr=0; void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { result = USART_ReceiveData(USART1); W25X_Write_Bytes(pAddr++,&result,1); USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清除串口接受中断 } }
第三步,设置一个按键进行擦除操作,通过串口或者LCD进行交互,以提示是否擦除完成。可以进行写FLASH。
第四步,制作中文字库,GB3212库包含6768个简体中文,首先打开“取点阵.exe”软件,然后在软件中打开“字符库.txt”文件。然后选择取模方式,可以设置字体样式、大小和方向设置等。注意“方向设置“选项,这里为了对应工程中的显示程序,选择——横向取模,高位在坐。其它选项只要适当修改显示程序就可以。然后点击“输出“按钮,将在该目录下得到字模数组文件(temp.txt)。
第五步,整理字库文件。上一步得到的字模数组文件还不能直接使用,需要进行整理以适合串口发送,去除各种注释符和标点字符,只保留两位字符组成的十六进制格式。接着将“temp.txt”改名为“HzLib.txt”,然后运行“整理字库.exe”,此时将得到整理好的字库“OutHzLib.txt”然后就可以直接将该字库通过串口发送到MCU了。
第六步,串口发送数据。推荐用附件中的串口调试软件,因为有些软件在对于文件发送这个功能做得似乎有些问题。本人也测试了两款串口调试软件,均不能得到结果,如果有其它好的也可以,反正只要达到目的就行。设置串口参数,然后在发送区设置中勾选“按十六进制发送”,点击“启动文件数据原”选项,选择制作好的字库“OutHzLib.txt”,不要点击“文件载入”。
第七步,打开串口,将板子接通电源,首先对Flash进行擦除操作,提示擦除结束后,点击串口发送,然后就慢慢等着字库写入FLASH。测试在波特率为115200下,取模大小为16*16,耗时为70s,似乎也不太久,如果取模越大,耗时就越长。写好字模后,就可以在工程中调用字库进行中文显示了(取GBK内码操作见工程)。另外如果flash容量够大的话,还可以写入其它字体样式和大小的字库,做一个专属的字库芯片。
4.X宝一个片子,经济实惠,随拿随用。做好了字库,就剩下怎样使用了
另外,
1.建议使用总线型SPI,速率绝对有保障。具体代码看各自的板子了。
2.如果使用软件SPI,送一段:
#define MOSI_H GPIO_SetBits(GPIOA, GPIO_Pin_5) #define MOSI_L GPIO_ResetBits(GPIOA, GPIO_Pin_5) #define SCLK_H GPIO_SetBits(GPIOA, GPIO_Pin_7) #define SCLK_L GPIO_ResetBits(GPIOA, GPIO_Pin_7) #define MISO_H GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) void spi_init(void) { CE_25_1; MOSI_H; MISO_H; SCLK_H; } unsigned char SPI_SendByte(unsigned char dt) { u8 i; u8 temp=0; for(i=8;i>0;i--) { if(dt&0x80)MOSI_H; else MOSI_L; SCLK_L; SCLK_H; temp<<=1; dt<<=1; if(MISO_H) temp++; } return temp; }