天天看點

STM32 emWin使用SPI外挂Flash顯示xbf字庫

emWin使用SPI外挂Flash顯示xbf字庫

最近在學習emWin,在走到顯示漢字時,發現想要使用字庫要麼使用UCODS字庫,和LCD屏自帶函數原來類似的顯示方式自己重建字庫類型。但是UCODS字庫我目前真是沒有找到可以自己做的,連字庫也要去下載下傳,很不友善。使用官方推薦的軟體生成xbf檔案,可以自己建字庫了,但是能找到的教程基本是SD卡的,真是。。。心累。時常SPI外挂flash使用習慣了,想找找這方面的内容,但是這方面的内容要麼太少,要麼寫的不清楚。是以最後就決定自己研究研究,記錄下調試的過程。

  1. 建立xbf字庫

    這個使用emWin自帶的FontCvtST.exe軟體即可生成,目前我隻測試了标準版

    STM32 emWin使用SPI外挂Flash顯示xbf字庫
    STM32 emWin使用SPI外挂Flash顯示xbf字庫
    STM32 emWin使用SPI外挂Flash顯示xbf字庫
  2. 把這個檔案燒錄進外挂的Flash裡

    這個檔案不需要轉成其他格式,我是通過序列槽連接配接STM32單片機序列槽直接燒錄進去的

  3. 修改添加程式,這部分可以多比對參考一下,程式很少,特别好移植
    static GUI_FONT xbfFont;             /* GUI_FONT structure in RAM */
     static GUI_XBF_DATA XBF_Data;        /* GUI_XBF_DATA structure in RAM */
     
     //這個是使用SPI讀取字庫的資訊,第一個是偏移位址,第二個是讀取長度,最後一個是存儲的buff
     static int _cbGetData(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer) 
     {
     	 SPI_Flash_Read(Off, NumBytes, pBuffer);	//這是存儲位置從0開始,如果不一樣,需在偏移上加上位置
         return (0);
     }
     
     //建立這個字型
     void CreateXBF_Font(void) 
     {
         GUI_XBF_CreateFont(&xbfFont,                              /* Pointer to GUI_FONT structure */
     					  &XBF_Data,                         /* Pointer to GUI_XBF_DATA structure */
     					  GUI_XBF_TYPE_PROP,    /* Font type to be created */
     					  _cbGetData,                         /* Pointer to callback function */
     					  NULL);                                  /* Pointer to be passed to callback */
     }
               
  4. 使用前先初始化,設定字型
    CreateXBF_Font();  //建立XBF字型
     GUI_UC_SetEncodeUTF8(); //這個必須要有
     
     //這個xbfFont是前面定義好的
     GUI_SetFont(&xbfFont)
               
  5. 測試顯示了,使用基本的顯示函數即可
    GUI_DispStringAt("123456ABCDEF測試", 10, 10);	
               
STM32 emWin使用SPI外挂Flash顯示xbf字庫
關于可能失敗的情況
1. 字庫沒有燒錄到flash
2. 建一個.h檔案,儲存成格式為UTF-16 LE,把需要顯示的字元放到這個檔案裡,可用記事本更改屬性
           
STM32 emWin使用SPI外挂Flash顯示xbf字庫
STM32 emWin使用SPI外挂Flash顯示xbf字庫
STM32 emWin使用SPI外挂Flash顯示xbf字庫

使用TEXT控件顯示,其他控件或顯示方式類似

// TEXT 
    TEXT_SetFont(hItem, &xbfFont);
    TEXT_SetText(hItem, Sys_GetLanguage() ? Text.english : Text.chinese);
	
	// GUI 
    GUI_SetFont(&xbfFont);
    GUI_DispStringAt( Text.chinese, 10, 10);
           

繼續閱讀