STM32 ILI9341驱动TFTLCD(九)LCD显示ASCIIII

发布时间: 2024-05-15
来源: 电子工程世界

ASCII值在LCD上显示,同样要在一个区域中写显存,这样不同大小字号的字符也就对应不同的字模了。这里生成字模用到了字体取模软件工具PCtoLCD2002,可以方便地生成不同字号的字模。

图片

打开软件并选择设置。

图片

进入设置界面。

图片

根据自己需要进行取模设置:

点阵格式:阴码表示1有效,阳码表示1有效。

取模方式和取模方向与写入显存的算法有关,这里选择顺向逐行式。

图片

设置完成后,根据ASCII表把需要的ASCII值写入,这里写入可见的ASCII值,点击生成字模。

图片

然后复制生成的字模,定义为一个常量存储起来。

图片

可以根据生成的字符右边的序列选取字符所在的序列,由于我们选取的是ASCII的可视字符,在原有的字符上偏移了32,所以读取该数组时要减去偏移量。然后逐点判断是否有效,有效就填充字体颜色,无效就看是否选择有背景色,如果有就填充背景色,没有就进入下一点的写入。


//LCD显示16号ASCII值

//ch:要写的ASCII字符

//pencolor:字符颜色

//bcolor:背景色

//mode:    0:填充背景色

//        1:不填充背景色


void LCD_ShowAscii_16(u8 x,u8 y,u8 ch,u16 pencolor,u16 bcolor,u8 mode)

{

  u8 i = 0,j = 0;

  u8 temp = 0;


  ch -= 32;                  //减去偏移量' '的十进制值

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

  {

    temp = ASCII_16[ch][i];

    for(j=0;j< 8;j++)

    {

      if(temp & 0x80)        //判断该点是否有效

      {

        LCD_DrawPoint(x,y,pencolor);

      }

      else                  

      {

        if(mode == 1)        //判断是否要填充背景色

        LCD_DrawPoint(x,y,bcolor);

      }

      x++;

      temp< <=1;

    }

    x -= 8;

    y++;                    

  }

}

主函数


#include "stm32f4xx.h"

#include "core_cm4.h"

#include "ili9341.h"

#include "lcd.h"



int main()

{

  LCD_Init();          //初始化LCD

  LCD_ShowAscii_16(100,100,'A',RED,IRON_GRAY,1);

  while(1);

}


屏幕显示如下

图片

接着进行同样的操作得到24号字体的ASCII字模,保存为常量。

图片

发现得到的数据与16号字体的略有区别,24号字体每个字符占三行,所以显示函数的算法要重新编写。

从取模软件的设置里可以看到取模说明,从第一行开始向右每取8个点作为一个字节,如果最后不足8个点就补满8位。取模顺序是从高到低,即第一个点作为最高位。

我们可以根据说明,把字模分为左右两部分,先写完左边再写右边的显存。


//LCD显示24号ASCII值

//ch:要写的ASCII字符

//pencolor:字符颜色

//bcolor:背景色

//mode:    0:填充背景色

//        1:不填充背景色

void LCD_ShowAscii_24(u8 x,u8 y,u8 ch,u16 pencolor,u16 bcolor,u8 mode)

{

  u8 i = 0,j = 0,k = 0;

  u8 temp = 0;


  ch-=32;          //减去偏移量' '的值32

  ch*=3;          //一个字符占3行


  for(i=0;i< 3;i++)

  {

    for(j=0;j< 8;j++)

    {

      temp=ASCII_24[ch+i][2*j];  

      for(k=0;k< 8;k++)        //先写左边的显存

      {

        if(temp & 0x80)        //判断该点是否有效

        {

          LCD_DrawPoint(x,y,pencolor);

        }

        else                  

        {

          if(mode == 1)        //判断是否要填充背景色

          LCD_DrawPoint(x,y,bcolor);

        }

        x++;

        temp< <=1;

      }

      temp=ASCII_24[ch+i][2*j+1];

      for(k=0;k< 4;k++)      //写右边的显存

      {

        if(temp & 0x80)        //判断该点是否有效

        {

          LCD_DrawPoint(x,y,pencolor);

        }

        else                  

        {

          if(mode == 1)        //判断是否要填充背景色

          LCD_DrawPoint(x,y,bcolor);

        }

        x++;

        temp< <=1;

      }

      x -= 12;

      y++;

    }

  }

}

主函数


#include "stm32f4xx.h"

#include "core_cm4.h"

#include "ili9341.h"

#include "lcd.h"



int main()

{

  LCD_Init();          //初始化LCD

  LCD_ShowAscii_16(100,100,'A',RED,IRON_GRAY,1);

  LCD_ShowAscii_24(125,100,'A',RED,IRON_GRAY,1);  

  while(1);

}


屏幕显示如下

图片

LCD显示ASCII值16号和24号字体的A可以实现,其他不同字号的ASCII值同样可以基于以上的想法实现。


文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。