从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过程

原文地址:https://www.cnblogs.com/wwjdwy/p/3063323.html