基于嵌入式Linux的LCD液晶点阵显示的基本实现

2019-07-12 18:58发布

本文以嵌入式Linux为板载系统。写一个测试LCD液晶点阵的小例子,在这个小例子当中主要实现液晶点阵的中文和英文实现。

一、前期准备工作

1、基本开发环境

PC机 : Ubuntu9.10 gcc版本 : gcc version 4.3.2 板载系统 :Linux(kernel version Linux-3.4.10)

2、字体文件的准备

因为本测试程序要实现液晶点阵的中英文两种实现方式,所以需要两种点阵字体。 英文字体来自Linux内核中的drivers/video/console/font_8X16.c的fontdata_8X16这个数组当中。 中文字体来自于网络下载的字体文件HZK16,可以从这个地址下载得到。

二、打开LCD驱动设备文件和HZK16点阵字体文件

在打开设备文件之前,定义一些全局变量方便测试程序的编写,具体如下: /* 一些全局变量的定义 */ int fd_fb; // LCD设备驱动的文件句柄 struct fb_var_screeninfo var; // 定义LCD的可变参数 struct fb_fix_screeninfo fix; // 定义LCD的固定参数 int screen_size; // 表示整个屏幕所占显存的大小 int line_width; // 表示屏幕每一行所占显存的大小 int pixel_width; // 表示每个像素点所占显存的大小 char *fbmem; // 表示显存的起始地址 int fd_hzk16; // HZK16汉字库的文件句柄 struct stat hzk16_stat; // 描述HZK16这个文件的状态信息 char *hzk16mem; // HZK16这个汉字库映射到内存的起始地址

1、打开LCD驱动设备文件

打开LCD设备驱动来获取液晶的可变参数,固定参数,以及将液晶显存映射到用户空间,具体实现如下所示: /* 以可读可写方式打开LCD液晶驱动 */ fd_fb = open("/dev/fb0", O_RDWR); if(fd_fb == -1) { printf("can't open /dev/fb0! "); return -1; } /* 获取LCD液晶的可变参数 */ ret = ioctl(fd_fb, FBIOGET_VSCREENINFO, &var); if(ret == -1) { printf("can't ioctl for /dev/fb0! "); return -1; } /* 获取LCD液晶的固定参数 */ ret = ioctl(fd_fb, FBIOGET_FSCREENINFO, &fix); if(ret == -1) { printf("can't ioctl for /dev/fb0! "); return -1; } /* 获取液晶显存,每一行显存,每一个像素显存的大小 */ screen_size = var.xres * var.yres * var.bits_per_pixel / 8; line_width = var.xres * var.bits_per_pixel / 8; pixel_width = var.bits_per_pixel / 8; /* 将液晶显存映射到用户空间 */ fbmem = mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0); if(fbmem == (char *)-1) { printf("mmap for /dev/fb0 error! "); return -1; }

2、打开HZK16点阵字体文件

打开HZK16文件来将HZK16字库的内容映射到程序的用户空间,方便对字体文件的操作,具体实现如下: /* 以只读方式打开汉子库HZK16这个文件 */ fd_hzk16 = open("HZK16", O_RDONLY); if(fd_hzk16 == -1) { printf("can't open HZK16! "); return -1; } /* 获取HZk16这个汉字库的文件信息 */ ret = fstat(fd_hzk16, &hzk16_stat); if(ret == -1) { printf("fstat for HZK16 is error! "); return -1; } /* 将汉子库HZK16文件中的内容映射到用户空间 */ hzk16mem = mmap(NULL, hzk16_stat.st_size, PROT_READ, MAP_SHARED, fd_hzk16, 0); if(hzk16mem == (char *)-1) { printf("mmap for HZK16 error! "); return -1; }

三、液晶点阵的基本操作的实现

1、LCD液晶显示英文字符串

这个函数的具体实现如下: /* LCD显示英文字符串 * x : 表示x轴坐标 * y : 表示y轴坐标 * str : 表示显示的字符串的首地址 */ void lcd_show_string(int x, int y, char* str) { int i = 0; for(i = 0; str[i] != '