嵌入式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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何使用ThinkPHP6的ORM功能
上一篇 2026年10月24日 10:27:43
Debian FTP Server如何配置自动登录功能
下一篇 2025年11月10日 00:00:33

相关推荐

  • VSCode极简配置LaTeX:中文编译、实时预览、模板管理

    VSCode极简配置LaTeX:中文编译、实时预览、模板管理VSCode极简配置LaTeX:中文编译、实时预览、模板管理VSCode极简配置LaTeX:中文编译、实时预览、模板管理VSCode极简配置LaTeX:中文编译、实时预览、模板管理

    VSCode配置LaTeX,尤其是要兼顾中文编译、实时预览和模板管理,听起来可能有点复杂,但说实话,它比你想象的要简单得多,而且一旦配置好,效率提升是实实在在的。核心在于选对工具、理解几个关键配置项,然后建立一套适合自己的工作流。 解决方案 要让VSCode成为你得心应手的LaTeX写作环境,你需要…

    2026年10月24日 • 用户投稿
    100
  • 小萌新—> Linux高手系列:包管理【二】

    小萌新—> Linux高手系列:包管理【二】小萌新—> Linux高手系列:包管理【二】小萌新—> Linux高手系列:包管理【二】小萌新—> Linux高手系列:包管理【二】

    作为一个有追求的测试工程师,如何从一个运维小萌新成长为一个linux高手?请持续关注我们的《小萌新 -> linux高手系列文章》。 今天这篇文章将为大家详细讲解Shell脚本中的流程控制。 Linux高手系列:包管理【二】”> Shell 脚本介绍 Shell脚本是由一系列…

    2026年10月24日 • 用户投稿
    000
  • 如何在mysql中安装mysql依赖工具

    如何在mysql中安装mysql依赖工具如何在mysql中安装mysql依赖工具如何在mysql中安装mysql依赖工具如何在mysql中安装mysql依赖工具

    安装MySQL需根据操作系统选择对应方式,如Linux用apt或yum,Windows从官网下载Installer,macOS用Homebrew;开发时需安装Python、PHP或Java的数据库连接驱动;可选装MySQL Workbench、Percona Toolkit等管理工具;源码编译时需提…

    2026年10月24日 • 用户投稿
    000
  • Uber的20万容器实践:如何避免容器化环境中的 CPU 节流

    Uber的20万容器实践:如何避免容器化环境中的 CPU 节流Uber的20万容器实践:如何避免容器化环境中的 CPU 节流Uber的20万容器实践:如何避免容器化环境中的 CPU 节流Uber的20万容器实践:如何避免容器化环境中的 CPU 节流

    在 uber,所有的有状态工作负载都在一个跨大型主机的通用容器化平台上运行。这些工作负载包括 mysql®、apache cassandra®、elasticsearch®、apache kafka®、apache hdfs™、redis™、docstore、schemaless 等,许多情况下,这…

    2026年10月24日 • 用户投稿
    1300
  • 如何设置Linux网络桥接 虚拟网络桥接配置步骤

    如何设置Linux网络桥接 虚拟网络桥接配置步骤如何设置Linux网络桥接 虚拟网络桥接配置步骤如何设置Linux网络桥接 虚拟网络桥接配置步骤如何设置Linux网络桥接 虚拟网络桥接配置步骤

    网络桥接是将物理网卡与虚拟接口绑定,使虚拟机或容器能直接接入局域网。1. 安装bridge-utils工具;2. 查看并选择物理网卡如eth0;3. 创建桥接接口br0并添加物理网卡;4. 将ip地址分配给br0并启用接口;5. 修改配置文件实现持久化设置;6. 注意ip冲突、防火墙规则及无线网卡不…

    2026年10月24日 • 用户投稿
    100
  • JDK和JRE有什么区别 Java开发环境该如何正确安装

    安装JDK即可拥有完整Java开发环境,因其包含JRE及开发工具。开发者需下载LTS版本JDK,配置JAVA_HOME与PATH环境变量,并通过java -version和javac -version验证安装,最后以HelloWorld程序测试编译运行功能。 JDK 和 JRE 是 Java 开发和…

    2026年10月24日
    000
  • pymysql使用指南

    pymysql使用指南pymysql使用指南pymysql使用指南pymysql使用指南

    1 引言 mysql应该说是如今使用最为普遍的数据库了,没有之一,而python作为最为流行的语言之一,自然少不了与mysql打交道,pymysql就是使用最多的工具库了。 2 创建库、表 我们先从创建数据库、数据表说起,有了库表,后面的增删改查才有根据。 2.1 创建数据库 pymysql的所有对…

    2026年10月24日 • 用户投稿
    400
  • Linux下通过grep查找指定的进程并杀死

    Linux下通过grep查找指定的进程并杀死Linux下通过grep查找指定的进程并杀死Linux下通过grep查找指定的进程并杀死Linux下通过grep查找指定的进程并杀死

    一、功能简介 linux系统通过命令行查找特定的进程并自动终止其运行。 二、执行命令 2.1 命令行执行 代码语言:javascript代码运行次数:0 运行复制 ps -ef | grep s_app | grep -v grep | awk ‘{print $2}’ | xargs kill -…

    2026年10月24日 • 用户投稿
    100
  • 如何在mysql中设置客户端连接超时

    如何在mysql中设置客户端连接超时如何在mysql中设置客户端连接超时如何在mysql中设置客户端连接超时如何在mysql中设置客户端连接超时

    答案是通过设置MySQL服务端的wait_timeout和interactive_timeout参数来控制客户端连接超时。首先,wait_timeout用于非交互式连接,默认28800秒,可设为600实现10分钟空闲断开;其次,interactive_timeout针对交互式连接如命令行登录,建议与…

    2026年10月24日 • 用户投稿
    600
  • VSCode如何配置Java开发环境 VSCode搭建Java项目的步骤指南

    VSCode如何配置Java开发环境 VSCode搭建Java项目的步骤指南VSCode如何配置Java开发环境 VSCode搭建Java项目的步骤指南VSCode如何配置Java开发环境 VSCode搭建Java项目的步骤指南VSCode如何配置Java开发环境 VSCode搭建Java项目的步骤指南

    要在vscode中进行java开发,首先要安装jdk并配置java_home和path环境变量,确保java -version和javac -version命令能正确输出版本信息;2. 然后在vscode中安装“java extension pack”扩展包,该扩展会自动识别系统jdk并提供语言支持…

    2026年10月24日 • 用户投稿
    600
  • Edge(Linux 版)无法正常同步问题解决

    Edge(Linux 版)无法正常同步问题解决Edge(Linux 版)无法正常同步问题解决Edge(Linux 版)无法正常同步问题解决Edge(Linux 版)无法正常同步问题解决

    大家好,很高兴再次与大家见面,我是你们的朋友全栈君。 今天我来分享一下如何解决在 Ubuntu 18.04.6 LTS 系统上使用 Edge(Linux 版)浏览器时无法正常同步的问题。我曾尝试按照 Edge 浏览器无法同步,正在设置同步的指引进行设置,但问题依然存在。随后,通过对 Edge 浏览器…

    2026年10月24日 • 用户投稿
    000
  • Oracle Linux 下载指南

    Oracle Linux 下载指南Oracle Linux 下载指南Oracle Linux 下载指南Oracle Linux 下载指南

    oracle linux 在设计上针对 oracle 数据库的运行需求对内核参数进行了深度调优,显著增强了数据库在高负载环境下的性能表现与系统稳定性。其安装镜像预集成了构建 rac 架构所需的第三方依赖包,大幅简化了部署流程,避免了在 red hat 或 centos 上需手动安装补丁和组件的复杂操…

    2026年10月24日 • 用户投稿
    300
  • VSCode如何配置电影特效环境 VSCode视觉特效脚本开发技巧

    VSCode如何配置电影特效环境 VSCode视觉特效脚本开发技巧VSCode如何配置电影特效环境 VSCode视觉特效脚本开发技巧VSCode如何配置电影特效环境 VSCode视觉特效脚本开发技巧VSCode如何配置电影特效环境 VSCode视觉特效脚本开发技巧

    要解决vscode配置python环境的问题,首先需正确配置python解释器、激活虚拟环境并成功安装依赖库。1. 若python解释器未正确配置,通过ctrl+shift+p输入python: select interpreter选择正确的解释器;2. 若虚拟环境激活失败,确认已安装venv或co…

    2026年10月24日 • 用户投稿
    100
  • VSCode运行CUDA C++程序 GPU编程VSCode配置教程

    VSCode运行CUDA C++程序 GPU编程VSCode配置教程VSCode运行CUDA C++程序 GPU编程VSCode配置教程VSCode运行CUDA C++程序 GPU编程VSCode配置教程VSCode运行CUDA C++程序 GPU编程VSCode配置教程

    安装与显卡驱动匹配的c++uda toolkit并配置环境变量,确保cuda_home和path正确设置;2. 在vscode中安装c++扩展及cuda相关插件以支持语法高亮和编译运行;3. 编写.cu文件中的cuda代码并使用nvcc命令或配置tasks.json实现自动化编译;4. 通过添加-g…

    2026年10月24日 • 用户投稿
    300
  • 黑客使用新的 Rootkit 攻击银行ATM

    黑客使用新的 Rootkit 攻击银行ATM黑客使用新的 Rootkit 攻击银行ATM黑客使用新的 Rootkit 攻击银行ATM黑客使用新的 Rootkit 攻击银行ATM

    根据the hacker news网站的报道,威胁情报和事件响应公司mandiant发现了一个未知的黑客组织,他们部署了一种针对oracle solaris系统的新型rootkit,旨在破坏atm网络,并使用伪造的银行卡在不同银行进行未经授权的取款。 Mandiant正在追踪代号为UNC2891的黑…

    2026年10月24日 • 用户投稿
    000
  • JNI创建JVM时CLASSPATH设置失效的内存管理陷阱解析

    JNI创建JVM时CLASSPATH设置失效的内存管理陷阱解析JNI创建JVM时CLASSPATH设置失效的内存管理陷阱解析JNI创建JVM时CLASSPATH设置失效的内存管理陷阱解析JNI创建JVM时CLASSPATH设置失效的内存管理陷阱解析

    本文深入探讨了在debian 10上使用jni创建jvm时,通过`-djava.class.path`设置的类路径不生效的问题。核心原因在于c语言局部变量的内存作用域管理不当,导致传递给jvm的类路径字符串指针失效。文章详细分析了问题根源,并提供了基于动态内存分配和变量作用域扩展的两种健壮解决方案,…

    2026年10月24日 • 用户投稿
    600
  • SUSE 成为首个集成 Agentic AI(自主式 AI)的 Linux 企业发行版

    SUSE 成为首个集成 Agentic AI(自主式 AI)的 Linux 企业发行版SUSE 成为首个集成 Agentic AI(自主式 AI)的 Linux 企业发行版SUSE 成为首个集成 Agentic AI(自主式 AI)的 Linux 企业发行版SUSE 成为首个集成 Agentic AI(自主式 AI)的 Linux 企业发行版

    SUSE 正式发布全球首个集成 Agentic AI(自主式人工智能)能力的企业级 Linux 操作系统——SUSE Linux Enterprise Server 16(SLES 16),标志着企业开源平台迈入智能化新阶段。 据官方介绍,SLES 16 是专为 AI 时代打造的下一代企业级 Lin…

    2026年10月24日 • 用户投稿
    100
  • DRIFTINGBLUES:6

    DRIFTINGBLUES:6DRIFTINGBLUES:6DRIFTINGBLUES:6DRIFTINGBLUES:6

    DRIFTINGBLUES: 6靶机介绍下载地址:https://download.vulnhub.com/driftingblues/driftingblues6_vh.ova难度:Easy运行环境:VirtualBox 攻击主机:kali 2021 目标主机:DRIFTINGBLUES: 6 打…

    2026年10月24日 • 用户投稿
    500
  • Linux下搭建Go开发环境(基于vscode)

    Linux下搭建Go开发环境(基于vscode)Linux下搭建Go开发环境(基于vscode)Linux下搭建Go开发环境(基于vscode)Linux下搭建Go开发环境(基于vscode)

    要在linux下开发go语言,并利用已安装的vscode搭建开发环境,首先需要在linux上安装和配置go的sdk。本文将指导您如何在linux下通过vscode搭建go开发环境。 首先,点击下载链接,在”Featured downloads”部分找到适合Linux的go1.…

    2026年10月24日 • 用户投稿
    000
  • 鸿蒙系统与安卓系统的区别

    鸿蒙系统与安卓系统的区别鸿蒙系统与安卓系统的区别鸿蒙系统与安卓系统的区别鸿蒙系统与安卓系统的区别

    华为鸿蒙系统自发布以来已有一年之久,但仍有不少人认为鸿蒙系统不过是安卓系统的换皮版本,类似于小米的miui和华为的emui。诚然,鸿蒙2.0系统的界面与安卓系统相似,但这是否意味着鸿蒙系统就是安卓的换皮呢? 我们都知道,鸿蒙系统和安卓系统一样,采用了AOSP开源代码,而安卓系统自身超过80%的代码也…

    2026年10月24日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信