关于单片机的字库设计

作者: wangdbff
上传时间为: 2014-10-25 09:20 PM
2014-10-25
阅读:

当需要液晶显示的时候,汉字的显示一直不是那么方便(在没有*字库的情况下)。

如果纯粹取模的话,就要考虑自作一个字库需要花费的时间和占用的flash资源。对于UCOS

来说,就像楼主使用的破开发板,只有256Kflash,一个16*16 GB点阵字库就要占用200K+,

自然是不可能放入用户源码的。于是乎,楼主开始使用*字库,关于*字库碰到的一些问题

在这里给大家简单说说,有用的话的就给楼主赞一个,哈哈哈

1.关于GB2312,自己百度http://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”文件。

1.jpg

然后选择取模方式,可以设置字体样式、大小和方向设置等。注意“方向设置“选项,

这里为了对应工程中的显示程序,选择——横向取模,高位在坐。其它选项只要适

当修改显示程序就可以。
2.jpg

然后点击“输出“按钮,将在该目录下得到字模数组文件(temp.txt)。
第五步,整理字库文件。上一步得到的字模数组文件还不能直接使用,

需要进行整理以适合串口发送,去除各种注释符和标点字符,只保留

两位字符组成的十六进制格式。接着将“temp.txt”改名为“HzLib.txt”,

然后运行“整理字库.exe”,此时将得到整理好的字库“OutHzLib.txt”然

后就可以直接将该字库通过串口发送到MCU了。
3.jpg

第六步,串口发送数据。推荐用附件中的串口调试软件,因为有些软

件在对于文件发送这个功能做得似乎有些问题。本人也测试了两款串

口调试软件,均不能得到结果,如果有其它好的也可以,反正只要达

到目的就行。设置串口参数,然后在发送区设置中勾选“按十六进制

发送”,点击“启动文件数据原”选项,选择制作好的字库“OutHzLib.txt”,

不要点击“文件载入”。
4.jpg

第七步,打开串口,将板子接通电源,首先对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; }  
其实对于论坛的大多数大牛,这点东西可能都不会看,不过总用人会碰到这样的问题。

在一步步深入嵌入式的过程中,希望会对需要的朋友一点帮助。

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示