zoukankan      html  css  js  c++  java
  • 从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过程

  • 相关阅读:
    AtCoder Regular Contest 093
    AtCoder Regular Contest 094
    G. Gangsters in Central City
    HGOI 20190711 题解
    HGOI20190710 题解
    HGOI 20190709 题解
    HGOI 20190708 题解
    HGOI20190707 题解
    HGOI20190706 题解
    HGOI 20190705 题解
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/3063323.html
Copyright © 2011-2022 走看看