嵌入式Linux下完成LCD屏文字显示(帧缓冲框架)

1.前言

帧缓冲框架是linux下专门为显示类设备设计的接口,目的是将硬件和软件层分离开,方便应用层的编程,也方便应用层程序移植。帧缓冲框架向驱动层和应用层分别提供了一套标准接口,驱动层按照框架编写驱动,应用层按照框架编写应用程序。帧缓冲在/dev目录下生成的标准节点是fb,比如:/dev/fb0,/dev/fb1等等。

这篇文章就介绍在应用层 如何利用帧缓冲框架接口封装LCD屏的画点函数,获取LCD屏的硬件信息,完成对LCD屏编程,实现文字、数字显示。当期的文字采用点阵方式取模来完成显示,比较简单,与单片机上的LCD编程思路一样,可以更方便快速学习帧缓冲编程。后续正常开发中一般采用矢量字库完成字体显示,大小调整方便,字体更换方法,在前面文章有介绍过嵌入式Linux如何交叉编译freetype库。

嵌入式Linux下完成LCD屏文字显示(帧缓冲框架)

2. 编程思路

下面是帧缓冲框架图:

嵌入式Linux下完成LCD屏文字显示(帧缓冲框架)
嵌入式Linux下完成LCD屏文字显示(帧缓冲框架)

帧缓冲设备是标准的字符设备,通过open函数打开设备,再通过ioctl接口获取LCD屏的一些硬件参数信息,在利用mmap函数映射LCD屏的地址到应用层。映射的这个地址就相当于是LCD屏的显存地址,对这个地址里写入数据就可以在LCD屏硬件上实时显示出来。

代码语言:javascript代码运行次数:0运行复制

