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值同样可以基于以上的想法实现。