csfc 发表于 2024-6-7 15:17

GD32嵌入式解惑

<p>求助大佬,为什么加入的代码显示12、16的字体正常,但是显示24和32的字体时候,显示不全,只显示一半,这问题出在那一部分,求大佬解惑<img height="53" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/sad.gif" width="54" /></p>

<p>代码如下:参照网上的改写的,加入24和32,字符只能显示出一半来,24和32字库完整。</p>

<pre>
<code class="language-cs">//字符显示
void LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t size,uint8_t mode)
{
    char temp,t1,t;
    uint16_t y0=y;
    uint16_t colortemp=POINT_COLOR;
    num=num-' ';
    if(!mode)
    {
         for(t=0;t&lt;size;t++)
         {
            if(size==12)
                                                        {
                                                       temp=asc2_1206;
                                                        }
            else if(size==16)
                                                        {
                                                       temp=asc2_1608;
                                                        }
                                                        else if(size==24)
                        {
                           temp=asc2_2412;        //调用2412字体
                        }
                                                        else if(size==32)
                                                        {
                                                       temp=asc2_3216;
                                                        }
//                        else return;                                                                //没有的字库       
            for(t1=0;t1&lt;8;t1++)
            {
                  if(temp&amp;0x80)
                                   {
                                   POINT_COLOR=colortemp;
                                   }
                  else
                                                                        {
                                      POINT_COLOR=BACK_COLOR;
                                    }
                                                                        LCD_DrawPoint(x,y);
                  temp&lt;&lt;=1;
                  y++;
                  if(y&gt;=lcddev.height)
                                                                        {
                                                                       POINT_COLOR=colortemp; return;
                                                                        }               
                                    if((y-y0)==size)
                                   {
                                           y=y0;
                                           x++;
                                           if(x&gt;=lcddev.width)
                                                                               {
                                                                                  POINT_COLOR=colortemp; return;
                                                                               }
                                           break;
                                   }
               }
          }
    }
    else
    {
         for(t=0;t&lt;size;t++)
         {
            if(size==12)
                                                        {
                                                       temp=asc2_1206;
                                                        }
            else if(size==16)
                                                        {
                                                       temp=asc2_1608;
                                                        }
                                                        else if(size==24)
                        {
                           temp=asc2_2412;        //调用2412字体
                        }
                                                        else if(size==32)
                                                        {
                                                       temp=asc2_3216;
                                                        }               
            for(t1=0;t1&lt;8;t1++)
            {
                   if(temp&amp;0x80)
                                                                       {
                                                                          LCD_DrawPoint(x,y);
                                                                       }
                  temp&lt;&lt;=1;
                  y++;
                  if(y&gt;=lcddev.height)
                                                                        {
                                                                       POINT_COLOR=colortemp; return;
                                                                        }               
                                    if((y-y0)==size)
                                   {
                                           y=y0;
                                           x++;
                                           if(x&gt;=lcddev.width)
                                                                               {
                                                                                  POINT_COLOR=colortemp; return;
                                                                               }
                                           break;
                                   }
               }
          }
   }
   POINT_COLOR=colortemp;
}
</code></pre>

<p>&nbsp;</p>

wangerxian 发表于 2024-6-7 17:22

<p>什么型号的屏幕?</p>

Gen_X 发表于 2024-6-8 09:44

<p>我也遇到了,是Y方向的起点不对,调整以下初始化中Y的起始初值。同样的驱动芯片有的LCD不同,我2.5元淘了一个就发现这个问题。</p>

hujj 发表于 2024-6-8 09:51

<p>1206和1608点阵字体横向只有6点和8点,一个字节就可以覆盖,因此t1只要循环8次就能完整显示。而2412和3216点阵字体横向分别有12点和16点,需要的2个字节才能覆盖,你的程序只循环了前8个点,剩余的点阵并未写到屏幕上,当然只有左半个字了。</p>

csfc 发表于 2024-6-12 08:25

hujj 发表于 2024-6-8 09:51
1206和1608点阵字体横向只有6点和8点,一个字节就可以覆盖,因此t1只要循环8次就能完整显示。而2412和3216 ...

<p>感谢大佬</p>
页: [1]
查看完整版本: GD32嵌入式解惑