int fd=open("/dev/fb0",O_RDWR);if(fd<0){perror("设备文件打开失败");return 0;}/*1. 获取LCD屏的可变形参*/ioctl(fd,FBIOGET_VSCREENINFO,&var);printf("分辨率:%d*%dn",var.xres,var.yres);printf("像素点位数:%dn",var.bits_per_pixel);/*2. 获取LCD屏的固定形参*/ioctl(fd,FBIOGET_FSCREENINFO,&fix);printf("映射的长度:%dn",fix.smem_len);printf("一行的字节数:%dn",fix.line_length);/*3. 映射LCD缓冲区地址到进程空间*/fb_mem=mmap(NULL,fix.smem_len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if(fb_mem==NULL){perror("空间映射失败!n");return 0;}

在应用mmap函数将驱动的DMA缓冲区地址映射到进程空间之后,如何控制LCD呢? 为了方便对LCD屏进行操作,需要封装一个画点函数。然后后续的图片显示,文字显示,其他图形显示都基于这个画点函数来完成,程序就很好设计。

当前采用的LCD屏是800*480分辨率,24位像素,通过这些参数就可以编写一个公式,封装画点函数。

白果AI论文 白果AI论文

论文AI生成学术工具,真实文献,免费不限次生成论文大纲 10 秒生成逻辑框架,10 分钟产出初稿,智能适配 80+学科。支持嵌入图表公式与合规文献引用

白果AI论文 61 查看详情 白果AI论文

嵌入式Linux下完成LCD屏文字显示(帧缓冲框架)

下面是封装好的函数原型:fb_mem是LCD屏映射的地址,后面的参数是获取的LCD屏硬件参数信息。

代码语言:javascript代码运行次数:0运行复制

/*函数功能: 画点*/void Show_Pixel(int x,int y,int color){unsigned int *lcd=(unsigned int *)(fb_mem+y*var.xres*var.bits_per_pixel/8+x*var.bits_per_pixel/8);*lcd=color; //颜色赋值}

有了画点函数,就可以封装中文显示函数: 下面这个函数是针对横向取模的点阵字模进行描点的,其他取模方式根据情况修改即可。

代码语言:javascript代码运行次数:0运行复制

/*函数功能: 显示中文说明:  取模的字体是按照横向取模进行取点阵码。       取模的字体宽度是8的倍数。*/void ShowFont(int x,int y,int size,unsigned char *data){int i,j,x0=x;unsigned char tmp;for(i=0;i<size/8*size;i++){tmp=data[i];for(j=0;j<8;j++){if(tmp&0x80)Show_Pixel(x0,y,0xFF0033);//else 画背景色x0++;tmp<<=1;}if(x0-x==size){y++;x0=x;}}}

中文可以显示,照着思路再封装一个字母数字的显示接口:

代码语言:javascript代码运行次数:0运行复制

/*函数功能:  显示一个ASCII码。“空格开始 到  ~ 结束” !"#$%&'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~说明: ASCII码取模 宽度和高度必须是8的倍数,传入的size(高) */void ShowASCII(int x,int y,int size,unsigned char c_data){int i,j,x0=x;unsigned char data;int cnt;if(c_data '~')return; cnt=c_data-' ';for(i=0;i<size/2/8*size;i++){ switch(size) {case 16:break; case 32:data=ASCII_16_32[cnt][i];break; } for(j=0;j<8;j++) { if(data&0x80)Show_Pixel(x0,y,0xFF0033); x0++; data<<=1; } if(x0-x==size/2) { x0=x; y++; }}}

3. 完整示例代码3.1 中文显示

下面这份代码是单个汉字取模进行显示的,代码较少,整体比较简单。

代码语言:javascript代码运行次数:0运行复制

#include #include #include #include #include #include #include #include #include struct fb_var_screeninfo var;//可变参数struct fb_fix_screeninfo fix;//固定参数unsigned char *fb_mem=NULL; //LCD屏的首地址extern unsigned char font[];/*函数功能: 画点*/void Show_Pixel(int x,int y,int color){unsigned int *lcd=(unsigned int *)(fb_mem+y*var.xres*var.bits_per_pixel/8+x*var.bits_per_pixel/8);*lcd=color; //颜色赋值}/*函数功能: 显示中文说明:  取模的字体是按照横向取模进行取点阵码。       取模的字体宽度是8的倍数。*/void ShowFont(int x,int y,int size,unsigned char *data){int i,j,x0=x;unsigned char tmp;for(i=0;i<size/8*size;i++){tmp=data[i];for(j=0;j<8;j++){if(tmp&0x80)Show_Pixel(x0,y,0xFF0033);//else 画背景色x0++;tmp<<=1;}if(x0-x==size){y++;x0=x;}}}int main(int argc,char **argv){int fd=open("/dev/fb0",O_RDWR);if(fd<0){perror("设备文件打开失败");return 0;}/*1. 获取LCD屏的可变形参*/ioctl(fd,FBIOGET_VSCREENINFO,&var);printf("分辨率:%d*%dn",var.xres,var.yres);printf("像素点位数:%dn",var.bits_per_pixel);/*2. 获取LCD屏的固定形参*/ioctl(fd,FBIOGET_FSCREENINFO,&fix);printf("映射的长度:%dn",fix.smem_len);printf("一行的字节数:%dn",fix.line_length);/*3. 映射LCD缓冲区地址到进程空间*/fb_mem=mmap(NULL,fix.smem_len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if(fb_mem==NULL){perror("空间映射失败!n");return 0;}/*4. 控制显示屏*/memset(fb_mem,0xFFFFFF,fix.smem_len); //将屏幕清屏为白色ShowFont(100+0*56,100,56,font);ShowFont(100+1*56,100,56,font+7*56*1);ShowFont(100+2*56,100,56,font+7*56*2);munmap(fb_mem,fix.smem_len);close(fd);return 0;}unsigned char font[]={ /*--  文字:  嵌  --*//*--  幼圆42;  此字体下对应的点阵为:宽x高=56x56   --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x03,0x80,0x00,0x7C,0x00,0x03,0x80,0x07,0xC0,0x00,0x7C,0x00,0x03,0xC0,0x07,0xC0,0x00,0x7C,0x00,0x03,0xC0,0x07,0xC0,0x00,0x7C,0x00,0x03,0xC0,0x07,0xC0,0x00,0x7C,0x00,0x03,0xC0,0x07,0xC0,0x00,0x7C,0x00,0x03,0xC0,0x07,0xC0,0x00,0x7C,0x00,0x03,0xC0,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0x07,0x00,0xF0,0x00,0x00,0x01,0xE0,0x0F,0x01,0xF0,0x00,0x00,0x01,0xE0,0x0F,0x01,0xF0,0x00,0x00,0x01,0xE0,0x0F,0x01,0xE0,0x00,0x00,0x01,0xE0,0x0F,0x01,0xE0,0x00,0x00,0x1F,0xFF,0xFF,0xF3,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xFB,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xFB,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xE7,0xC3,0x80,0x7C,0x01,0xE0,0x0F,0x07,0x87,0x80,0x7C,0x01,0xE0,0x0F,0x0F,0x87,0x80,0x7C,0x01,0xE0,0x0F,0x0F,0x87,0x80,0x78,0x01,0xE0,0x0F,0x1F,0x07,0x80,0x78,0x01,0xE0,0x0F,0x1F,0x07,0x80,0xF8,0x01,0xE0,0x0F,0x3E,0x07,0x80,0xF8,0x01,0xE0,0x0F,0x3E,0x07,0x80,0xF0,0x01,0xE0,0x0F,0x3C,0x07,0x81,0xF0,0x01,0xE0,0x0F,0x3C,0x07,0x81,0xE0,0x01,0xE0,0x0F,0x00,0x07,0x83,0xE0,0x01,0xFF,0xFF,0x00,0x07,0xC3,0xC0,0x01,0xFF,0xFF,0x00,0x07,0xC0,0x00,0x01,0xFF,0xFF,0x00,0x0F,0xE0,0x00,0x01,0xFF,0xFF,0x00,0x0F,0xE0,0x00,0x01,0xE0,0x0F,0x00,0x0F,0xF0,0x00,0x01,0xE0,0x0F,0x00,0x1E,0xF0,0x00,0x01,0xE0,0x0F,0x00,0x1E,0xF8,0x00,0x01,0xE0,0x0F,0x00,0x3E,0x78,0x00,0x01,0xE0,0x0F,0x00,0x7C,0x7C,0x00,0x01,0xE0,0x0F,0x00,0x78,0x3E,0x00,0x01,0xE0,0x0F,0x00,0xF8,0x1E,0x00,0x01,0xE0,0x0F,0x01,0xF0,0x1F,0x00,0x01,0xE0,0x0F,0x03,0xE0,0x0F,0x80,0x01,0xE0,0x0F,0x07,0xE0,0x07,0xC0,0x01,0xE0,0x0F,0x0F,0xC0,0x03,0xE0,0x01,0xE0,0x0F,0x1F,0x80,0x01,0xF0,0x01,0xFF,0xFF,0x3F,0x00,0x01,0xF8,0x00,0xFF,0xFF,0x7E,0x00,0x00,0xFC,0x00,0x7F,0xFE,0x78,0x00,0x00,0x3C,0x00,0x00,0x00,0x70,0x00,0x00,0x18,/*--  文字:  入  --*//*--  幼圆42;  此字体下对应的点阵为:宽x高=56x56   --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x7B,0xC0,0x00,0x00,0x00,0x00,0x00,0xFB,0xE0,0x00,0x00,0x00,0x00,0x00,0xF1,0xE0,0x00,0x00,0x00,0x00,0x00,0xF1,0xE0,0x00,0x00,0x00,0x00,0x01,0xF1,0xF0,0x00,0x00,0x00,0x00,0x01,0xE0,0xF0,0x00,0x00,0x00,0x00,0x03,0xE0,0xF8,0x00,0x00,0x00,0x00,0x03,0xC0,0xF8,0x00,0x00,0x00,0x00,0x07,0xC0,0x7C,0x00,0x00,0x00,0x00,0x07,0x80,0x7C,0x00,0x00,0x00,0x00,0x0F,0x80,0x3C,0x00,0x00,0x00,0x00,0x0F,0x00,0x3E,0x00,0x00,0x00,0x00,0x1F,0x00,0x1E,0x00,0x00,0x00,0x00,0x1E,0x00,0x1F,0x00,0x00,0x00,0x00,0x3E,0x00,0x0F,0x00,0x00,0x00,0x00,0x7C,0x00,0x0F,0x80,0x00,0x00,0x00,0x7C,0x00,0x07,0xC0,0x00,0x00,0x00,0xF8,0x00,0x07,0xC0,0x00,0x00,0x01,0xF0,0x00,0x03,0xE0,0x00,0x00,0x01,0xE0,0x00,0x01,0xE0,0x00,0x00,0x03,0xE0,0x00,0x01,0xF0,0x00,0x00,0x07,0xC0,0x00,0x00,0xF8,0x00,0x00,0x0F,0x80,0x00,0x00,0xF8,0x00,0x00,0x1F,0x00,0x00,0x00,0x7C,0x00,0x00,0x1F,0x00,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x7C,0x00,0x00,0x00,0x1F,0x00,0x00,0xF8,0x00,0x00,0x00,0x0F,0x80,0x01,0xF0,0x00,0x00,0x00,0x07,0xC0,0x03,0xE0,0x00,0x00,0x00,0x03,0xE0,0x07,0xC0,0x00,0x00,0x00,0x03,0xF0,0x0F,0x80,0x00,0x00,0x00,0x01,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0xFC,0x1E,0x00,0x00,0x00,0x00,0x00,0x7C,0x1C,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*--  文字:  式  --*//*--  幼圆42;  此字体下对应的点阵为:宽x高=56x56   --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xEF,0x80,0x00,0x00,0x00,0x00,0x01,0xEF,0xE0,0x00,0x00,0x00,0x00,0x01,0xEF,0xF0,0x00,0x00,0x00,0x00,0x01,0xE3,0xFC,0x00,0x00,0x00,0x00,0x01,0xE0,0xFF,0x00,0x00,0x00,0x00,0x01,0xF0,0x7F,0x80,0x00,0x00,0x00,0x01,0xF0,0x1F,0xC0,0x00,0x00,0x00,0x00,0xF0,0x07,0xC0,0x00,0x00,0x00,0x00,0xF0,0x03,0xC0,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x0F,0xFF,0xFF,0xFE,0x3C,0x00,0x00,0x0F,0xFF,0xFF,0xFE,0x3C,0x00,0x00,0x0F,0xFF,0xFF,0xFE,0x3C,0x00,0x00,0x00,0x00,0xF0,0x00,0x3C,0x00,0x00,0x00,0x00,0xF0,0x00,0x3E,0x00,0x00,0x00,0x00,0xF0,0x00,0x3E,0x00,0x00,0x00,0x00,0xF0,0x00,0x1E,0x00,0x00,0x00,0x00,0xF0,0x00,0x1E,0x00,0x00,0x00,0x00,0xF0,0x00,0x1E,0x00,0x00,0x00,0x00,0xF0,0x00,0x1F,0x00,0x00,0x00,0x00,0xF0,0x00,0x0F,0x00,0x00,0x00,0x00,0xF0,0x00,0x0F,0x00,0x00,0x00,0x00,0xF0,0x00,0x0F,0x80,0x00,0x00,0x00,0xF0,0x00,0x0F,0x80,0x18,0x00,0x00,0xF0,0x00,0x07,0x80,0x3C,0x00,0x00,0xF0,0x00,0x07,0x80,0x3C,0x00,0x00,0xF0,0x00,0x07,0xC0,0x3C,0x00,0x00,0xF0,0x00,0x03,0xC0,0x3C,0x00,0x00,0xF0,0x03,0xC3,0xE0,0x3C,0x00,0x00,0xF0,0x1F,0xC1,0xE0,0x3C,0x00,0x00,0xF1,0xFF,0xC1,0xF0,0x3C,0x00,0x00,0xFF,0xFF,0x01,0xF0,0x3C,0x00,0x01,0xFF,0xF8,0x00,0xF8,0x3C,0x00,0x0F,0xFF,0x80,0x00,0xF8,0x7C,0x01,0xFF,0xFC,0x00,0x00,0x7C,0x7C,0x1F,0xFF,0xC0,0x00,0x00,0x3F,0x78,0x3F,0xFC,0x00,0x00,0x00,0x1F,0xF8,0x3F,0xC0,0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x01,0xE0};

3.2 调用字库显示

单个汉字取模太麻烦,可以使用点阵字库取模软件,然后程序里打开字库,读取字模进行绘制,下面的示例代码就是采用字库读取字模完成汉字显示。

代码语言:javascript代码运行次数:0运行复制

#include #include #include #include #include #include #include #include #include #include #include #include struct fb_var_screeninfo var;//可变参数struct fb_fix_screeninfo fix;//固定参数unsigned char *fb_mem=NULL; //LCD屏的首地址unsigned char *fb_GBK=NULL; //GBK字库的首地址extern unsigned char font[];extern const unsigned char ASCII_16_32[95][64];/*函数功能: 画点*/void Show_Pixel(int x,int y,int color){unsigned int *lcd=(unsigned int *)(fb_mem+y*var.xres*var.bits_per_pixel/8+x*var.bits_per_pixel/8);*lcd=color; //颜色赋值}/*函数功能: 显示中文说明:  取模的字体是按照横向取模进行取点阵码。       取模的字体宽度是8的倍数。*/void ShowFont(int x,int y,int size,unsigned char *font){unsigned char L,H;    unsigned int Addr;    unsigned int font_size=size*size/8; //得到该字节的总字节大小    unsigned char FontData[128];          //最大可以存放32*32尺寸字体点阵码unsigned char *GBK_p; //存放汉字点阵码首地址    /*计算该汉字在字库里的地址偏移量*/    L=*(font+1); //低字节    H=*font;     //高字节    if(L<0x7f)L=L-0x40;    else L=L-0x41;    H=H-0x81;    Addr=(190*H+L)*font_size; //得到当前汉字在字库里的偏移量GBK_p=(unsigned char *)(Addr+fb_GBK); //得到汉字点阵码在字库里首地址int i,j,x0=x;unsigned char tmp;for(i=0;i<size/8*size;i++){tmp=GBK_p[i];for(j=0;j<8;j++){if(tmp&0x80)Show_Pixel(x0,y,0xFF0033);//else 画背景色x0++;tmp<<=1;}if(x0-x==size){y++;x0=x;}}}/*函数功能:  显示一个ASCII码。“空格开始 到  ~ 结束” !"#$%&'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~说明: ASCII码取模 宽度和高度必须是8的倍数,传入的size(高) */void ShowASCII(int x,int y,int size,unsigned char c_data){int i,j,x0=x;unsigned char data;int cnt;if(c_data '~')return; cnt=c_data-' ';for(i=0;i<size/2/8*size;i++){ switch(size) {case 16:break; case 32:data=ASCII_16_32[cnt][i];break; } for(j=0;j<8;j++) { if(data&0x80)Show_Pixel(x0,y,0xFF0033); x0++; data<<=1; } if(x0-x==size/2) { x0=x; y++; }}}int main(int argc,char **argv){if(argc!=2){printf("./app n");return 0;}int fd=open("/dev/fb0",O_RDWR);if(fd<0){perror("设备文件打开失败");return 0;}/*1. 获取LCD屏的可变形参*/ioctl(fd,FBIOGET_VSCREENINFO,&var);printf("分辨率:%d*%dn",var.xres,var.yres);printf("像素点位数:%dn",var.bits_per_pixel);/*2. 获取LCD屏的固定形参*/ioctl(fd,FBIOGET_FSCREENINFO,&fix);printf("映射的长度:%dn",fix.smem_len);printf("一行的字节数:%dn",fix.line_length);/*3. 映射LCD缓冲区地址到进程空间*/fb_mem=mmap(NULL,fix.smem_len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if(fb_mem==NULL){perror("空间映射失败!n");return 0;}/*4. 映射GBK字库文件到进程空间*/int gbk_fb;struct stat gbk_buf;gbk_fb=open(argv[1],2);if(gbk_fb<0){perror("GBK字库文件打开失败!");return 0;}stat(argv[1],&gbk_buf);printf("GBK字库文件大小=%dn",gbk_buf.st_size);fb_GBK=mmap(NULL,gbk_buf.st_size,PROT_READ,MAP_SHARED,gbk_fb,0);if(fb_GBK==NULL){perror("空间映射失败!n");return 0;}/*4. 控制显示屏*/memset(fb_mem,0xFFFFFF,fix.smem_len); //将屏幕清屏为白色ShowFont(100+0*32,100,32,"嵌");ShowFont(100+1*32,100,32,"入");ShowFont(100+2*32,100,32,"式");ShowFont(100+3*32,100,32,"开");ShowFont(100+4*32,100,32,"发");ShowASCII(100+0*16,200,32,'A');ShowASCII(100+1*16,200,32,'C');ShowASCII(100+2*16,200,32,'B');munmap(fb_mem,fix.smem_len);close(fd);return 0;}

以上就是嵌入式Linux下完成LCD屏文字显示(帧缓冲框架)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/299677.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月5日 00:18:46
下一篇 2025年11月5日 00:23:36

相关推荐

  • 怎样用JavaScript使用RaspberryPi?

    在raspberry pi上使用javascript开发需要安装node.js。步骤如下:1. sudo apt-get update 2. sudo apt-get install nodejs npm。安装后,可使用onoff模块控制gpio端口,如点亮led灯。 用JavaScript在Ras…

    2025年12月20日
    000
  • 如何在IntelliJ IDEA中高效查找YAML配置文件中的特定属性?

    在intellij idea中高效查找yaml配置文件中的特定属性是开发过程中常见且重要的任务。假设你需要在众多yaml文件中查找a.b.c.d.e这个属性,idea提供了一种高效的结构化数据搜索功能,帮助你快速找到所需的内容。以下是详细的操作步骤: 打开搜索窗口:使用快捷键Ctrl Shift F…

    2025年12月20日
    000
  • 在 IntelliJ IDEA 中如何高效查找 YAML 配置文件中的特定属性 a.b.c.d.e?

    在 intellij idea 中高效查找 yaml 配置文件中的特定属性 a.b.c.d.e 时,可以采用以下策略来简化搜索过程: 首先,利用 IDEA 的结构化数据搜索功能。具体操作如下: 按下 Ctrl + Shift + F(Windows/Linux)或 Command + Shift +…

    2025年12月20日
    000
  • 如何在IntelliJ IDEA中高效查找YAML文件中的特定属性a.b.c.d.e?

    在IntelliJ IDEA中高效查找YAML文件中的特定属性 在开发过程中,我们经常需要在多个YAML配置文件中查找特定的属性。假设我们需要查找属性a.b.c.d.e,以下是一些在IntelliJ IDEA中快速找到它的有效方法。 首先,IDEA提供了一种专门用于搜索结构化数据的功能。我们可以通过…

    2025年12月20日
    000
  • 在 IntelliJ IDEA 中如何高效查找 YAML 文件中的特定属性 a.b.c.d.e?

    在使用 intellij idea 进行开发时,如何高效地查找 yaml 文件中的特定属性 a.b.c.d.e 是一个常见的问题。idea 提供了专门的结构化数据搜索功能,帮助开发者快速定位所需的属性。以下是两种有效的查找方法: 使用正则表达式搜索嵌套属性: 通过按下 Ctrl Shift F(Wi…

    2025年12月20日
    000
  • 如何在IntelliJ IDEA中高效查找YAML配置文件中的嵌套属性?

    在intellij idea中高效查找yaml配置文件中的嵌套属性,可以显著提高开发效率。让我们看看如何通过idea的强大搜索功能来简化这个过程。 当你需要在众多YAML配置文件中查找像a.b.c.d.e这样的嵌套属性时,以下步骤可以帮助你高效地进行搜索: 启动搜索窗口:使用快捷键Ctrl Shif…

    2025年12月20日
    000
  • 在Spring Boot项目中,如何确保FFmpeg和OpenCV的so文件在打包后正确加载?

    在spring boot项目中确保ffmpeg和opencv的so文件在打包后正确加载的详细指南如下: 在使用Spring Boot 3开发项目时,已经集成了FFmpeg 7.1-1.5.11和OpenCV 4.10.0-1.5.11,并通过JavaCPP和JavaCV库实现了视频处理功能。虽然在开…

    2025年12月20日 好文分享
    000
  • 在SpringBoot项目中如何确保FFmpeg和OpenCV的so依赖在打包后正确加载?

    在SpringBoot项目中如何确保FFmpeg和OpenCV的so依赖在打包后正确加载? 在开发过程中,经常会遇到将FFmpeg和OpenCV集成到SpringBoot项目中的情况,尤其是当项目需要处理视频和图像时。然而,开发环境和生产环境之间的差异常常导致库文件加载问题。本文将详细探讨如何在Sp…

    2025年12月20日
    000
  • 在Spring Boot项目中如何正确加载FFmpeg和OpenCV的so依赖?

    在spring boot项目中正确加载ffmpeg和opencv的so依赖是一个常见的问题。以下是基于java 21和spring boot 3版本的详细指南,介绍如何在打包后的项目中正确加载这些本地库。 我们首先来看一下项目的依赖配置和打包后的jar包结构: 项目依赖配置(pom.xml): 1.…

    2025年12月20日
    000
  • 怎么在 Opera 浏览器中测试 js 功能

    在 opera 浏览器中测试 javascript 功能可以通过以下步骤实现:1) 打开 devtools(ctrl + shift + i 或 cmd + option + i),2) 在“console”标签页输入或粘贴代码并执行,3) 使用“source”标签页设置断点进行调试,4) 利用“a…

    2025年12月20日
    000
  • 怎么在 Firefox 开发者工具中查看 js 执行情况

    在 firefox 中查看 javascript 执行情况可以通过以下步骤实现:1. 打开开发者工具(f12 或 ctrl + shift + i/windows/linux,或 cmd + option + i/mac)。2. 使用调试器标签设置断点并逐步执行代码,观察变量变化。3. 利用性能标签…

    2025年12月20日
    000
  • Vue项目图片Windows下无法加载,Linux下正常:如何排查及解决?

    Vue项目图片:Windows系统加载失败,Linux系统正常运行 本文分析Vue项目在Windows系统下部分图片无法加载,但在Linux系统下正常显示的问题,并提供相应的排查和解决方法。 问题出现于皮肤切换功能实现后,且无报错信息,这提示问题并非图片路径错误或Vue加载机制本身的问题,而是与操作…

    2025年12月20日
    000
  • Linux下saveRainRcd接口连接失败,Windows却正常?如何解决?

    Linux系统与Windows系统下saveRainRcd接口连接差异及解决方案 本文分析了在Linux系统下调用saveRainRcd接口连接失败,但在Windows系统下却能正常运行的问题。 问题现象:前端使用GET请求提交数据,当savestr数组长度超过15条时,Linux系统下的nginx…

    2025年12月20日
    000
  • 剧作家:浏览器自动化和测试指南

    关注我的GitHub新项目! 简介 Playwright是一个强大的浏览器自动化库,用于快速、可靠且跨浏览器的测试。它支持Chromium、Firefox和WebKit,是自动化Web交互、测试应用程序和提升UI可靠性的理想工具。本指南涵盖以下内容: 安装和配置Playwright编写和运行测试处理…

    2025年12月19日
    000
  • 掌握PostgreSQL:初学者&#s指南

    postgresql:免费开源数据库管理系统详解及入门指南 PostgreSQL是一款免费的开源对象关系数据库管理系统(ORDBMS),在众多组织(尤其初创企业)的后端开发中广受欢迎和信赖。它兼容多种后端框架,例如Flask、Django、Node.js和Java Spring Boot。其主要优势…

    2025年12月19日 好文分享
    000
  • 像专业人士一样调试:专家技术每个开发人员都必须掌握

    调试是软件开发的不可避免的一部分。虽然初学者开发人员通常依靠基本的打印语句或简单的断点,但是掌握高级调试技术可以大大提高您的效率,并使您成为更有效的问题解决方案。在本文中,我们将探讨每个软件工程师都应该知道的10种功能强大的调试技术。 1。二进制搜索调试 >而不是检查整个代码库,而是使用二进制…

    好文分享 2025年12月19日
    000
  • 如何将Ollama整合到Nextjs中

    利用ollama和next.js构建llm驱动应用 人工智能和大语言模型(LLM)正以前所未有的速度改变着我们的生活。新的模型和集成方案(例如AI代理和运营商)层出不穷,加入这个激动人心的浪潮势在必行。本文将指导您如何将Ollama与Next.js集成,构建基于LLM的应用程序。我们将学习如何下载开…

    2025年12月19日
    000
  • 货币化开源:可持续发展策略

    开源软件已彻底改变了科技领域,推动了创新、协作和透明度。然而,许多开发者和组织仍然面临着开源项目财务可持续性的巨大挑战。本文探讨了多种开源项目盈利策略,并参考了开放薪酬令牌许可证(OCTL)白皮书。 引言 开源项目的货币化是指在保持开放性和社区合作原则的同时,寻找创收途径。有效的货币化策略能够确保项…

    2025年12月19日
    000
  • ENV文件要考虑的OST重要事项列表

    大型项目开发中,.env 文件的管理至关重要。本文总结了六个最佳实践,帮助您在开发和生产环境中安全有效地使用 .env 文件。 1. .env 文件权限设置: 大多数 Web 应用(如 React.js、Laravel 或 Node.js)都使用 .env 文件存储环境变量。 Linux 系统默认隐…

    2025年12月19日
    000
  • 面试中最问的操作系统问题最高

    操作系统核心概念详解 本文将深入探讨操作系统关键概念,帮助您理解其运作机制。 什么是操作系统? 操作系统是管理计算机硬件和软件资源的系统软件,它充当用户与硬件之间的桥梁,提供用户友好的界面和各种服务。 多任务处理的概念: 多任务处理允许计算机同时运行多个程序或任务,提高效率。操作系统通过时间片轮转等…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信