jinglixixi 发表于 2020-8-8 23:57

【ESK32-360测评】+TFT屏显示功能及扩展(3)

本帖最后由 jinglixixi 于 2020-8-9 00:02 编辑

<p>3. 增添汉字显示功能</p>

<p>在TFT屏显示功能中提供了字符及字符串的显示函数,其字符库的结构为:</p>

<p>FONT_TYPE ASCII_Font_Table[] = {</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Space &#39; &#39; */</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0000, 0x0000, 0x0000, 0x0000,</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0000, 0x0000, 0x0000, 0x0000,</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;0x0000, 0x0000, 0x0000, 0x0000,</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0000, 0x0000, 0x0000, 0x0000,</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0000, 0x0000, 0x0000, 0x0000,</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0000, 0x0000, 0x0000, 0x0000,</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。。。</p>

<p>};</p>

<p>&nbsp;</p>

<p>相应的字符显示函数为:</p>

<pre>
<code class="language-cpp">void LCD_CharDraw(u32 X_Location, u32 Y_Location, u16 *Cptr)
{
  u32 xid = X_Location;
  u32 i = 0, j = 0;
  LCD_StarterSet(X_Location, Y_Location);
  for (i = 0; i &lt; Font_Raw; i++)         //  24
  {
    LCD_WriteRAMPrior();
    for (j = 0; j &lt; Font_Column; j++)    //  16
    {
      if ((Cptr &amp; (1 &lt;&lt; j)) == 0x00)
      {
        LCD_WriteRAM(Color_Back);
      }
      else
      {
        LCD_WriteRAM(Color_Text);
      }
    }
    xid++;
    LCD_StarterSet(xid, Y_Location);
  }
}</code></pre>

<p>通过分析可知,它所使用的是16*24的点阵字模,字符宽为16个像素点,高为24个像素点。</p>

<p>为此我们也可以通过字模提取软件来为其配置相应的中文字库,以实现专用汉字的显示。</p>

<p>1)字模的提取</p>

<p>使用PCtoLCD2002完美版软件来提取字模,对提取字模的相关设置如图1所示,提取后字模见图2所示。</p>

<p>稍感遗憾的是该软件提取的字模是以字节为单位的,无法直接生成以字为单位的字模,为先解决汉字显示函数,只好先手工完成数据格式的转换。</p>

<p></p>

<p>图1 字模提取的设置</p>

<p>&nbsp;</p>

<p></p>

<p>图2 提取字模</p>

<p>随后用提取的字模替换一个指定字符的字模,再调用字符显示函数加以测试,可见到显示正确,</p>

<p>这样我们就可以放手解决单字节数据格式的问题了。</p>

<p>2)配置汉字显示函数</p>

<p>经改造相应的汉字显示函数为:</p>

<pre>
<code class="language-cpp">void LCD_CharDisplayA(u32 Line_Num, u32 Column, u8 Ascii)
{
  LCD_CharDrawA(Line_Num, Column, (u8 *)&amp;ASCII_FontA_Table);
}</code></pre>

<pre>
<code class="language-cpp">void LCD_CharDrawA(u32 X_Location, u32 Y_Location, u8 *Cptr)
{
  u32 xid = X_Location;
  u32 i = 0, j = 0;
  u16 u = 0;
  LCD_StarterSet(X_Location, Y_Location);

  for (i = 0; i &lt; Font_Raw; i++)  //24
  {
      LCD_WriteRAMPrior();
   
        u=Cptr;
        for (j = 8; j&gt;0; j--) //Font_Column/2
        {
          if ((u &amp; (1 &lt;&lt; (j-1))) == 0x00)
          {
              LCD_WriteRAM(Color_Back);
          }
          else
          {
              LCD_WriteRAM(Color_Text);
          }
        }
   
        u=Cptr;
        for (j = 8; j&gt;0; j--)
        {
          if ((u &amp; (1 &lt;&lt; (j-1))) == 0x00)
          {
             LCD_WriteRAM(Color_Back);
          }
          else
          {
             LCD_WriteRAM(Color_Text);
          }
        }
        xid++;
        LCD_StarterSet(xid, Y_Location);
  }
}</code></pre>

<p>显示图3所示效果的主程序为:</p>

<pre>
<code class="language-cpp">int main(void)
{

  LCD_Init();
  LCD_Config();
  LCD_BackColorSet(Black);
  LCD_TextColorSet(Yellow);
  LCD_StringLineDisplay(Line3, "       Holtek       ");
  LCD_StringLineDisplay(Line4, "     HT32 Series    ");
  LCD_StringLineDisplay(Line5, "     LCD Example    ");

  LCD_CharDisplayA(Line1, 70, 0); 
  LCD_CharDisplayA(Line1, 90, 1);
  LCD_CharDisplayA(Line1, 110, 2);
  LCD_CharDisplayA(Line1, 130, 3);
  LCD_CharDisplayA(Line1, 150, 4);

  LCD_PicDraw((144), (100), 48, 100, HT32_Table);
  while (1);
}</code></pre>

<p></p>

<p>图3 汉字显示效果</p>

<p>&nbsp;</p>

<p></p>

<p>图4 更改字库内容的显示效果</p>

<p>&nbsp;</p>

<p>24*16点阵的字库适合制作显示界面,而16*16点阵字库更适合信息显示,在采用16*16点阵的中文字库的情况下,</p>

<p>若配置相应显示函数则可产生图5所示的显示效果。</p>

<p></p>

<p>图5不同规格字模显示效果</p>
页: [1]
查看完整版本: 【ESK32-360测评】+TFT屏显示功能及扩展(3)