未来之芯,卓我M31/28SD卡字库和bmp图片显示实验作者fireE-Mailfirestm32@foxmail.comQQ313303034博客firestm32.blog.chinaunix.net硬件平台野火STM32开发板库版本ST3.0.0实验描述:使用软件制作自定义类型的字库,然之后将字库放入SD卡中,并且在SD卡中放入一张bmp图片作为LCD背景。并且调用截屏函数截取LCD背景并保存为bmp图片。硬件连接:MicroSD卡PC8-SDIO-D0----DATA0PC9-SDIO-D1----DATA1PC10-SDIO-D2----DATA2PC11-SDIO-D3----CD/DATA3PC12-SDIO-CLK----CLKPD2-SDIO-CMD----CMDTFT数据线PD14-FSMC-D0----LCD-DB0PD15-FSMC-D1----LCD-DB1PD0-FSMC-D2----LCD-DB2PD1-FSMC-D3----LCD-DB3PE7-FSMC-D4----LCD-DB4PE8-FSMC-D5----LCD-DB5PE9-FSMC-D6----LCD-DB6PE10-FSMC-D7----LCD-DB7PE11-FSMC-D8----LCD-DB8PE12-FSMC-D9----LCD-DB9PE13-FSMC-D10----LCD-DB10PE14-FSMC-D11----LCD-DB11PE15-FSMC-D12----LCD-DB12PD8-FSMC-D13----LCD-DB13PD9-FSMC-D14----LCD-DB14PD10-FSMC-D15----LCD-DB15TFT控制信号线PD4-FSMC-NOE----LCD-RD未来之芯,卓我M32/28PD5-FSMC-NEW----LCD-WRPD7-FSMC-NE1----LCD-CSPD11-FSMC-A16----LCD-DCPE1-FSMC-NBL1----LCD-RESETPD13-FSMC-A18----LCD-BLACK-LIGHT库文件:startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_rcc.cFWlib/misc.cFwlib/stm32f10x_systick.cFWlib/stm32f10x_exti.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_sdio.cFWlib/stm32f10x_dma.cFWlib/stm32f10x_usart.cFWlib/stm32f10x_fsmc.c用户文件:USER/main.cUSER/stm32f10x_it.cUSER/systick.cUSER/usart1.cUSER/lcd.cUSER/ff.cUSER/sdcard.cUSER/diskio.cUSER/sd_fs_app.cUSER/Sd_bmp.c野火STM32开发板LCD和SD卡硬件连接图:SD卡接口连接如下未来之芯,卓我M33/28LCD接口连接如下字库制作详细流程我们采用“字模III-增强版v3.91”软件来制作中文字库。1打开字模软件未来之芯,卓我M34/282点击“自动批量生成字库”按钮选项。软件界面左下角将出现一下几个按钮选项:3点击选择“二级汉字库”按钮。在“输入批量字符”框里面将会列出二级汉字的所有汉字,其中共收录了6768个汉字字符,非特殊情况下都能够满足大家的要求啦,如图:4点击“字库智能生成”按钮,弹出“字库批量参数确认”对话框。我们在“源字体”选项里面做如下设置,需要注意的是大小问题,因为我们本次的设计目标是实现16*16的汉字,所以在此选择’小四’字体。设置好之后如下:未来之芯,卓我M35/285点击“开始转换进程”按钮.就会在安装目录下或者你设置好的目录下生成.c后缀的字库文件。6对于LCD显示来说,只要能够在指定的位置描写制定颜色的点,那么就能够很好地根据汉字字模信息来描写汉字。在此,为了能够更好的清楚字模的取向和高低位的排列顺序,我们可以现先在pc测试我们刚才制作好的库文件。在这里我们取“当”字符的数据来测试。VC6.0测试源码如下:1.#includestdio.h2.3.unsignedcharcc[]=4.{/*当字符*/5.0x00,0x80,0x10,0x90,0x08,0x98,0x0C,0x90,0x08,0xA0,0x00,0x80,0x3F,0xFC,0x00,0x04,6.0x00,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x04,0x3F,0xFC,0x00,0x04,0x00,0x007.};8.9.voidmain()10.{11.inti,j;12.unsignedcharkk;13.for(i=0;i16;i++)14.{未来之芯,卓我M36/2815.for(j=0;j8;j++)16.{17.kk=cc[2*i]j;//左移J位18.19.if(kk&0x80)//如果最高位为120.{21.printf(8);22.}23.else24.{25.printf();26.}27.}28.29.for(j=0;j8;j++)30.{31.32.kk=cc[2*i+1]j;//左移J位33.34.if(kk&0x80)//如果最高位为135.{36.printf(8);37.}38.else39.{40.printf();41.}42.43.}44.45.printf(\n);46.47.}48.printf(\n\n);49.50.}51.52.未来之芯,卓我M37/28测试结果如下:看到以上的测试结果,相信大家对汉字的取模方向和高低位的排列顺序有了比较直观的了解。7回到“字模III-增强版v3.91”软件,采用与之前同样的方式生成bin格式的字库文件(即“生成格式”选项设置为“bin文件格式”)。在软件安装目录下会生成Font.dat文件,我们用“WinHex”软件查看他的具体内容,与刚才制作的.c字库的文件内容是一致的,对比如下:未来之芯,卓我M38/28将生成的汉字字库拷贝到SD卡根目录下并重命名为“HZLIB.bin”。软件实现过程先看看main函数先吧,源码如下:1.intmain(void)2.{3.RCC_Configuration();//时钟配置4.5.LCD_Init();//LCD初始化6.USART1_Config();//串口1初始化7.sd_fs_init();//文件系统化8.Set_direction(0);//LCDAP移动方向设置9.LCD_CLEAR(0,0,240,320);//清屏10.Lcd_show_bmp(0,0,/test.bmp);//在LCD上显示SD卡上存放的test.bmp图片11.//横屏显示12.LCD_ShowString(50,10,1,6X12ASCII);13.LCD_Show_8x16_String(50,30,1,8X16ASCII);14.PutChinese_strings21(50,50,内存卡字库例程,0,1);15.PutChinese_strings11(50,70,内存卡字库例程,0,0xffff);16.未来之芯,卓我M39/2817.//竖屏显示18.LCD_ShowString2(80,240,1,6X12ASCII);19.LCD_Show_8x16_String2(80,220,1,8X16ASCII);20.PutChinese_strings22(80,200,内存卡字库例程,0,1);21.PutChinese_strings12(80,180,内存卡字库例程,0,0xffff);22.23.PutChinese_strings11(50,120,正在截图,0,0xffff);24.Screen_shot(0,0,320,240,/myScreen);//截图操作25.PutChinese_strings11(50,120,截图完成,0,0xffff);26.}Main函数的工作就是在LCD上显示一些指定类型的字符,并完成显示bmp图像和截图功能。这里先说汉字字符的显示,第14行:PutChinese_strings21(50,50,内存卡字库例程,0,1);该函数功能是显示汉子字符串,源码如下:1./******************************************************2.*函数名:PutChinese_strings213.*描述:显示汉字字符串4.*输入:pos:0~(319-16)5.*Ypos:0~(239-16)6.*str:中文字符串首址7.*Color:字符颜色8.*mode:0--文字背景色为白色9.*1--文字悬浮10.*输出:无11.*举例:PutChinese_strings2(200,100,好人,0,0);12.*注意:无13.*********************************************************/14.voidPutChinese_strings21(uint16_tXpos,uint16_tYpos,uint8_t*str,uint16_tColor,u8mode)//横屏15.{16.17.uint16_tTmp_x,Tmp_y;18.uint8_t*tmp_str=str;19.Tmp_x=Xpos;20.Tmp_y=Ypos;21.22.while(*tmp_str!='\0')未来之芯,卓我M310/2823.{24.PutChinese21(Tmp_x,Tmp_y,tmp_str,Color,mode);//显示该汉字25.26.tmp_str+=2;27.Tmp_x+=16;28.}29.}该函数其实没做到什么工作,只是把字符串中的汉字一个一个提取出来并调用单字符显示函数PutChinese21显示出来,PutChinese21函数的源码如下:1./*****************************************************************2.*函数名:PutChinese213.*描述:显示单个汉字字符串4.*输入:pos:0~(319-16)5.*Ypos:0~(239-16)6.*str:中文字符串首址7.*Color:字符颜色8.*mode:0--文字背景色为白色9.*1--文字悬浮10.*输出:无11.*举例:PutChinese21(200,100,好,0,0);12.*注意:如果输入大于1的汉字字符串,显示将会截断,只显示最前面一个汉字13.*************************************************************************/14.voidPutChinese21(uint16_tXpos,uint16_tYpos,uint8_t*str,uint16_tColor,u8mode)15.{16.uint8_ti,j;17.uint8_tbuffer[32];//32字节用于保存字模数据18.uint16_ttmp_char=0;19.Set_direction(0);20.GetGBKCode_from_sd(buffer,str);//从sd卡中取出字模数据21.22.for(i=0;i16;i++)23.{24.tmp_char=buffer[i*2];25.tmp_char=(tmp_char8);26.tmp_char|=buffer[2*i+1];未来之芯,卓我M311/2827.for(j=0;j16;j++)28.{29.if((tmp_cha