1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子Linux感兴趣的同学可以加群讨论:935446741 4)关注正点原子公众号,获取最新资料更新
第二十四章在LCD上显示字符 前面几个章节向大家介绍了如何在LCD屏上显示图像,本章我们就来学习下,如何在LCD屏上显示字符,譬如数字、字母以及中文字符等,相信很多读者都已经迫不及待的想要了解了。OK,废话不多说直接开干!
本章将会讨论如下主题。 使用原始的方式:自己取模显示字符 使用freetype访问字体文件; freetype简介; freetype移植; freetype的使用介绍。
24.1原始方式:取模显示字符 LCD显示屏是由width * height个像素点构成的,显示字符,一个非常容易想到的方法便是对字符取模,然后在LCD屏上打点显示字符;如果大家以前学习过单片机,想必接触过一些显示屏,譬如oled、或者其它一些点阵式的显示屏,其实这些显示屏显示字符的原理都是一样的,如下所示:
图 24.1.1 字符点阵图 我们可以通过一些字符取模软件获取到字符的子模;所谓子模,其实就是一个二维数组,用于表示字符点阵中,哪些小方块应该要填充颜色、哪些小方块不填充颜色。譬如上图“正”字符点阵,这是一个宽度为64(64个小方块)、高度为86(86个小方块)的字符点阵,我们会使用一个二维数组来表示这个字符点阵: unsigned char arr[86][8]; 也就是一个86行8列的unsigned char类型数组,数组存储的其实就是字符的位图数据,字符点阵中的每一个小方块对应一个bit位,因为一行一共有64个小方块、也就对应8个字节(8 * 8 = 64);将填充颜色的方块使用1表示、不填充颜色的方块使用0来表示,所以一个小方块刚好可以使用一个bit位来描述。 以上给大家简单地介绍了字符点阵的问题,相信绝大部分读者都知道这些基础的东西,其实本不太想讲这些内容,但是考虑到可能有些读者确实就真的没接触这些,所以还是简单地提一下。 我们编写一个简单的程序去测试下,网上有很多的这种字符取模的小软件,大家可以找一下,我们用这个取模软件,获取几个字符的子模,然后在我们的LCD屏上去显示这些字符。 编写应用程序 本例程源码对应的路径为:开发板光盘->11、Linux C应用编程例程源码->24_freetype->show_char.c。 示例代码 24.1.1 以取模打点方式在LCD上显示字符 /*************************************************************** Copyright © ALIENTEK Co., Ltd. 1998-2021. All rights reserved. 文件名 : show_character.c 作者 : 邓涛 版本 : V1.0 描述 : 使用取模软件获取字符的子模,在LCD上显示字符 其他 : 无 论坛 : www.openedv.com 日志 : 初版 V1.0 2021/7/09 邓涛创建 ***************************************************************/
#include #include #include #include #include #include #include #include #include #include #include #include
#define FB_DEV “/dev/fb0” //LCD设备节点
static int width; //LCD宽度 static int height; //LCD高度 static unsigned short *screen_base = NULL;//LCD显存基地址
static unsigned char ch_char1[86][8] = { {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,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,0x00,0x00,0x00,0x00,0x00,0x00}, {0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07}, {0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07}, {0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07}, {0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07}, {0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07}, {0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07}, {0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07}, {0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07}, {0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07}, {0x00,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0x00,0x00,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0xFF,0xFF,0xFF,0x01}, {0x00,0xFC,0x07,0xC0,0xFF,0xFF,0xFF,0x01}, {0x00,0xFC,0x07,0xC0,0xFF,0xFF,0xFF,0x01}, {0x00,0xFC,0x07,0xC0,0xFF,0xFF,0xFF,0x01}, {0x00,0xFC,0x07,0xC0,0xFF,0xFF,0xFF,0x01}, {0x00,0xFC,0x07,0xC0,0xFF,0xFF,0xFF,0x01}, {0x00,0xFC,0x07,0xC0,0xFF,0xFF,0xFF,0x01}, {0x00,0xFC,0x07,0xC0,0xFF,0xFF,0xFF,0x01}, {0x00,0xFC,0x07,0xC0,0xFF,0xFF,0xFF,0x01}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0x00,0xFC,0x07,0xC0,0x7F,0x00,0x00,0x00}, {0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {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,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/“正”,0/ };
static unsigned char ch_char2[86][8] = { {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,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,0xFC,0x07,0x00,0x00,0x00}, {0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x00}, {0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x00}, {0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x00}, {0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x00}, {0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0x0F}, {0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0x0F}, {0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0x0F}, {0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0x0F}, {0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0x0F}, {0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0x0F}, {0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0x0F}, {0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0x0F}, {0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x00}, {0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x00}, {0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x00}, {0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x00}, {0x00,0x00,0x00,0xFC,0x07,0x00,0x00,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0x01,0x00,0x00,0xC0,0x7F,0x00}, {0x00,0xFF,0x01,0x00,0x00,0xC0,0x7F,0x00}, {0x00,0xFF,0x01,0x00,0x00,0xC0,0x7F,0x00}, {0x00,0xFF,0x01,0x00,0x00,0xC0,0x7F,0x00}, {0x00,0xFF,0x01,0x00,0x00,0xC0,0x7F,0x00}, {0x00,0xFF,0x01,0x00,0x00,0xC0,0x7F,0x00}, {0x00,0xFF,0x01,0x00,0x00,0xC0,0x7F,0x00}, {0x00,0xFF,0x01,0x00,0x00,0xC0,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00}, {0x00,0x01,0x00,0x00,0xC0,0x00,0x7C,0x00}, {0x00,0x0F,0x00,0x03,0xF8,0x00,0x7F,0x00}, {0x80,0x3F,0xF0,0x03,0xFF,0x81,0xFF,0x00}, {0x80,0xFF,0xFC,0x03,0xFE,0x81,0xFF,0x00}, {0xC0,0x7F,0xFC,0x07,0xFE,0x03,0xFF,0x01}, {0xC0,0x7F,0xF8,0x07,0xFC,0x03,0xFF,0x01}, {0xE0,0x3F,0xF8,0x0F,0xFC,0x07,0xFE,0x01}, {0xE0,0x3F,0xF0,0x0F,0xFC,0x07,0xFE,0x03}, {0xF0,0x1F,0xF0,0x0F,0xF8,0x07,0xFE,0x03}, {0xF0,0x1F,0xF0,0x1F,0xF8,0x0F,0xFC,0x07}, {0xF8,0x0F,0xE0,0x1F,0xF8,0x0F,0xFC,0x07}, {0xF8,0x0F,0xE0,0x1F,0xF0,0x0F,0xF8,0x0F}, {0xFC,0x07,0xE0,0x3F,0xF0,0x1F,0xF8,0x0F}, {0xFC,0x07,0xE0,0x3F,0xF0,0x1F,0xF0,0x1F}, {0xFC,0x03,0xC0,0x0F,0xE0,0x03,0xF0,0x07}, {0xF0,0x03,0xC0,0x00,0x60,0x00,0xE0,0x01}, {0xE0,0x01,0x00,0x00,0x00,0x00,0x20,0x00}, {0x80,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,0x00,0x00,0x00,0x00,0x00},/“点”,1/ };
static unsigned char ch_char3[86][8] = { {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,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}, {0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F}, {0x80,0x7F,0x00,0x80,0xFF,0x00,0x00,0x00}, {0x80,0x7F,0x00,0xC0,0x7F,0x00,0x00,0x00}, {0x80,0x7F,0x00,0xC0,0x7F,0x00,0x00,0x00}, {0x80,0x7F,0x00,0xC0,0x3F,0x00,0x00,0x00}, {0x80,0x7F,0x00,0xE0,0x3F,0x00,0x00,0x00}, {0x80,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0x80,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0x80,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0x80,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0x80,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0x80,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0x80,0x7F,0xF8,0x07,0x00,0x00,0xFE,0x01}, {0x80,0x7F,0xF8,0x07,0x00,0x00,0xFE,0x01}, {0x80,0x7F,0xF8,0x07,0x00,0x00,0xFE,0x01}, {0x80,0x7F,0xF8,0x07,0x00,0x00,0xFE,0x01}, {0x80,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0x80,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0x80,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0x80,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0x80,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0x80,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0x80,0x7F,0xF8,0x07,0x00,0x00,0xFE,0x01}, {0x80,0x7F,0xF8,0x07,0x00,0x00,0xFE,0x01}, {0x80,0x7F,0xF8,0x07,0x00,0x00,0xFE,0x01}, {0x80,0x7F,0xF8,0x07,0x00,0x00,0xFE,0x01}, {0xC0,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0xC0,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0xC0,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0xC0,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0xC0,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0xC0,0x7F,0xF8,0xFF,0xFF,0xFF,0xFF,0x01}, {0xC0,0x3F,0x00,0x00,0xFC,0x07,0x06,0x00}, {0xC0,0x3F,0x80,0x00,0xFC,0x07,0x07,0x00}, {0xC0,0x3F,0x80,0x03,0xFC,0x87,0x0F,0x00}, {0xE0,0x3F,0xC0,0x07,0xFC,0xE7,0x1F,0x00}, {0xE0,0x3F,0xE0,0x1F,0xFC,0xF7,0x3F,0x00}, {0xE0,0x3F,0xF0,0x3F,0xFC,0xE7,0x7F,0x00}, {0xE0,0x1F,0xF0,0x3F,0xFC,0xE7,0xFF,0x00}, {0xF0,0x1F,0xF8,0x1F,0xFC,0xC7,0xFF,0x00}, {0xF0,0x1F,0xFC,0x0F,0xFC,0x87,0xFF,0x01}, {0xF0,0x1F,0xFE,0x0F,0xFC,0x07,0xFF,0x03}, {0xF0,0x1F,0
xFF,0x07,0xFC,0x07,0xFF,0x07},
{0xF8,0x8F,0xFF,0x03,0xFC,0x07,0xFE,0x0F},
{0xF8,0x8F,0xFF,0x01,0xFE,0x07,0xFC,0x0F},
{0xFC,0xCF,0xFF,0xFF,0xFF,0x07,0xF8,0x1F},
{0xFC,0xE7,0xFF,0xFE,0xFF,0x07,0xF8,0x0F},
{0xFE,0xC7,0x7F,0xFE,0xFF,0x03,0xF0,0x07},
{0xFE,0x83,0x3F,0xFC,0xFF,0x03,0xE0,0x03},
{0xF8,0x03,0x1F,0xFC,0xFF,0x03,0xE0,0x00},
{0xF0,0x03,0x0E,0xFC,0xFF,0x01,0x40,0x00},
{0xE0,0x01,0x04,0xFC,0xFF,0x00,0x00,0x00},
{0xC0,0x00,0x00,0xFC,0x3F,0x00,0x00,0x00},
{0x80,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,0x00,0x00,0x00,0x00,0x00,0x00},/*"原",2*/
};
static unsigned char ch_char4[86][8] = {
{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,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},
{0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00},
{0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00},
{0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00},
{0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00},
{0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00},
{0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00},
{0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00},
{0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00},
{0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x00},
{0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00},
{0x00,0x00,0x00,0x00,0xC0,0xFF,0x1F,0x00},
{0x00,0x00,0x00,0x00,0xF0,0xFF,0x07,0x00},
{0x00,0x00,0x00,0x00,0xF8,0xFF,0x03,0x00},
{0x00,0x00,0x00,0x00,0xFE,0xFF,0x00,0x00},
{0x00,0x00,0x00,0x80,0xFF,0x7F,0x00,0x00},
{0x00,0x00,0x00,0xC0,0xFF,0x1F,0x00,0x00},
{0x00,0x00,0x00,0xF0,0xFF,0x07,0x00,0x00},
{0x00,0x00,0x00,0xF8,0xFF,0x03,0x00,0x00},
{0x00,0x00,0x00,0xF8,0xFF,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F},
{0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F},
{0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F},
{0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F},
{0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F},
{0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F},
{0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F},
{0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0x00},
{0x00,0x00,0x00,0xFC,0x0F,0x00,0x00,0x00},
{0x00,0x10,0x00,0xFE,0x0F,0x00,0x00,0x00},
{0x00,0xF0,0xFF,0xFF,0x0F,0x00,0x00,0x00},
{0x00,0xF0,0xFF,0xFF,0x0F,0x00,0x00,0x00},
{0x00,0xE0,0xFF,0xFF,0x0F,0x00,0x00,0x00},
{0x00,0xE0,0xFF,0xFF,0x07,0x00,0x00,0x00},
{0x00,0xE0,0xFF,0xFF,0x07,0x00,0x00,0x00},
{0x00,0xE0,0xFF,0xFF,0x03,0x00,0x00,0x00},
{0x00,0xC0,0xFF,0xFF,0x01,0x00,0x00,0x00},
{0x00,0xC0,0xFF,0xFF,0x00,0x00,0x00,0x00},
{0x00,0xC0,0xFF,0x3F,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,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"子",3*/
};
#define argb8888_to_rgb565(color) ({ \
unsigned int temp = (color); \
((temp & 0xF80000UL) >> 8) | \
((temp & 0xFC00UL) >> 5) | \
((temp & 0xF8UL) >> 3); \
})
/********************************************************************
* 函数名称: lcd_draw_character
* 功能描述: 在LCD屏指定位置处(x, y)画字符, 参数color指定字符的颜色
指针ch指向字符对应的子模数组、参数w、h分别表示字符的宽度和高度
* 输入参数: color
* 返 回 值: 无
********************************************************************/
static void lcd_draw_character(unsigned int x, unsigned int y,
const unsigned char *ch, unsigned int w,
unsigned int h, unsigned int color)
{
unsigned short rgb565_color = argb8888_to_rgb565(color);//得到RGB565颜色值
unsigned long temp;
unsigned int end_x, end_y;
int j;
int columns;
/**
计算出二维数组有多少列
参数w表示的是字符的宽度,1个宽度表示的是1个bit位
并不是一个字节,这里要注意,如果宽度不是byte单位的整数倍
通常会补零
**/
columns = w / 8; //1byte=8bit
if (0 != w % 8) columns++;
/* 对参数进行限定 */
if (w = height) return;
/* 计算出结束坐标位置 */
end_x = x + w - 1;
end_y = y + h - 1;
/* 对结束坐标位置进行限定 */
if (end_x >= width)
end_x = width - 1;
if (end_y >= height)
end_y = height - 1;
/* 计算有效宽度 */
h = end_y - y + 1;
w = end_x - x + 1;
/* 打点 */
temp = y * width + x; //定位到起点
for (y = 0; y 8) | \
((temp & 0xFC00UL) >> 5) | \
((temp & 0xF8UL) >> 3); \
})
static unsigned int width; //LCD宽度
static unsigned int height; //LCD高度
static unsigned short *screen_base = NULL;//LCD显存基地址 RGB565
static unsigned long screen_size;
static int fd = -1;
static FT_Library library;
static FT_Face face;
static int fb_dev_init(void)
{
struct fb_var_screeninfo fb_var = {0};
struct fb_fix_screeninfo fb_fix = {0};
/* 打开framebuffer设备 */
fd = open(FB_DEV, O_RDWR);
if (0 > fd) {
fprintf(stderr, "open error: %s: %s\n", FB_DEV, strerror(errno));
return -1;
}
/* 获取framebuffer设备信息 */
ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);
ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix);
screen_size = fb_fix.line_length * fb_var.yres;
width = fb_var.xres;
height = fb_var.yres;
/* 内存映射 */
screen_base = mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (MAP_FAILED == (void *)screen_base) {
perror("mmap error");
close(fd);
return -1;
}
/* LCD背景刷成黑色 */
memset(screen_base, 0xFF, screen_size);
return 0;
}
static int freetype_init(const char *font, int angle)
{
FT_Error error;
FT_Vector pen;
FT_Matrix matrix;
float rad; //旋转角度
/* FreeType初始化 */
FT_Init_FreeType(&library);
/* 加载face对象 */
error = FT_New_Face(library, font, 0, &face);
if (error) {
fprintf(stderr, "FT_New_Face error: %d\n", error);
exit(EXIT_FAILURE);
}
/* 原点坐标 */
pen.x = 0 * 64;
pen.y = 0 * 64; //原点设置为(0, 0)
/* 2x2矩阵初始化 */
rad = (1.0 * angle / 180) * M_PI; //(角度转换为弧度)M_PI是圆周率
#if 0 //非水平方向
matrix.xx = (FT_Fixed)( cos(rad) * 0x10000L);
matrix.xy = (FT_Fixed)(-sin(rad) * 0x10000L);
matrix.yx = (FT_Fixed)( sin(rad) * 0x10000L);
matrix.yy = (FT_Fixed)( cos(rad) * 0x10000L);
#endif
#if 1 //斜体 水平方向显示的
matrix.xx = (FT_Fixed)( cos(rad) * 0x10000L);
matrix.xy = (FT_Fixed)( sin(rad) * 0x10000L);
matrix.yx = (FT_Fixed)( 0 * 0x10000L);
matrix.yy = (FT_Fixed)( 1 * 0x10000L);
#endif
/* 设置 */
FT_Set_Transform(face, &matrix, &pen);
FT_Set_Pixel_Sizes(face, 50, 0); //设置字体大小
return 0;
}
static void lcd_draw_character(int x, int y,
const wchar_t *str, unsigned int color)
{
unsigned short rgb565_color = argb8888_to_rgb565(color);//得到RGB565颜色值
FT_GlyphSlot slot = face->glyph;
size_t len = wcslen(str); //计算字符的个数
long int temp;
int n;
int i, j, p, q;
int max_x, max_y, start_y, start_x;
// 循环加载各个字符
for (n = 0; n bitmap_top; //计算字形轮廓上边y坐标起点位置 注意是减去bitmap_top
if (0 > start_y) {//如果为负数 如何处理??
q = -start_y;
temp = 0;
j = 0;
}
else { // 正数又该如何处理??
q = 0;
temp = width * start_y;
j = start_y;
}
max_y = start_y + slot->bitmap.rows;//计算字形轮廓下边y坐标结束位置
if (max_y > (int)height)
max_y = height;
for (; j bitmap_left; //起点位置要加上左边空余部分长度
if (0 > start_x) {
p = -start_x;
i = 0;
}
else {
p = 0;
i = start_x;
}
max_x = start_x + slot->bitmap.width;
if (max_x > (int)width)
max_x = width;
for (; i bitmap.buffer[q * slot->bitmap.width + p])
screen_base[temp + i] = rgb565_color;
}
}
//调整到下一个字形的原点
x += slot->advance.x / 64; //26.6固定浮点格式
y -= slot->advance.y / 64;
}
}
int main(int argc, char *argv[])
{
/* LCD初始化 */
if (fb_dev_init())
exit(EXIT_FAILURE);
/* freetype初始化 */
if (freetype_init(argv[1], atoi(argv[2])))
exit(EXIT_FAILURE);
/* 在LCD上显示中文 */
int y = height * 0.25;
lcd_draw_character(50, 100, L"路漫漫其修远兮,吾将上下而求索", 0x000000);
lcd_draw_character(50, y+100, L"莫愁前路无知己,天下谁人不识君", 0x9900FF);
lcd_draw_character(50, 2*y+100, L"君不见黄河之水天上来,奔流到海不复回", 0xFF0099);
lcd_draw_character(50, 3*y+100, L"君不见高堂明镜悲白发,朝如青丝暮成雪", 0x9932CC);
/* 退出程序 */
FT_Done_Face(face);
FT_Done_FreeType(library);
munmap(screen_base, screen_size);
close(fd);
exit(EXIT_SUCCESS);
}
编译方法: ${CC} -o testApp testApp.c -I/home/dt/tools/freetype/include/freetype2 -L/home/dt/tools/freetype/lib -lfreetype -L/home/dt/tools/zlib/lib -lz -L/home/dt/tools/png/lib -lpng -lm 效果图: