您当前的位置: 首页 >  嵌入式

正点原子

暂无认证

  • 1浏览

    0关注

    382博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【正点原子Linux连载】第二十四章在LCD上显示字符 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

正点原子 发布时间:2021-08-25 15:36:32 ,浏览量:1

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 效果图:

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

关注
打赏
1665308814
查看更多评论
立即登录/注册

微信扫码登录

0.3384s