从SD更新字库到FLASH,再用LCD显示
用Flash当字库存储载体。思路是先将要用到的字库文件存在SD卡,然后存储到Flash,LCD显示时候从Flash中读取
还挺顺利的,移植的原子的程序,自己稍加修改,主要是我的液晶屏函数,Flash读写函数,还有存储文件的flash地址不一样。一晚上搞定,大小字体都OK。挺高兴哈哈。这几天忙工作事情有点耽搁了学习进展嘿嘿
在text.c的showstr函数中char的字体颜色随意设置的,可以显示和汉字不匹配,有兴趣可以随便改的。
原子的显示进度我并没有用懒得折腾LCD输出字符串了。
原子地址:http://openedv.com/posts/list/0/13875.htm?privmsg=1#83239
改动文件:mycc936.c text.c fontupd.c
mycc936.c
1 #include "ff.h" 2 #include "fontupd.h" 3 #include "flashspi_config.h" 4 5 WCHAR ff_convert ( /* Converted code, 0 means conversion error */ 6 WCHAR src, /* Character code to be converted */ 7 UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ 8 ) 9 { 10 WCHAR t[2]; 11 WCHAR c; 12 u32 i, li, hi; 13 u16 n; 14 u32 gbk2uni_offset=0; 15 16 if (src < 0x80)c = src;//ASCII,直接不用转换. 17 else 18 { 19 if(dir) //GBK 2 UNICODE 20 { 21 gbk2uni_offset=ftinfo.ugbksize/2; 22 }else //UNICODE 2 GBK 23 { 24 gbk2uni_offset=0; 25 } 26 //if(UK_FLAG)//存在 27 { 28 /* Unicode to OEMCP */ 29 hi=ftinfo.ugbksize/2;//对半开. 30 hi =hi / 4 - 1; 31 li = 0; 32 for (n = 16; n; n--) 33 { 34 i = li + (hi - li) / 2; 35 SPI_FLASH_BufferRead((u8*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出8个字节 36 if (src == t[0]) break; 37 if (src > t[0])li = i; 38 else hi = i; 39 } 40 c = n ? t[1] : 0; 41 } 42 //else c=0; 43 } 44 return c; 45 } 46 47 WCHAR ff_wtoupper ( /* Upper converted character */ 48 WCHAR chr /* Input character */ 49 ) 50 { 51 static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; 52 static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; 53 int i; 54 55 56 for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; 57 58 return tbl_lower[i] ? tbl_upper[i] : chr; 59 }
text.c
1 #include "sys.h" 2 #include "fontupd.h" 3 #include "flashspi_config.h" 4 #include "ili9320.h" 5 #include "text.h" 6 #include "string.h" 7 ////////////////////////////////////////////////////////////////////////////////// 8 //本程序只供学习使用,未经作者许可,不得用于其它任何用途 9 //ALIENTEK战舰STM32开发板 10 //汉字显示 驱动代码 11 //正点原子@ALIENTEK 12 //技术论坛:www.openedv.com 13 //修改日期:2012/9/18 14 //版本:V1.0 15 //版权所有,盗版必究。 16 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 17 //All rights reserved 18 ////////////////////////////////////////////////////////////////////////////////// 19 20 //code 字符指针开始 21 //从字库中查找出字模 22 //code 字符串的开始地址,GBK码 23 //mat 数据存放地址 size*2 bytes大小 24 void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size) 25 { 26 unsigned char qh,ql; 27 unsigned char i; 28 unsigned long foffset; 29 qh=*code; 30 ql=*(++code); 31 if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非 常用汉字 32 { 33 for(i=0;i<(size*2);i++)*mat++=0x00;//填充满格 34 return; //结束访问 35 } 36 if(ql<0x7f)ql-=0x40;//注意! 37 else ql-=0x41; 38 qh-=0x81; 39 foffset=((unsigned long)190*qh+ql)*(size*2);//得到字库中的字节偏移量 40 41 if(size==16)SPI_FLASH_BufferRead(mat,foffset+ftinfo.f16addr,32); 42 else SPI_FLASH_BufferRead(mat,foffset+ftinfo.f12addr,24); 43 } 44 //显示一个指定大小的汉字 45 //x,y :汉字的坐标 46 //font:汉字GBK码 47 //size:字体大小 48 //mode:0,正常显示,1,叠加显示 49 void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode) 50 { 51 u8 temp,t,t1; 52 u16 y0=y; 53 u8 dzk[32]; 54 u16 tempcolor; 55 if(size!=12&&size!=16)return;//不支持的size 56 Get_HzMat(font,dzk,size);//得到相应大小的点阵数据 57 if(mode==0)//正常显示 58 { 59 for(t=0;t<size*2;t++) 60 { 61 temp=dzk[t];//得到12数据 62 for(t1=0;t1<8;t1++) 63 { 64 if(temp&0x80)ili9320_SetPoint(x,y,Blue); 65 else 66 { 67 68 ili9320_SetPoint(x,y,Yellow); 69 70 } 71 temp<<=1; 72 y++; 73 if((y-y0)==size) 74 { 75 y=y0; 76 x++; 77 break; 78 } 79 } 80 } 81 }else//叠加显示 82 { 83 for(t=0;t<size*2;t++) 84 { 85 temp=dzk[t];//得到12数据 86 for(t1=0;t1<8;t1++) 87 { 88 if(temp&0x80)ili9320_SetPoint(x,y,Blue); 89 temp<<=1; 90 y++; 91 if((y-y0)==size) 92 { 93 y=y0; 94 x++; 95 break; 96 } 97 } 98 } 99 } 100 } 101 //在指定位置开始显示一个字符串 102 //支持自动换行 103 //(x,y):起始坐标 104 //width,height:区域 105 //str :字符串 106 //size :字体大小 107 //mode:0,非叠加方式;1,叠加方式 108 void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode) 109 { 110 u16 x0=x; 111 u16 y0=y; 112 u8 bHz=0; //字符或者中文 113 while(*str!=0)//数据未结束 114 { 115 if(!bHz) 116 { 117 if(*str>0x80)bHz=1;//中文 118 else //字符 119 { 120 if(x>(x0+width-size/2))//换行 121 { 122 y+=size; 123 x=x0; 124 } 125 if(y>(y0+height-size))break;//越界返回 126 if(*str==13)//换行符号 127 { 128 y+=size; 129 x=x0; 130 str++; 131 } 132 // else LCD_ShowChar(x,y,*str,size,mode);//有效部分写入 133 else ili9320_PutChar(x,y,*str,Red,Magenta); 134 str++; 135 x+=size/2; //字符,为全字的一半 136 } 137 }else//中文 138 { 139 bHz=0;//有汉字库 140 if(x>(x0+width-size))//换行 141 { 142 y+=size; 143 x=x0; 144 } 145 if(y>(y0+height-size))break;//越界返回 146 Show_Font(x,y,str,size,mode); //显示这个汉字,空心显示 147 str+=2; 148 x+=size;//下一个汉字偏移 149 } 150 } 151 } 152 //在指定宽度的中间显示字符串 153 //如果字符长度超过了len,则用Show_Str显示 154 //len:指定要显示的宽度 155 void Show_Str_Mid(u16 x,u16 y,u8*str,u8 size,u8 len) 156 { 157 u16 strlenth=0; 158 strlenth=strlen((const char*)str); 159 strlenth*=size/2; 160 if(strlenth>len)Show_Str(x,y,240,320,str,size,1); 161 else 162 { 163 strlenth=(len-strlenth)/2; 164 Show_Str(strlenth+x,y,240,320,str,size,1); 165 } 166 } 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
fontupd.c
1 #include "fontupd.h" 2 #include "ff.h" 3 #include "flashspi_config.h" 4 #include "ili9320.h" 5 #include "malloc.h" 6 ////////////////////////////////////////////////////////////////////////////////// 7 //本程序只供学习使用,未经作者许可,不得用于其它任何用途 8 //ALIENTEK战舰STM32开发板 9 //字库更新 驱动代码 10 //正点原子@ALIENTEK 11 //技术论坛:www.openedv.com 12 //修改日期:2012/9/18 13 //版本:V1.0 14 //版权所有,盗版必究。 15 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 16 //All rights reserved 17 ////////////////////////////////////////////////////////////////////////////////// 18 19 //u32 FONTINFOADDR=(1024*6+500)*1024;//默认是6M的地址 20 u32 FONTINFOADDR=0;//默认是6M的地址 21 //字库信息结构体. 22 //用来保存字库基本信息,地址,大小等 23 _font_info ftinfo; 24 25 //在sd卡中的路径 26 const u8 *GBK16_SDPATH="0:/SYSTEM/FONT/GBK16.FON"; //GBK16的存放位置 27 const u8 *GBK12_SDPATH="0:/SYSTEM/FONT/GBK12.FON"; //GBK12的存放位置 28 const u8 *UNIGBK_SDPATH="0:/SYSTEM/FONT/UNIGBK.BIN"; //UNIGBK.BIN的存放位置 29 //在25Qxx中的路径 30 const u8 *GBK16_25QPATH="1:/SYSTEM/FONT/GBK16.FON"; //GBK16的存放位置 31 const u8 *GBK12_25QPATH="1:/SYSTEM/FONT/GBK12.FON"; //GBK12的存放位置 32 const u8 *UNIGBK_25QPATH="1:/SYSTEM/FONT/UNIGBK.BIN"; //UNIGBK.BIN的存放位置 33 34 //显示当前字体更新进度 35 //x,y:坐标 36 //size:字体大小 37 //fsize:整个文件大小 38 //pos:当前文件指针位置 39 u32 fupd_prog(u16 x,u16 y,u8 size,u32 fsize,u32 pos) 40 { 41 float prog; 42 u8 t=0XFF; 43 prog=(float)pos/fsize; 44 prog*=100; 45 if(t!=prog) 46 { 47 // LCD_ShowString(x+3*size/2,y,240,320,size,"%"); 48 t=prog; 49 if(t>100)t=100; 50 // LCD_ShowNum(x,y,t,3,size);//显示数值 51 } 52 return 0; 53 } 54 //更新某一个 55 //x,y:坐标 56 //size:字体大小 57 //fxpath:路径 58 //fx:更新的内容 0,ungbk;1,gbk12;2,gbk16; 59 //返回值:0,成功;其他,失败. 60 u8 updata_fontx(u16 x,u16 y,u8 size,u8 *fxpath,u8 fx) 61 { 62 u32 flashaddr=0; 63 FIL * fftemp; 64 u8 *tempbuf; 65 u8 res; 66 u16 bread; 67 u32 offx=0; 68 u8 rval=0; 69 fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //分配内存 70 if(fftemp==NULL)rval=1; 71 tempbuf=mymalloc(SRAMIN,4096); //分配4096个字节空间 72 if(tempbuf==NULL)rval=1; 73 res=f_open(fftemp,(const TCHAR*)fxpath,FA_READ); 74 if(res)rval=2;//打开文件失败 75 if(rval==0) 76 { 77 if(fx==0) //更新UNIGBK.BIN 78 { 79 ftinfo.ugbkaddr=FONTINFOADDR+sizeof(ftinfo);//信息头之后,紧跟UNIGBK转换码表 80 ftinfo.ugbksize=fftemp->fsize; //UNIGBK大小 81 flashaddr=ftinfo.ugbkaddr; 82 }else if(fx==1) //GBK12 83 { 84 ftinfo.f12addr=ftinfo.ugbkaddr+ftinfo.ugbksize; //UNIGBK之后,紧跟GBK12字库 85 ftinfo.gbk12size=fftemp->fsize; //GBK12字库大小 86 flashaddr=ftinfo.f12addr; //GBK12的起始地址 87 }else //GBK16 88 { 89 ftinfo.f16addr=ftinfo.f12addr+ftinfo.gbk12size; //GBK12之后,紧跟GBK16字库 90 ftinfo.gkb16size=fftemp->fsize; //GBK16字库大小 91 flashaddr=ftinfo.f16addr; //GBK16的起始地址 92 } 93 while(res==FR_OK)//死循环执行 94 { 95 res=f_read(fftemp,tempbuf,4096,(UINT *)&bread); //读取数据 96 if(res!=FR_OK)break; //执行错误 97 SPI_FLASH_BufferWrite(tempbuf,offx+flashaddr,4096); //从0开始写入4096个数据 98 offx+=bread; 99 fupd_prog(x,y,size,fftemp->fsize,offx); //进度显示 100 if(bread!=4096)break; //读完了. 101 } 102 f_close(fftemp); 103 } 104 myfree(SRAMIN,fftemp); //释放内存 105 myfree(SRAMIN,tempbuf); //释放内存 106 return res; 107 } 108 109 //更新字体文件,UNIGBK,GBK12,GBK16一起更新 110 //x,y:提示信息的显示地址 111 //size:字体大小 112 //提示信息字体大小 113 //src:0,从SD卡更新. 114 // 1,从25QXX更新 115 //返回值:0,更新成功; 116 // 其他,错误代码. 117 u8 update_font(u16 x,u16 y,u8 size,u8 src) 118 { 119 u8 *gbk16_path; 120 u8 *gbk12_path; 121 u8 *unigbk_path; 122 u8 res; 123 if(src)//从25qxx更新 124 { 125 unigbk_path=(u8*)UNIGBK_25QPATH; 126 gbk12_path=(u8*)GBK12_25QPATH; 127 gbk16_path=(u8*)GBK16_25QPATH; 128 }else//从sd卡更新 129 { 130 unigbk_path=(u8*)UNIGBK_SDPATH; 131 gbk12_path=(u8*)GBK12_SDPATH; 132 gbk16_path=(u8*)GBK16_SDPATH; 133 } 134 res=0XFF; 135 ftinfo.fontok=0XFF; 136 SPI_FLASH_BufferWrite((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //清除之前字库成功的标志.防止更新到一半重启,导致的字库部分数据丢失. 137 SPI_FLASH_BufferRead((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //重新读出ftinfo结构体数据 138 // LCD_ShowString(x,y,240,320,size,"Updating UNIGBK.BIN"); 139 res=updata_fontx(x+20*size/2,y,size,unigbk_path,0); //更新UNIGBK.BIN 140 if(res)return 1; 141 // LCD_ShowString(x,y,240,320,size,"Updating GBK12.BIN "); 142 res=updata_fontx(x+20*size/2,y,size,gbk12_path,1); //更新GBK12.FON 143 if(res)return 2; 144 // LCD_ShowString(x,y,240,320,size,"Updating GBK16.BIN "); 145 res=updata_fontx(x+20*size/2,y,size,gbk16_path,2); //更新GBK16.FON 146 if(res)return 3; 147 //全部更新好了 148 ftinfo.fontok=0XAA; 149 SPI_FLASH_BufferWrite((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //保存字库信息 150 return 0;//无错误. 151 } 152 //初始化字体 153 //返回值:0,字库完好. 154 // 其他,字库丢失 155 u8 font_init(void) 156 { 157 SPI_FLASH_Init(); 158 // FONTINFOADDR=(1024*6+500)*1024; //W25Q64,6M以后 159 FONTINFOADDR=0; //起始开始 160 ftinfo.ugbkaddr=FONTINFOADDR+25; //UNICODEGBK 表存放首地址固定地址 161 SPI_FLASH_BufferRead((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo));//读出ftinfo结构体数据 162 if(ftinfo.fontok!=0XAA)return 1; //字库错误. 163 return 0; 164 }
fontupd.h
1 #ifndef __FONTUPD_H__ 2 #define __FONTUPD_H__ 3 #include "sys.h" 4 ////////////////////////////////////////////////////////////////////////////////// 5 //本程序只供学习使用,未经作者许可,不得用于其它任何用途 6 //ALIENTEK战舰STM32开发板 7 //字库更新 驱动代码 8 //正点原子@ALIENTEK 9 //技术论坛:www.openedv.com 10 //修改日期:2012/9/18 11 //版本:V1.0 12 //版权所有,盗版必究。 13 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 14 //All rights reserved 15 ////////////////////////////////////////////////////////////////////////////////// 16 17 //前面6M被fatfs占用了. 18 //6M以后紧跟的500K字节,用户可以随便用. 19 //6M+500K字节以后的字节,被字库占用了,不能动! 20 //字体信息保存地址,占25个字节,第1个字节用于标记字库是否存在.后续每8个字节一组,分别保存起始地址和文件大小 21 extern u32 FONTINFOADDR; 22 //字库信息结构体定义 23 //用来保存字库基本信息,地址,大小等 24 __packed typedef struct 25 { 26 u8 fontok; //字库存在标志,0XAA,字库正常;其他,字库不存在 27 u32 ugbkaddr; //unigbk的地址 28 u32 ugbksize; //unigbk的大小 29 u32 f12addr; //gbk12地址 30 u32 gbk12size; //gbk12的大小 31 u32 f16addr; //gbk16地址 32 u32 gkb16size; //gbk16的大小 33 }_font_info; 34 35 extern _font_info ftinfo; //字库信息结构体 36 37 u32 fupd_prog(u16 x,u16 y,u8 size,u32 fsize,u32 pos);//显示更新进度 38 u8 updata_fontx(u16 x,u16 y,u8 size,u8 *fxpath,u8 fx);//更新指定字库 39 u8 update_font(u16 x,u16 y,u8 size,u8 src);//更新全部字库 40 u8 font_init(void);//初始化字库 41 #endif
text.h
1 #ifndef __TEXT_H__ 2 #define __TEXT_H__ 3 #include "sys.h" 4 #include "fontupd.h" 5 ////////////////////////////////////////////////////////////////////////////////// 6 //本程序只供学习使用,未经作者许可,不得用于其它任何用途 7 //ALIENTEK战舰STM32开发板 8 //汉字显示 驱动代码 9 //正点原子@ALIENTEK 10 //技术论坛:www.openedv.com 11 //修改日期:2012/9/18 12 //版本:V1.0 13 //版权所有,盗版必究。 14 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 15 //All rights reserved 16 ////////////////////////////////////////////////////////////////////////////////// 17 18 19 void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size);//得到汉字的点阵码 20 void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode);//在指定位置显示一个汉字 21 void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode);//在指定位置显示一个字符串 22 void Show_Str_Mid(u16 x,u16 y,u8*str,u8 size,u8 len); 23 #endif
再把main函数中随便写的测试代码放出来
部分main
1 //已经初始化了FAT,液晶屏等 2 3 if(font_init()) 4 { 5 printf("\r\n 字库没有更新 \n\r"); 6 while(SD_Initialize())//检测不到SD卡 7 { 8 printf("\r\n SD Card Error! \n\r"); 9 10 printf("\r\n Please Check \n\r"); 11 } 12 if(update_font(20,110,16,0)) printf("\r\n 字库更新失败 \n\r"); 13 else printf("\r\n 字库更新成功 \n\r"); 14 } 15 else 16 { 17 printf("\r\n 字库已经更新 \n\r"); 18 Show_Font(20,20,"王",16,0); 19 Show_Str(60,50,200,16,"战舰开发板",16,0); 20 Show_Str(60,80,200,16,"小字体试试",12,0); 21 Show_Str(100,120,200,16,"Allen is 王阳",16,0); 22 }
主要是感受了字库,然后做了一个从SD 复制到Flash过程