TA的每日心情 | 慵懒 2020-5-29 14:13 |
---|
签到天数: 79 天 连续签到: 1 天 [LV.6]常住居民II
|
当需要液晶显示的时候,汉字的显示一直不是那么方便(在没有*字库的情况下)。
如果纯粹取模的话,就要考虑自作一个字库需要花费的时间和占用的flash资源。对于UCOS
来说,就像楼主使用的破开发板,只有256Kflash,一个16*16 GB点阵字库就要占用200K+,
自然是不可能放入用户源码的。于是乎,楼主开始使用*字库,关于*字库碰到的一些问题
在这里给大家简单说说,有用的话的就给楼主赞一个,哈哈哈
1.关于GB2312,自己百度https://baike.baidu.com/view/443268.htm?from_id=483170&type=
syn&fromtitle=GB2312&fr=aladdin 也有GBK等的介绍
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; } 其实对于论坛的大多数大牛,这点东西可能都不会看,不过总用人会碰到这样的问题。 在一步步深入嵌入式的过程中,希望会对需要的朋友一点帮助。 |
|