本博文所用到的代码:http://download.csdn.net/detail/king_bingge/5739167 好几天没有写博客了,这几天都在忙挑战杯的事情,由于某些不和谐因素,昨天才开始准备今天的挑战杯答辩,虽然不知道结果是怎样的,但是个人感觉创新点还是有的,就是主评委老师拽着我们这个消费对象来说事,过去了就不再想了,也不知道能不能进入省赛,但是学习还是要继续的,今天总结的这个实验是实现从SD卡里面读bmp图片,bin图片,同时在将我制作的字库存放在SD卡中,从里面读取所需要的汉字,虽然之前早就实现了bmp图片读取和字库的读取,但是一直困扰我的就是bin格式的图片读取,今天下午花了些时间终于弄出来的,刷图是比bmp块了,但是没快多少,也就快五分之一的样子!!不过也算是知道了怎么读取bin文件的内容吧,还是有收获的。 好的,实验开始.. 预备知识就是知道我们的汉字显示原理,区位码的关系,还有bmp图片的显示原理。这部分知识我也看了几个小时,现在把一些需要注意的地方总结一下 一、关于汉字GBK码显示 1、汉字在各种文件里面的存储不是以点阵数据的形式存储的(否则那占用的空间就太大了),而是以内码的形式存储的,就是GB2312/GBK/BIG5等这几种的一种,每个汉字对应着一个内码,在知道了内码之后再去字库里面查找这个汉字的点阵数据,然后在液晶上显示出来。这个过程我们是看不到,但是计算机是要去执行的。 2、stm32显示汉字流程:汉字内码(GBK/GB2312) ---->查找点阵库 -----> 解析 ------- >显示 那么关于汉字内码的知识,我想这不应该是我们讨论的内容,网上一大把,我推荐一个介绍比较易懂的博文,是转载的,大家可以参考这看一看 http://blog.csdn.net/king_bingge/article/details/8780202
3、那么如何查找点阵的字库呢?先看如下的一段代码,通过代码来分析,总是能够减少我们的理解难度 先看主程序中的代码吧
[csharp] view plain copy
print?
- int main(void)
- {
- delay_init(72);
- USART1_Init();
- SPIx_Init(); //初始化SPI
- LCD_ILI9325_Init(); //LCD驱动初始化
- printf("\r\n ("__DATE__ " - " __TIME__ ") \r\n");
- LCD_ClearScreen(0xa451);
- Lcd_show_bmp(0,0,"/你you.bmp");
- LCD_ClearScreen(BLACK);
- Lcd_show_bin(0,0,"/你you.bin");
- LCD_ClearScreen(RED);
- LCD_Str_CH(20,300,"从存储卡读取汉字的实验",0,BLUE);
- while(1);
- }
主程序就是几个刷屏函数,然后先说读取字库这个函数吧 4、代码如下
[csharp] view plain copy
print?
- void LCD_Str_CH(u16 x,u16 y,const u8 *str,u16 Color,u16 bkColor)
- {
-
- while(*str != '\0')
- {
- if(x>(240-16))
- {
- /*换行*/
- x =0;
- y +=16;
-
- }
- if(y >(320-16))
- {
- /*重新归零*/
- y =0;
- x =0;
- }
- LCD_Char_CH(x,y,str,Color,bkColor);
- str += 2 ;
- x += 16 ;
- }
- }
首先就是简单的格式处理,然后重要的是这个函数 LCD_Char_CH(x,y,str,Color,bkColor); 跟踪进去
[csharp] view plain copy
print?
- void LCD_Char_CH(u16 x,u16 y,const u8 *str,u16 Color,u16 bkColor)
- {
- u8 i,j;
- u8 buffer[32];
- u16 tmp_char=0;
- GetGBKCode_from_sd(buffer,str); /* 取字模数据 */
-
- for (i=0;i<16;i++)
- {
- tmp_char=buffer[i*2];
- tmp_char=(tmp_char<<8);
- tmp_char|=buffer[2*i+1];
- for (j=0;j<16;j++)
- {
- if ( (tmp_char >> 15-j) & 0x01 == 0x01)
- {
- LCD_DispOnePixel(x+j,y+i,Color);
- }
- else
- {
- LCD_DispOnePixel(x+j,y+i,bkColor);
- }
- }
- }
- }
|