<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

        在做一個(gè)用到ucGUI的項(xiàng)目的時(shí)候要用到不定的漢字和英文字符,但是ucGUI本身又不支持讀取芯片外部flash的字庫(kù)來(lái)顯示,于是查了下資料,如下:

        http://www.rzrgm.cn/hiker-blogs/archive/2013/01/04/2843538.html

        站在巨人的肩膀上,我找到了將漢字庫(kù)寫進(jìn)flash后,通過ucGUI的控件顯示出來(lái)的方法,但是至此,并不能在一個(gè)字符串里添加漢字和英文,用于同時(shí)顯示,因?yàn)閒lash里面沒有英文字符的模。

        為了讓一個(gè)控件同時(shí)顯示漢字和英文,我們還是將目標(biāo)瞄準(zhǔn)ucGUI_Core文件夾中的GUICharP.c文件:

      將函數(shù)void GUIPROP_DispChar(U16P c)修改成:

      void GUIPROP_DispChar(U16P c) {
        int BytesPerLine;
        U8 BytesPerFont;  //一個(gè)字的字節(jié)數(shù)
        U32 base,oft;     //字庫(kù)的起始地址和偏移量
             
        GUI_DRAWMODE DrawMode = GUI_Context.TextMode;
        const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c);
        if (pProp) {
          GUI_DRAWMODE OldDrawMode;
          const GUI_CHARINFO GUI_UNI_PTR * pCharInfo;
              //支持2種字體,flash空間有限,放不下第三種字體
          if((GUI_Context.pAFont == &GUI_FontHZ16)||(GUI_Context.pAFont == &GUI_FontHZ24)/*||(GUI_Context.pAFont == &GUI_FontHZ32)*/)
          {
              pCharInfo = pProp->paCharInfo;

              base = (U32)pProp->paCharInfo->pData;
              BytesPerFont = GUI_Context.pAFont->YSize * pProp->paCharInfo->BytesPerLine; //每個(gè)字模的數(shù)據(jù)字節(jié)數(shù)
              if (BytesPerFont > BYTES_PER_FONT)//BYTES_PER_FONT是一個(gè)漢字所占最大字節(jié)數(shù),我這里最大顯示點(diǎn)陣24x24的漢字,所以BYTES_PER_FONT大小是3x24
              {
                  BytesPerFont = BYTES_PER_FONT;
              }
              if (c < 0x80) //英文字符顯示部分
              {
                  const GUI_FONT *EnglishFont;//定義一個(gè)字庫(kù)指針,方便以后操作
                  if(GUI_Context.pAFont == &GUI_FontHZ16)//根據(jù)所用字庫(kù)來(lái)給EnglishFont賦值,因?yàn)閒lash里面沒有英文字符模,于是用ucGUI自帶的
                      EnglishFont=&GUI_Font16_ASCII;
                  else
                      EnglishFont=&GUI_Font24_ASCII;
                  //BytesPerLine = GUI_Font24_ASCII.p.pProp->paCharInfo[c-0x20].BytesPerLine*GUI_Font24_ASCII.YSize;
                  //在這里,BytesPerLine就是所要顯示的字符的模位數(shù),就是GUI_CHARINFO結(jié)構(gòu)體的BytesPerLine
                  BytesPerLine = EnglishFont->p.pProp->paCharInfo[c-0x20].BytesPerLine;
                  OldDrawMode  = LCD_SetDrawMode(DrawMode);//寫入新的模式,并保存舊的模式    
                  //注:pCharInfo->  =  EnglishFont.p.pProp->paCharInfo[c-0x20].
                  //    GUI_Context.pAFont->  =    當(dāng)前字體,比如   EnglishFont.
                  LCD_DrawBitmap( GUI_Context.DispPosX,
                                  GUI_Context.DispPosY,
                                  EnglishFont->p.pProp->paCharInfo[c-0x20].XSize,//GUI_CHARINFO的XSize,EnglishFont->p.pProp->paCharInfo[c-0x20]即相當(dāng)于字庫(kù)文件F16_ASCII.c中的GUI_CharInfo_Font16ASCII[c-0x20]
                                  EnglishFont->YSize,//字庫(kù)的參數(shù)
                                  EnglishFont->XMag,
                                  EnglishFont->YMag,
                                  1,     /* Bits per Pixel */
                                  BytesPerLine,
                                  EnglishFont->p.pProp->paCharInfo[c-0x20].pData,
                                  &LCD_BKCOLORINDEX
                                );
                  /* Fill empty pixel lines */
                  if (EnglishFont->YDist > EnglishFont->YSize) {  //用于字符對(duì)齊,刪掉這里的if到return就可以指到效果了
                    int YMag = EnglishFont->YMag;
                    int YDist = EnglishFont->YDist * YMag;
                    int YSize = EnglishFont->YSize * YMag;
                    if (DrawMode != LCD_DRAWMODE_TRANS) {
                      LCD_COLOR OldColor = GUI_GetColor();
                      GUI_SetColor(GUI_GetBkColor());
                      LCD_FillRect(GUI_Context.DispPosX,
                                   GUI_Context.DispPosY + YSize,
                                   GUI_Context.DispPosX + pCharInfo->XSize,
                                   GUI_Context.DispPosY + YDist);
                      GUI_SetColor(OldColor);
                    }
                  }
                  LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
                  GUI_Context.DispPosX += EnglishFont->p.pProp->paCharInfo[c-0x20].XDist * EnglishFont->XMag;
                  return;
              }
              else //中文字符地址偏移算法
              {
                  oft = base + (((c>>8) - 0xa1) * 94 + ((c&0xff) - 0xa1)) * BytesPerFont;
                  ucGUI_ReadFlashBit(oft, GUI_FontDataBuf, BytesPerFont);//取出字模數(shù)據(jù)

                  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
                                  );

              }        

          }
              //--
          else
          {
              pCharInfo = pProp->paCharInfo+(c-pProp->First);
              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,
                              pCharInfo->pData,
                              &LCD_BKCOLORINDEX
                              );
          }


          /* Fill empty pixel lines */
          if (GUI_Context.pAFont->YDist > GUI_Context.pAFont->YSize) {
            int YMag = GUI_Context.pAFont->YMag;
            int YDist = GUI_Context.pAFont->YDist * YMag;
            int YSize = GUI_Context.pAFont->YSize * YMag;
            if (DrawMode != LCD_DRAWMODE_TRANS) {
              LCD_COLOR OldColor = GUI_GetColor();
              GUI_SetColor(GUI_GetBkColor());
              LCD_FillRect(GUI_Context.DispPosX,
                           GUI_Context.DispPosY + YSize,
                           GUI_Context.DispPosX + pCharInfo->XSize,
                           GUI_Context.DispPosY + YDist);
              GUI_SetColor(OldColor);
            }
          }
          LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
          GUI_Context.DispPosX += pCharInfo->XDist * GUI_Context.pAFont->XMag;
        }
      }

      void GUIPROP_DispChar(U16P c)函數(shù)只是用來(lái)顯示數(shù)據(jù)的,為了讓數(shù)據(jù)顯示在控件中間,還要修改int GUIPROP_GetCharDistX(U16P c)為:

      int GUIPROP_GetCharDistX(U16P c) {
       if(c<0x80)//是英文
       {
          const GUI_FONT_PROP GUI_UNI_PTR * pProp;
          if(GUI_Context.pAFont == &GUI_FontHZ16)//在GUI_FontHZ16中找到字符間距,用于控件字符水平對(duì)齊,防止英文字符寬度被認(rèn)為跟漢字一樣
          {
              pProp = GUIPROP_FindChar(GUI_Font16_ASCII.p.pProp, c);//在GUI_Font16_ASCII字庫(kù)里面找字符c
              return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize * GUI_Font16_ASCII.XMag : 0;//返回字符c的橫坐標(biāo)大小
          }
          else
          {
              pProp = GUIPROP_FindChar(GUI_Font24_ASCII.p.pProp, c);
              return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize * GUI_Font24_ASCII.XMag : 0;
          }
         
        }
        else
        {
          const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c);
          return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize * GUI_Context.pAFont->XMag : 0;
        }
       
      }

      當(dāng)這兩個(gè)函數(shù)修改完畢,并且做好上面大牛的鏈接內(nèi)容后,字體數(shù)據(jù)就放在外部flash中,顯示器可以在控件上同時(shí)顯示漢字和英文了。

      http://pan.baidu.com/s/1pLFA739

      這是我的工程源碼,里面有將字體文件復(fù)制進(jìn)SD卡的函數(shù)。我用的開發(fā)板是stm32f407,環(huán)境是keil5,在stm32f407板子上集成2M的flash,板子上面的SDIO接口連接了一個(gè)1G的SD卡,sd卡有font目錄,里面放16HZK.bin和24HZK_B.bin文件,液晶驅(qū)動(dòng)是ili9341.在這里感謝正點(diǎn)原子,很多驅(qū)動(dòng)程序是他們提供的。

      posted on 2016-11-19 01:25  陽(yáng)光的掌控者  閱讀(1617)  評(píng)論(0)    收藏  舉報(bào)

      主站蜘蛛池模板: 久久国内精品一国内精品| 激情在线一区二区三区视频 | 亚洲国产中文字幕精品| 日韩va中文字幕无码电影| 久久久国产精品樱花网站| 鹰潭市| 免费无码黄十八禁网站| 亚洲欧美成人一区二区三区| 精品国产成人午夜福利| 日本亚洲一区二区精品久久| 内射干少妇亚洲69xxx| 国产一级小视频| 91精品国产免费人成网站| 欧美精品在线观看视频| 国内极度色诱视频网站| 国产精品线在线精品| 亚洲区一区二区三区精品| 人妻人人澡人人添人人爽人人玩 | 岛国中文字幕一区二区| 国产亚洲精品久久久久久久软件| 国产成人亚洲无码淙合青草| 92自拍视频爽啪在线观看| 日本高清色WWW在线安全| 国内少妇人妻偷人精品| 国产亚洲国产亚洲国产亚洲| 少妇被躁爽到高潮| 狠狠色综合久久丁香婷婷| 国产女人18毛片水真多1| 3d全彩无码啪啪本子全彩| 亚洲成在人线AV品善网好看| 欧美极品色午夜在线视频| 亚洲国产精品成人综合色| AV无码不卡一区二区三区| 五月天国产成人av免费观看| 亚洲国产精品综合一区二区 | 放荡的少妇2欧美版| 午夜成年男人免费网站| 在线看无码的免费网站| 西西午夜无码大胆啪啪国模| 亚洲欧洲一区二区精品| 亚洲精品视频免费|