• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 牛人業話 > 一步步解決UCGUI漢字字庫

    一步步解決UCGUI漢字字庫

    作者:liklon 時間:2013-10-23 來源:電子產品世界 收藏

      設計中漢字字庫也是大家最關注的問題之一。主要的問題是在于,使用C文件的字庫太大,一個12×12的漢字字庫文件有2M以上,一般的控制器內部存儲容量是接受不了的。那么讓使用外部中的字庫就成為大勢所趨。接下來介紹如何讓使用外部中的字庫。

    本文引用地址:http://www.czjhyjcfj.com/article/182405.htm

      前期準備

      小編這里的準備是這樣的:芯片,字庫是16_24_32HZK.bin文件和由UC工具生成字庫描述文件。整理出的下載鏈接:http://pan.baidu.com/s/144lJg 。這份字庫文件包含了16、24、32三個字號的字庫,偏移量為0x00000000、0x00045080、0x000E05A0。

      首先將這份字庫文件寫入FLASH芯片中,首地址為100000。還需要準備一份已經將UCGUI移植成功的工程,并將上圖中的3個c文件包含到工程里。現在開始繼續工作。

      修改GUI.H

      這里的修改比較簡單,只需要根據上面說到的首地址和偏移地址在GUI.H中添加如下6句話:

      //漢字庫在FLASH中的首地址

      #define GUI_FontHZ16_Flash_BaseAddr 100000

      #define GUI_FontHZ24_Flash_BaseAddr (0x00045080 + 100000)

      #define GUI_FontHZ32_Flash_BaseAddr (0x000E05A0 + 100000)

      extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ16;

      extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ24;

      extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ32;

      修改GUICharP.c

      包含FLASH讀寫頭文件,加入下面用于讀去FLASH里的數據:

      void LCD_ReadFlashBit(U32 addr,U8* buf,U8 Bytes)

      {

      SPI_Flash_Read(buf,addr,Bytes); //加入自己的讀FLASH

      }

      重點在于如下的修改,這里只以16號字體為例說明.找到GUIPROP_DispChar(U16P c) 函數,在這個函數完成了字符和漢字的判斷,并分開處理,但是所獲取的東西都是一樣的,都是獲取字符或漢字的字模。獲取字模后再執行畫位圖的函數將漢字以及字符顯示出來。

      找到if (pProp)這一句,修改其中的代碼,完成上述功能。

      if((GUI_Context.pAFont == &GUI_FontHZ16)) //首先判斷是否選擇該字體

      pCharInfo = pProp->paCharInfo;

      base = (U32)pProp->paCharInfo->pData; //找出字庫對應的首地址

      BytesPerFont = GUI_Context.pAFont->YSize * pProp->paCharInfo->BytesPerLine; //每個字模的數據字節數

      if (BytesPerFont > BYTES_PER_FONT)

      {

      BytesPerFont = BYTES_PER_FONT;

      }

      if (c < 0x80) //英文字符地址偏移算法

      {

      for(i_table = 0;i_table < 16;i_table++)

      {

      GUI_FontDataBuf[i_table] = acFont8x16[c-0x20][i_table]; //直接取出字模

      }

      }

      else //中文字符地址偏移算法

      {

      oft = base + (((c>>8) - 0xa1) * 94 + ((c&0xff) - 0xa1)) * BytesPerFont; //算出偏移量

      LCD_ReadFlashBit(oft, GUI_FontDataBuf, BytesPerFont);//取出字模數據

      }

      到此為止不管是字符還是漢字的模都已經被取出,不同的是,字符的模是直接在UCGUI所給的C文件中獲取,而中文漢字的模是先計算偏移地址然后讀取存放在FLASH中的字模。取出字模后就可以像在12864液晶上畫圖一樣的把字符和漢字給畫出來,GUI里提供了畫位圖的函數,所以直接使用如下代碼實現:

      BytesPerLine = pCharInfo->BytesPerLine; //獲取一行有多少個字節

      OldDrawMode = LCD_SetDrawMode(DrawMode);//設置畫圖模式

      LCD_DrawBitmap( GUI_Context.DispPosX,

      GUI_Context.DispPosY,

      pCharInfo->XSize,

      GUI_Context.pAFont->YSize,

      GUI_Context.pAFont->XMag,

      GUI_Context.pAFont->YMag,

      1, /* Bits per Pixel */

      BytesPerLine,

      GUI_FontDataBuf,

      &LCD_BKCOLORINDEX

      ); // 調用畫位圖的函數

      通過這最后一步,字符和漢字就可以在屏上以位圖的方式畫出來。

      按照上述步驟完成了之后,就可以調用GUI_DispStringAt();實現字符串輸出,以上的例子只說明了當字體設為HZ16時的情況,其他兩種可以類推。這樣就可以解決UCGUI漢字字庫的問題。

     



    關鍵詞: UCGUI FLASH W25Q64 函數

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 富源县| 资源县| 石城县| 西丰县| 红安县| 丹江口市| 南汇区| 太和县| 都兰县| 宾阳县| 离岛区| 公安县| 天气| 安陆市| 湘西| 卢湾区| 朝阳市| 西华县| 沁阳市| 麻栗坡县| 长寿区| 云梦县| 镇赉县| 牡丹江市| 内乡县| 富顺县| 苏尼特左旗| 杭锦旗| 长顺县| 鄢陵县| 班玛县| 无锡市| 建湖县| 兖州市| 雷州市| 阳江市| 高青县| 太仓市| 团风县| 吴川市| 资源县|