一、两种编码
1、字符编码
由于计算机只能识别
0
和
1
,文字也只能以
0
和
1
的形式在计算机里存储,所以我们需要对文字 进行编码才能让计算机处理,编码的过程就是规定特定的 01
数字符串来表示特定的文字,最简单的字符编码例子是 ASCII
码。
2、中文编码
由于英文书写系统都是由
26
个基本字母组成,利用
26
个字母组可合出不同的单词,所以用
ASCII 码表就能表达整个英文书写系统。而中文书写系统中的汉字是独立的方块,若参考单词拆解成字 母的表示方式,汉字可以拆解成部首、笔画来表示,但这样会非常复杂 (
可参考五笔输入法编码
)
, 所以中文编码直接对方块字进行编码,一个汉字使用一个号码。
由于汉字非常多,常用字就有
6000
多个,如果像
ASCII
编码表那样只使用
1
个字节最多只能表 示 256
个汉字,所以我们使用
2
个字节来编码。
二、字模
1、字模构成
已知字模是图形数据,而图形在计算机中是由一个个像素点组成的,所以字模实质是一个个像素 点数据。为方便处理,我们把字模定义成方块形的像素点阵,且每个像素点只有 0
和
1
这两种状 态 (
可以理解为单色图像数据
)
。见图
字模
,这是两个宽、高为
16x16
的像素点阵组成的两个汉字 图形,其中的黑色像素点即为文字的笔迹。计算机要表示这样的图形,只需使用 16x16
个二进制 数据位,每个数据位记录一个像素点的状态,把黑色像素点以“1
”表示,无色像素点以“
0
”表示即可。这样的一个汉字图形,使用 16x16/8=32
个字节来就可以记录下来。
16x16 的“字”的字模数据以 C 语言数组的方式表示,在这样的字模中,以两个字节表示一行像素点,16 行构成一个字模。
2、字模原理
如果使用
LCD
的画点函数,按位来扫描这些字模数据,把为
1
的位以黑色来显示
(
也可以使用其它颜色)
,为
0
的数据位以白色来显示,即可把整个点阵还原出来,显示在液晶屏上。
为便于理解,我们编写了一个使用串口
printf
利用字模打印字符到串口上位机,见
代码清单
:LTDC-
2
中演示的字模显示原理。
在
main
函数中运行这段代码,连接好开发板到上位机,可以看到图
使用串口打印字模
中的现象。
该函数中利用
printf
函数对字模数据中为
1
的数据位打印“
*
”号,为
0
的数据位打印出“空格”,
从而在串口接收区域中使用“
*
”号表达出了一个“当”字。
三、通过LTDC液晶显示屏显示字模
1、下载辅助软件PCtoLCD2002
2、进入界面
配置字模的解析顺序,解析顺序要和代码配套,否则会显示乱码。
3、代码设置
3.1、将“lcd_show_zn”模块添加到工程中
3.2、“lcd_show_zn”部分代码实例
#include "lcd_show_zn.h"
#include "bsp_lcd.h"
#define ITEM_BIT_NUM 8
unsigned char zm24x24_index[]="蜂鸣";
uint8_t ZN24x24_Table[] = {
0x00,0x00,0x00,0x00,0x20,0x00,0x60,0x60,0x00,0x20,0xE0,0x1F,0x20,0x30,0x08,0x20,
0x30,0x04,0x20,0x48,0x06,0xFC,0x87,0x02,0x24,0x01,0x01,0x24,0xC1,0x06,0x24,0x21,
0x79,0x24,0x19,0x31,0x24,0xFF,0x1F,0x24,0x01,0x01,0xFC,0x01,0x01,0x24,0xF9,0x1F,
0xA4,0x00,0x01,0x20,0x01,0x21,0xA0,0xFF,0x3F,0x7C,0x02,0x01,0x04,0x02,0x01,0x00,
0x00,0x01,0x00,0x80,0x01,0x00,0x00,0x00,/*"蜂",0*/
0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xFC,0xF8,0x0F,0x84,
0x28,0x08,0x84,0x48,0x0C,0x84,0xC8,0x0C,0x84,0x88,0x0C,0x84,0x08,0x04,0x84,0x88,
0x04,0x84,0x08,0x07,0x84,0x08,0x01,0xFC,0xFC,0x3F,0x84,0x08,0x30,0x04,0x00,0x10,
0x04,0x00,0x12,0x80,0xFF,0x17,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x80,0x18,0x00,
0x00,0x0F,0x00,0x00,0x04,0x00,0x00,0x00,/*"鸣",1*/
};
znsFONT ZN_Font24x24 = {
ZN24x24_Table,
zm24x24_index,
24, /* Width */
24, /* Height */
};
unsigned char zm48x48_index[]="你好";
uint8_t ZN48x48_Table[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x3C,0x00,0x0E,0x00,0x00,
0xC0,0x3F,0x00,0x0F,0x00,0x00,0xFE,0x3F,0x80,0x9F,0xFF,0x3F,0xFF,0x1F,0xC0,0xFF,
0xFF,0x7F,0xFF,0x0F,0xE0,0xFF,0xFF,0x7F,0xFF,0x07,0xF8,0xFF,0xFF,0x7F,0xFF,0x03,
0xFC,0x3F,0x00,0x78,0xFF,0x01,0xFF,0x03,0x00,0x78,0xFF,0xC1,0xFF,0x00,0x00,0x78,
0xFF,0x81,0x7F,0x80,0x01,0x1C,0xE0,0x01,0x0F,0x80,0x03,0x06,0xE0,0x01,0x00,0x80,
0x07,0x00,0xE0,0x01,0x00,0x80,0x03,0x00,0xE0,0x00,0xE0,0xC0,0x83,0x01,0xE0,0x00,
0xE0,0xC0,0x83,0x07,0xE0,0x00,0xF0,0xC0,0x83,0x07,0xE0,0x00,0xF0,0xC0,0x83,0x0F,
0xE0,0x00,0x78,0xC0,0x03,0x1F,0xE0,0x00,0x7C,0xC0,0x03,0x7F,0xE0,0x00,0x7E,0xC0,
0x03,0x7F,0xE0,0x00,0x3F,0xC0,0x03,0x7F,0xF0,0x80,0x3F,0xC0,0x03,0x7E,0xF0,0xE0,
0x1F,0xC0,0x03,0x7E,0x70,0xF8,0x1F,0xC0,0x03,0x7C,0x70,0xE0,0x0F,0xC0,0x03,0x7C,
0x70,0x80,0x07,0xE0,0x03,0x78,0x70,0x00,0x00,0xE0,0x03,0x00,0x70,0x00,0x00,0xE0,
0x03,0x00,0x70,0x00,0x00,0xE0,0x03,0x00,0x60,0x00,0x00,0xE0,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"你",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0xFE,0x1F,
0x38,0x80,0x1F,0xFF,0xFF,0x7F,0x38,0xE0,0x1F,0xFF,0xFF,0x7F,0x38,0x00,0x0E,0xFF,
0xFF,0x7F,0x38,0x00,0x0E,0xFE,0x03,0x7F,0x38,0x00,0x0E,0xFC,0x01,0x7F,0x38,0xC0,
0x0F,0xC0,0x03,0x1F,0xFC,0xFF,0x07,0x80,0x8F,0x07,0xFF,0xFF,0x07,0x00,0xDF,0x03,
0xFF,0xFF,0x07,0x00,0xFE,0x01,0xFF,0xFF,0x07,0x00,0xFE,0x00,0xFF,0xE3,0x03,0x00,
0xFC,0x00,0x7F,0xE0,0x03,0xF8,0xFF,0x7F,0x38,0xE0,0xF1,0xFF,0xFF,0x7F,0x38,0xF0,
0xF1,0xFF,0xFF,0x7F,0x78,0xF8,0xF0,0xFF,0xFF,0x7F,0x78,0x7C,0xF0,0x07,0xF0,0x79,
0xF8,0x3E,0x00,0x00,0xF0,0x00,0xF8,0x3F,0x00,0x00,0xF0,0x00,0xF0,0x7F,0x00,0x00,
0xF0,0x00,0xF8,0xFF,0x7F,0x00,0xF8,0x00,0xFF,0xFF,0x3F,0x00,0xF8,0x00,0xFF,0xFF,
0x1F,0x00,0xFC,0x00,0x7F,0xF8,0x07,0x00,0xFE,0x00,0x0F,0x00,0x00,0xC0,0x7F,0x00,
0x00,0x00,0x00,0xFE,0x7F,0x00,0x00,0x00,0xF8,0xFF,0x3F,0x00,0x00,0x00,0xE0,0xFF,
0x1F,0x00,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"好",1*/
};
znsFONT ZN_Font48x48 = {
ZN48x48_Table,
zm48x48_index,
48, /* Width */
48, /* Height */
};
3.3、 main主函数代码
#include "stm32F4xx.h"
#include "stm32f4xx_conf.h"
#include "stdio.h"
#include "bsp_lcd.h"
#include "lcd_show_zn.h"
int16_t select_index = 0;
uint8_t beep_state = 0;
uint8_t led_state = 0;
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
select_index++;
if(select_index>=6)
{
select_index = 0;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
void EXTI15_10_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{
switch(select_index)
{
case 0:
if(beep_state == 0)
{
GPIO_SetBits(GPIOI,GPIO_Pin_11);
beep_state = 1;
}
else
{
GPIO_ResetBits(GPIOI,GPIO_Pin_11);
beep_state = 0;
}
break;
case 1:
if(led_state == 0)
{
LED_Red_Ctrl(LED_ON);
led_state = 1;
}
else
{
LED_Red_Ctrl(LED_OFF);
led_state = 0;
break;
case 2:
LCD_DrawRect(300,200,100,100);
break;
case 3:
LCD_DrawCircle(400,200,50);
break;
case 4:
LCD_FillTriangle(100,200,250,200,220,300);
break;
case 5:
LCD_Clear(LCD_COLOR_BLACK);
break;
}
EXTI_ClearITPendingBit(EXTI_Line13);
}
}
int main(void)
{
GPIO_InitTypeDef gpio_info;
Delay_init();
UART_init(115200);
Adc_init();
key1_init();
key2_init();
LED_init();
LCD_Init();
LCD_LayerInit();
LTDC_Cmd(ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);
gpio_info.GPIO_Mode = GPIO_Mode_OUT;
gpio_info.GPIO_OType = GPIO_OType_PP;
gpio_info.GPIO_Pin = GPIO_Pin_11;
gpio_info.GPIO_PuPd = GPIO_PuPd_UP;
gpio_info.GPIO_Speed = GPIO_Low_Speed;
GPIO_Init(GPIOI,&gpio_info);
LCD_SetZNFont(&ZN_Font16x16);
while(1)
{
LCD_DrawCharCN(340,300,"你好");
}
}
以上即可在液晶显示屏显示自己所想要得字模。
四、补充如何使用 PCtoLCD2002 生成字模字体
4.1、字模软件配置
4.2、设置字体
4.3、生成字体
生成的字体文件保存在工程文件夹中,然后在工程中添加进去引用即可。