Linux教程

linux平台下的6818开发板(ARM)显示屏的字体显示

本文主要是介绍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 icon-default.png?t=LA92https://pan.baidu.com/s/1vny6FHYEf5PlwHpGH_38fg 
提取码:bzbz

这篇关于linux平台下的6818开发板(ARM)显示屏的字体显示的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!