linux平台下的6818开发板(ARM)显示屏的字体显示
2021/11/25 7:11:04
本文主要是介绍linux平台下的6818开发板(ARM)显示屏的字体显示,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
软件开发环境: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
这篇关于linux平台下的6818开发板(ARM)显示屏的字体显示的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法