这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于单片机的字库设计

共1条 1/1 1 跳转至

关于单片机的字库设计

助工
2019-04-11 11:01:03     打赏

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

如果纯粹取模的话,就要考虑自作一个字库需要花费的时间和占用的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; 
}




共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]