I.簡介
littlevgl 6.0 顯示中文,從查找的資料來看,一種利用內部flash,通過官方工具或網友制作的工具,生成.C檔案放到內部編譯,在宣告下,就可以顯示中文,這種方法只是用少量字體,畢竟這種做法很占用內部flash,
另外兩種是放到SD卡或外部spiflash,放到SD卡的網上的實體大多是基于7.0的,暫時沒有去實作,我這里實作的是從SD卡拷貝到spiflash中(利用工具生成.bin 和.c ),還有看到網上有從SD卡上電拷貝到外部SDRAM中,用法和第一種相似,這種做法從理論上來看速度應該更快,
II實作程序
I. 第一種實作方式
使用工具生成,注意選擇XBF字體,內部大陣列,點擊保存生成china_test的檔案,添加工程中,注意宣告下,就可以使用了,
代碼如下:
#include "lvgl/lvgl.h"
LV_FONT_DECLARE(china_test);
void lv_chinest_test(void)
{
static lv_style_t style;
lv_obj_t * label;
label =lv_label_create( lv_scr_act(), NULL);
lv_obj_set_size( label, 100, 100);
lv_style_copy(&style, &lv_style_plain);
style.body.main_color = LV_COLOR_BLACK;
style.body.grad_color = LV_COLOR_BLACK;
style.text.font = &china_test;
lv_obj_set_style(label, &style);
lv_label_set_text(label, "中文測驗");
printf("1234");
}
顯示結果如下

