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

  • 相关阅读:
    MFC CDialog/CDialogEx DoModal ALT
    yum和apt-get用法及区别
    ubuntu 12.04 source.list 源更新
    elasticsearch 优化
    TRIE树
    数据统计经验浅谈
    机器学习
    python 读取libsvm文件
    spark 参数调优
    python中的一些函数
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/3063323.html
Copyright © 2011-2022 走看看