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

接口/总线/驱动

1139人已加入

描述

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

ILI9341

打开软件并选择设置。

ILI9341

进入设置界面。

ILI9341

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

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

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

ILI9341

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

ILI9341

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

ILI9341

可以根据生成的字符右边的序列选取字符所在的序列,由于我们选取的是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);
}

屏幕显示如下

ILI9341

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

ILI9341

发现得到的数据与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);
}

屏幕显示如下

ILI9341

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分