II. 字庫放到spiflash顯示漢字
首先制作字庫檔案,可以添加常用漢字,字號和字體樣式自主選擇 ,如下圖,加入常用漢字
會生成HZ.bin 和 HZ.c 兩個檔案,把HZ.bin 放大SD卡,一定要記得路徑例如“/HZ.bin”,利用檔案系統打開這個檔案,讓后拷貝到spiflash 某個固定地址,一定要記得起始地址(這個非常重要),我是利用正點原子漢字顯示實驗歷程修改的,主要修改你要寫入的檔案(字庫)路徑,其他不做修改,這里只做測驗,替換掉UNIGBK_PATH路徑
//字庫存放在磁盤中的路徑
u8const GBK24_PATH="/SYSTEM/FONT/GBK24.FON"; //GBK24的存放位置
u8const GBK16_PATH="/SYSTEM/FONT/GBK16.FON"; //GBK16的存放位置
u8const GBK12_PATH="/SYSTEM/FONT/GBK12.FON"; //GBK12的存放位置
//u8const UNIGBK_PATH="/SYSTEM/FONT/UNIGBK.BIN"; //UNIGBK.BIN的存放位置
u8const UNIGBK_PATH="/HZ.bin";
正點原子默認代碼按KEY0自動升級上述四個字庫,有個函式可以單獨升級某個字庫,這里沒做測驗,直接修改u8 update_font(u16 x,u16 y,u8 size,u8 src),屏蔽掉其他三個檔案的讀寫即可,
修改代碼如下:添加兩處#if 0 #end注釋其他即可
//先查找檔案是否正常
strcpy((char*)pname,(char*)src); //copy src內容到pname
strcat((char*)pname,(char*)UNIGBK_PATH);
res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
if(res)rval|=1<<4;//打開檔案失敗
#if 0
strcpy((char*)pname,(char*)src); //copy src內容到pname
strcat((char*)pname,(char*)GBK12_PATH);
res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
if(res)rval|=1<<5;//打開檔案失敗
strcpy((char*)pname,(char*)src); //copy src內容到pname
strcat((char*)pname,(char*)GBK16_PATH);
res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
if(res)rval|=1<<6;//打開檔案失敗
strcpy((char*)pname,(char*)src); //copy src內容到pname
strcat((char*)pname,(char*)GBK24_PATH);
res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
if(res)rval|=1<<7;//打開檔案失敗
#endif
myfree(SRAMIN,fftemp);//釋放記憶體
if(rval==0)//字庫檔案都存在.
{
LCD_ShowString(x,y,240,320,size,"Erasing sectors... ");//提示正在擦除扇區
for(i=0;i<FONTSECSIZE;i++) //先擦除字庫區域,提高寫入速度
{
fupd_prog(x+20*size/2,y,size,FONTSECSIZE,i);//進度顯示
W25QXX_Read((u8*)buf,((FONTINFOADDR/4096)+i)*4096,4096);//讀出整個扇區的內容
for(j=0;j<1024;j++)//校驗資料
{
if(buf[j]!=0XFFFFFFFF)break;//需要擦除
}
if(j!=1024)W25QXX_Erase_Sector((FONTINFOADDR/4096)+i); //需要擦除的扇區
}
//printf("\r\n 0x02%x",buf)
myfree(SRAMIN,buf);
LCD_ShowString(x,y,240,320,size,"Updating UNIGBK.BIN");
strcpy((char*)pname,(char*)src); //copy src內容到pname
strcat((char*)pname,(char*)UNIGBK_PATH);
res=updata_fontx(x+20*size/2,y,size,pname,0); //更新UNIGBK.BIN
if(res){myfree(SRAMIN,pname);return 1;}
LCD_ShowString(x,y,240,320,size,"Updating GBK12.BIN ");
#if 0
strcpy((char*)pname,(char*)src); //copy src內容到pname
strcat((char*)pname,(char*)GBK12_PATH);
res=updata_fontx(x+20*size/2,y,size,pname,1); //更新GBK12.FON
if(res){myfree(SRAMIN,pname);return 2;}
LCD_ShowString(x,y,240,320,size,"Updating GBK16.BIN ");
strcpy((char*)pname,(char*)src); //copy src內容到pname
strcat((char*)pname,(char*)GBK16_PATH);
res=updata_fontx(x+20*size/2,y,size,pname,2); //更新GBK16.FON
if(res){myfree(SRAMIN,pname);return 3;}
LCD_ShowString(x,y,240,320,size,"Updating GBK24.BIN ");
strcpy((char*)pname,(char*)src); //copy src內容到pname
strcat((char*)pname,(char*)GBK24_PATH);
res=updata_fontx(x+20*size/2,y,size,pname,3); //更新GBK24.FON
if(res){myfree(SRAMIN,pname);return 4;}
#endif
//全部更新好了
ftinfo.fontok=0XAA;
W25QXX_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //保存字庫資訊
代碼
__packed typedef struct
{
u8 fontok; //字庫存在標志,0XAA,字庫正常;其他,字庫不存在
u32 ugbkaddr; //unigbk的地址
u32 ugbksize; //unigbk的大小
u32 f12addr; //gbk12地址
u32 gbk12size; //gbk12的大小
u32 f16addr; //gbk16地址
u32 gbk16size; //gbk16的大小
u32 f24addr; //gbk24地址
u32 gkb24size; //gbk24的大小
}_font_info;
這個正點原子字庫存盤位置大小相關的結構體,ugbkaddr 此時的地址為1210241024+33(上述結構體大小),ugbksize為3,222,888 列印出的資料剛好和HZ.bin 大小對應
復制完成后最從12M + 33 的地方讀取若干位元組和源檔案對比,已確定檔案正確性
修改HZ.c
開啟__g_font_buf,添加W25QXX_Read(__g_font_buf, 12582945+offset, size);
12582945 = 1210241024+33;為什么加33 前面已經解釋過了
static uint8_t __g_font_buf[48];//如bin檔案存在SPI FLASH可使用此buff
static uint8_t __user_font_getdata(int offset, int size){
//如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size);
//如字模已加載到SDRAM,直接回傳偏移地址即可如:return (uint8_t)(sdram_fontddr+offset);
W25QXX_Read(__g_font_buf, 12582945+offset, size);
return __g_font_buf;
}
程式原始碼如下
#include "lvgl/lvgl.h"
//LV_FONT_DECLARE(china_test);
LV_FONT_DECLARE(HZ);
void lv_chinest_test(void)
{
static lv_style_t style;
lv_obj_t * label;
label =lv_label_create( lv_scr_act(), NULL);
lv_obj_set_size( label, 100, 100);
lv_style_copy(&style, &lv_style_plain);
style.body.main_color = LV_COLOR_BLACK;
style.body.grad_color = LV_COLOR_BLACK;
//style.text.font = &china_test;
style.text.font = &HZ;
lv_obj_set_style(label, &style);
//lv_label_set_text(label, "中文測驗");
lv_label_set_text(label, "世界那么大我想去看看");
lv_label_ins_text(label, LV_LABEL_POS_LAST, "我思故我在");
printf("1234");
}
顯示結果

總結
上述只是添加一種字庫,實際專案中可能添加多種字庫,根據實際需求添加需要的字體,如果板子沒有SD卡設備,就用通過其他方式把檔案(字庫)拷貝到spiflash中,比如串口接收,利用平臺中轉,最終寫到對用的spiflash中,實際量產的時候,有一片燒錄好spiflash,直接拷貝即可,
這里只做了一個簡單的除錯記錄,如有不正確的地方,請指正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/1578.html
標籤:其他
上一篇:Ubuntu制作啟動盤
