软件开发环境:ubuntu-18.04\ubuntu-16.04
硬件开发环境:ARM架构下的6818开发板
串口软件:secureCRT(类似于Linux终端下的命令行操作)
通过Linux平台用终端命令进行交叉编译(arm-linux-gcc),形成ARM架构的可运行程序,然后放在6818开发板下进行运行,通过simfang字库的解析文字,然后进行文字的显示,对于一小段文字直接进行显示,当文字比较多比较长时用标准IO的文件进行读写操作,在用Linux平台进行交叉编译时运用数学库进行编译(-lm),对文字进行滚动显示和当前的系统时间的刷新.
运行结果:
主函数:test.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>
#include <stdbool.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include<sys/stat.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <time.h>
#include "font.h"
//LCD显示的位置
void showbitmap(bitmap *bm, int x, int y,char *p)
{
char *q = p + (y*800 + x)*4;
for(int j=0;j<bm->height && j < 480 ;j++)
{
for(int i=0;i<bm->width && i< 800 ;i++)
memcpy(q+(800*4*j)+i*4,bm->map+(bm->width*bm->byteperpixel*j)+
bm->byteperpixel*i,bm->byteperpixel);
}
bzero(bm->map,bm->width*bm->height*bm->byteperpixel);
// 字体的信息:
// 长 bm->width
// 高:bm->height
// 色深:bm->byteperpixel);
// bm->map; 指向RGB数据,没有上下颠倒,也没有一行4字节倍数的约束,就是纯粹的RGB
}
int main(int argc, char const *argv[])
{
int lcd = open("/dev/fb0",O_RDWR);//打开设备
struct fb_var_screeninfo fixinfo; // 固定属性
ioctl(lcd,FBIOGET_VSCREENINFO,&fixinfo); 获取固定属性
unsigned long VWIDTH = fixinfo.xres; //可见区宽度(单位:像素)
unsigned long VHEIGHT = fixinfo.yres; //可见区高度(单位:像素)
unsigned long BPP = fixinfo.bits_per_pixel; //色深
// 申请一块虚拟区大小的映射内存
char *p = mmap(NULL, VWIDTH * VHEIGHT * BPP/8, PROT_WRITE,
MAP_SHARED, lcd, 0);
//清屏
bzero(p,VWIDTH*VHEIGHT*BPP/8);
FILE *fp = fopen("text.txt","r");//只读的方式打开文本文件
if(fp == NULL)
{
perror("打开失败");
exit(0);
}
fseek(fp,0,SEEK_END); //通过光标偏移量获取文件大小;
long Sizelit = ftell(fp);
fseek(fp,0,SEEK_SET);//获取大小后把光标偏移到开始位置
char *Buf=calloc(1,Sizelit);//把读到的数据保存到Buf中
bzero(Buf,Sizelit);
fread(Buf,Sizelit/1000,1000,fp);
// 初始化字库 指定字库文件,比如simfang.ttf
font *f1 = fontLoad("simfang.ttf");
font *f2 = fontLoad("simfang.ttf");
font *f3 = fontLoad("simfang.ttf");
font *f4 = fontLoad("simfang.ttf");
//2.设置字体的大小
fontSetSize(f1, 40);
fontSetSize(f2, 50);
fontSetSize(f3, 40);
fontSetSize(f4, 35);
bitmap *bm1;
bitmap *bm2;
bitmap *bm3;
bitmap *bm4;
//3.设置字体输出框的大小
// 长 高 色深 颜色
bm1 = createBitmapWithInit(800, 50, 4, 0x0000000);
bm2 = createBitmapWithInit(800, 150, 4, 0x0000000);
bm3 = createBitmapWithInit(800, 150, 4, 0x0000000);
bm4 = createBitmapWithInit(800, 100, 4, 0x0000000);
int roll ,roll2;
int i;
while (1)
{
time_t t; //获取系统时间
struct tm *Time;
time(&t);
char buf[50]; //定义buf缓冲区
bzero(buf,50); //清除buf缓冲区里面的数据
Time=localtime(&t);
char *wd[7] = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
//把要输出的数据保存到缓冲区buf
snprintf(buf,50,"%d年%d月%d日 %s %d时%d分%d秒",(1906+Time->tm_year),
(8+Time->tm_mon),(18+Time->tm_mday),
wd[Time->tm_wday],(+Time->tm_hour),
Time->tm_min,Time->tm_sec);
把要输出的内容显示到显示屏上
fontPrint(f1, bm1 ,50 ,5,buf, 0x00FFFF00, 0);
//把要输出的内容显示到显示屏上
fontPrint(f2, bm2,5,40, "出门戴口罩 室内注意通风 勤洗手", 0xFF000000, 0);
//读取Buf里面的数据
fontPrint(f4, bm3,50,i-=2, Buf, 0xFFD70000,750);
fontPrint(f3, bm4,250,50, "--口罩戴一戴幸福下一代", 0xFFD70000, 0);
// i --;
roll -=5;
while (roll <=0) //字幕右移动
{
roll = 800;
}
roll2 +=5;
while (roll2 >=800) //字幕左移动
{
roll2 =0;
}
//bm妥善地放置到LCD上显示出来
showbitmap(bm1, 0, 0, p);
showbitmap(bm2, roll, 50, p);
showbitmap(bm3, 0, 200, p);
showbitmap(bm4, 0, 350, p);
}
return 0;
}
6818开发板显示屏的大小是800*400;
但是也可以通过系统文件里面的结构体获取开发板大小:
如:Linux下的文件路径
/usr/include/linux/fb.h
结构体:
struct fb_fix_screeninfo
{
char id[16]; /* identification string eg "TT Builtin" */
unsigned long smem_start; /* Start of frame buffer mem */
/* (physical address) */
__u32 smem_len; /* Length of frame buffer mem */
__u32 type; /* see FB_TYPE_* */
__u32 type_aux; /* Interleave for interleaved Planes */
__u32 visual; /* see FB_VISUAL_* */
__u16 xpanstep; /* zero if no hardware panning */
__u16 ypanstep; /* zero if no hardware panning */
__u16 ywrapstep; /* zero if no hardware ywrap */
__u32 line_length; /* length of a line in bytes */
...
...
};
struct fb_var_screeninfo
{
__u32 xres; /* 可见区宽度(单位:像素) */
__u32 yres; /* 可见区高度(单位:像素) */
__u32 xres_virtual; /* 虚拟区宽度(单位:像素) */
__u32 yres_virtual; /* 虚拟区高度(单位:像素) */
__u32 xoffset; /* 虚拟区到可见区x轴偏移量 */
__u32 yoffset; /* 虚拟区到可见区y轴偏移量 */
__u32 bits_per_pixel; /* 色深 */
// 像素内颜色结构
struct fb_bitfield red; // 红色
struct fb_bitfield green; // 绿色
struct fb_bitfield blue; // 蓝色
struct fb_bitfield transp;// 透明度
...
...
};
struct fb_bitfield
{
__u32 offset; /* 颜色在像素内偏移量 */
__u32 length; /* 颜色占用数位长度 */
...
...
};
还有几个比较大的源文件用来解析simfang.ttf字库,显示大小,颜色一系列操作,这里我就不放上去了,运行时simfang.ttf字库和文本文件要放到指定目录下,不然读取不到字库
链接:百度网盘https://pan.baidu.com/s/1vny6FHYEf5PlwHpGH_38fg https://pan.baidu.com/s/1vny6FHYEf5PlwHpGH_38fg
提取码:bzbz