本文以嵌入式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] != '