【Linux下6818开发板(ARM)】在液晶屏上显示RGB颜色和BMP图片

这篇具有很好参考价值的文章主要介绍了【Linux下6818开发板(ARM)】在液晶屏上显示RGB颜色和BMP图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • (꒪ꇴ꒪ ),hello我是祐言
  • 博客主页:C语言基础,Linux基础,软件配置领域博主🌍
  • 快上🚘,一起学习!
  • 送给读者的一句鸡汤🤔:
  • 集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

        在嵌入式系统的开发中,我们经常需要在液晶屏上显示一些信息,如文本、图片等。在本篇文章中,我将解析两个C语言的例程,这些例程分别用于在液晶屏上显示不同的RGB颜色和显示BMP图片。

一、在液晶屏上显示RGB颜色

        RGB颜色想必大家都懂吧,简单介绍一下:

        RGB是一种用于表示颜色的色彩模型,它是英文单词"Red(红色)"、"Green(绿色)"和"Blue(蓝色)"的缩写。在RGB色彩模型中,每种颜色由红色、绿色和蓝色三个分量的不同强度组成,通过调整这三个分量的数值,可以得到各种不同的颜色。

        在RGB色彩模型中,每个颜色分量的取值范围通常是0到255。数值为0表示没有该颜色分量,而数值为255表示该颜色分量的最大强度。因此,RGB颜色可以用一个三元组(R, G, B)来表示,其中R表示红色分量的强度,G表示绿色分量的强度,B表示蓝色分量的强度。

        例如,纯红色的RGB颜色表示为(255, 0, 0),即红色分量为最大强度,而绿色和蓝色分量均为0。类似地,纯绿色的RGB颜色表示为(0, 255, 0)纯蓝色的RGB颜色表示为(0, 0, 255),我们通常在编程中用0x00ff0000的十六进制表示红色

        通过调整RGB颜色的三个分量的数值,可以得到各种不同的颜色,包括所有可见的颜色。由于RGB色彩模型在计算机图形和显示技术中得到广泛应用,所以它是最常用的色彩模型之一。

        下面来看一下综合例程:

//在屏幕上交替的显示红绿蓝三色
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <errno.h>		
#include <time.h>		
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/fb.h>		//帧缓冲设备的结构体定义在这个里面

#define LCDDEV		"/dev/fb0"			
#define LCDSIZE  800*480*4

struct color {
    unsigned int red;
    unsigned int green;
    unsigned int blue;
};
	
void input_color(int *lcd_buf, int color)
{
	int x, y;
	for ( y=0; y<480; y++)
	{
		for(x=0; x<800; x++)
		{
			lcd_buf[y*800 + x] = color;	
		}
	}
}

void output_color(int color)
{
	// 1. 打开液晶屏设备
	int lcd_fd = open(LCDDEV, O_RDWR);
	if(lcd_fd == -1)
	{
		perror("open lcd fail");
		exit(errno);
	}
	
	// 给液晶屏文件映射一块内存
	// void *mmap(void *addr, size_t len, int prot, int flags,int fildes, off_t off); 
	int *fb = mmap(NULL, LCDSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);
	if(fb == MAP_FAILED)
	{
		perror("mmap fail");
		exit(errno);
	}
	
	int lcd_buf[800*480] ={0}; 
	
	input_color(lcd_buf,color);
	
	memcpy(fb,lcd_buf,LCDSIZE);
	
	
	// 3. 关闭液晶屏
	munmap(fb, LCDSIZE);
	close(lcd_fd);

}				
int main(int argc, char *argv[])
{

    // 2. 初始化颜色值
    struct color rgb = { .red = 0x00ff0000, .green = 0x0000ff00, .blue = 0x000000ff };
	
	
	while(1)
	{
		output_color(rgb.red);
		sleep(1);
		output_color(rgb.green);
		sleep(1);
		output_color(rgb.blue);
		sleep(1);
		
	}
	
	return 0;
}

        这个代码的主要思路是,首先定义一个颜色结构体,然后创建一个颜色缓冲区,将颜色数据填充到缓冲区中,最后将缓冲区的内容写入到液晶屏设备中。

        在代码中,我们首先定义了一个颜色结构体struct color,它包含了3个成员:红色、绿色和蓝色。然后,我们定义了一个input_color函数,该函数的主要作用是将颜色数据填充到颜色缓冲区中。output_color函数则负责将颜色缓冲区的内容写入到液晶屏设备中。

        在main函数中,我们首先初始化了颜色的值,然后在一个无限循环中,不断的将红色、绿色和蓝色的颜色信息写入到液晶屏设备中,每次写入后暂停1秒。

【Linux下6818开发板(ARM)】在液晶屏上显示RGB颜色和BMP图片,6818开发板实战(ARM),linux,运维,服务器

二、在液晶屏上显示BMP图片

        这个操作就像把大象放进冰箱需要几步这个问题一样,第一步打开液晶屏,第二步导入bmp格式的图片,第三步关闭液晶屏,顺着这个思路我们很快就能写出如下程序,当然细节处怎么做到还需自己研究一下哦,其实很简单,主要用到了像素转换的思想

        像素转换代码:color = bmp_buf[k] | bmp_buf[k+1]<<8 | bmp_buf[k+2]<<16;

  • 在这个循环中,我们使用ij变量遍历每个像素点的行和列,同时使用k变量来遍历bmp_buf缓冲区,处理每个像素的BGR颜色数据。
  • 由于BMP图像是BGR顺序存储的,我们通过位运算将3个字节的颜色数据合成为一个32位的像素颜色值。
  • 位运算操作的目的是将BGR颜色数据拼接成一个32位整数的颜色值,其中高8位为0(alpha通道,不透明度),接下来8位为红色值,再接下来8位为绿色值,最低8位为蓝色值。

        另外还需搞清楚,BMP图片的像素数据是从左到右,从下到上存储的,而液晶屏的读取是从左往右,从上往下,刚好是上下颠倒。

#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <errno.h>		
#include <time.h>		
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/fb.h>		//帧缓冲设备的结构体定义在这个里面

#define LCDDEV		"/dev/fb0"			
	
void show_bmp(char *name)
{
	// 1. 打开液晶屏设备
	int lcd_fd = open(LCDDEV, O_RDWR);
	if(lcd_fd == -1)
	{
		perror("open lcd fail");
		exit(errno);
	}

	int bmp_fd = open(name, O_RDONLY);
	if(bmp_fd == -1)
	{
		perror("open bmp fail");
		exit(errno);
	}
	
	// 给液晶屏文件映射一块内存
	// void *mmap(void *addr, size_t len, int prot, int flags,int fildes, off_t off);
           // 
	int *fb = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);
	if(fb == MAP_FAILED)
	{
		perror("mmap fail");
		exit(errno);
	}

	// 先跳过54字节的文件头和信息头
	lseek(bmp_fd, 54, SEEK_SET);
	
	// 读取位图数据(图像的BGR颜色数据))
	char bmp_buf[800*480*3] = {0};
	read(bmp_fd, bmp_buf, 800*480*3);
	
	int i, j, k = 0;
	int color = 0;
	
	//液晶屏的扫描方式是:从上到下,从左到右
	//而bmp图像数据的存储方式是:从左到右,从下到上
	//所以要反着写入,就能解决翻转问题
	for (i = 479; i >= 0; i--) {
		for (j = 0; j < 800; j++) {
			color = bmp_buf[k] | bmp_buf[k + 1] << 8 | bmp_buf[k + 2] << 16;// 像素转换
			k += 3;
			fb[i * 800 + j] = color;// 写入液晶屏
		}
	}

	
	munmap(fb, 800*480*4);
	close(bmp_fd);
	// 3. 关闭液晶屏
	close(lcd_fd);
	
}

	
		
int main(int argc, char *argv[])
{
		
	if (argc != 2) {
        printf("Usage: %s <picture> \n", argv[0]);
        return 1;
    }

	show_bmp(argv[1]);
	return 0;
}

        例程的主要思路是,首先打开BMP图片文件和液晶屏设备,然后读取BMP图片的像素数据,将这些像素数据写入到液晶屏的缓冲区中,最后将缓冲区的内容写入到液晶屏设备中。

        在代码中,我们首先打开了液晶屏设备和BMP图片文件,然后创建了一个映射,这个映射将液晶屏设备的内存映射到了进程的地址空间。接着,我们从BMP图片文件中读取像素数据,将这些数据写入到液晶屏的缓冲区中。最后,我们将缓冲区的内容写入到液晶屏设备中。

【Linux下6818开发板(ARM)】在液晶屏上显示RGB颜色和BMP图片,6818开发板实战(ARM),linux,运维,服务器

三、运行

        有了代码那怎么运行呢,其实之前的博客里也教过,但是还是凑点字数,多说说,只要需要用 rz -y命令把可执行文件传给开发板就行。

【Linux下6818开发板(ARM)】在液晶屏上显示RGB颜色和BMP图片,6818开发板实战(ARM),linux,运维,服务器

         什么?又不会编译了,看这里:

        【Linux下6818开发板(ARM)】在液晶屏上显示RGB颜色和BMP图片,6818开发板实战(ARM),linux,运维,服务器

        传统就是arm-linux-gcc ,那么快捷方法就是用alias命令把它变成一个快捷指令ag。 

四、总结

        通过这两个例程,我们可以看到在C语言中如何操作液晶屏设备,如何将颜色和图片显示到液晶屏上。这些例程提供了一个很好的起点,让我们能够理解如何在嵌入式系统中进行液晶屏的编程。希望这个文章能对你有所帮助,如果你有任何问题,欢迎在评论区留言。

        更多C语言Linux系统相关文章,关注专栏:

   手撕C语言

            玩转linux文章来源地址https://www.toymoban.com/news/detail-716266.html

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

到了这里,关于【Linux下6818开发板(ARM)】在液晶屏上显示RGB颜色和BMP图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32之LCD液晶屏(ILI9341)显示图片

    本文章基于STM32F103VET6,参考野火的驱动程序,用LCD液晶屏显示静态图像。 有纰漏请指出,转载请说明。 学习交流请发邮件 1280253714@qq.com 显示一个像素点 将rgb888图片转为rgb555 输出rgb555的C语言数组 数组的每一个元素对应一个像素点的rgb三个通道的数据,用stm32的FSMC模拟8080时

    2024年02月09日
    浏览(42)
  • 关于配置tft液晶屏时,屏幕不显示遇到的问题

    本人新手小白,在使用单片机配置tft屏幕时,发现屏幕一直显示白屏(如下图)。但是仔细检查多遍后都无法找到问题所在,于是在CSDN上搜索了很久都没有发现类似问题的解决方法。无奈只能重新回到代码上寻找原因,终于功夫不负有心人让我找到了问题并成功解决。以下向

    2024年02月16日
    浏览(42)
  • 第八讲 单片机驱动彩色液晶屏 控制RA8889软件:显示图片

    目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控制RA8889软件:绘图 第五讲 单片机驱动彩色液

    2024年01月22日
    浏览(49)
  • 第七讲 单片机驱动彩色液晶屏 控制RA8889软件:显示文字:Part3.自建字库

    目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控制RA8889软件:绘图 第五讲 单片机驱动彩色液

    2024年01月21日
    浏览(46)
  • 51单片机LCD1602液晶屏显示字符,字符串,(有)无符号整数,十六进制数,二进制数等

    LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在嵌入式应用系统中得到越来越广泛的应用,这讲中向大家介绍的LCD1602 液晶显示模块(其内部控制器为HD44780 芯片),它可以显示两行,每行16 个字

    2024年02月04日
    浏览(64)
  • FPGA输出lvds信号点亮液晶屏

            该方案用于生成RGB信号,通过lvds接口驱动逻辑输出,点亮并驱动BP101WX-206液晶屏幕。 参考:下面为参考文章,内容非常详细。 Xilinx LVDS Output——原语调用_vivado原语_ShareWow丶的博客 http://t.csdn.cn/Zy37p         MMCM模块为时钟模块,负责将系统时钟变频与输出,产

    2024年02月09日
    浏览(48)
  • 物联网开发笔记(89)- 使用Micropython开发ESP32开发板之合宙ESP32 C3开发板通过串口SPI控制st7789 TFT液晶屏1.3寸

    一、目的         这一节我们学习如何使用合宙的ESP32 C3开发板控制1.3寸彩色TFT显示屏模块,分辨率240*240,SPI接口,ST7789驱动芯片。 二、环境         ESP32  C3 + Thonny + 1.3寸 st7789液晶屏模块 + 几根杜邦线 + Win10 接线方法:   三、st7789 TFT显示屏驱动 st7789py.py   四、点亮

    2024年02月11日
    浏览(50)
  • 51单片机学习笔记-12LCD1602液晶屏

    [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注:工程及代码文件放在了本人的Github仓库。 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字

    2024年02月11日
    浏览(49)
  • RK3568 OpenHarmony4.0适配HDMI液晶屏

            先看下最终适配效果视频: OpenHarmony_V40_HDMI液晶屏         本文基于如下开发环境进行开发调试: 处理器:RK3568 CPU:四核64位Cortex-A55,主频最高达2.0GHz GPU:ARM G52 2EE,支持OpenGL ES 1.1/2.0/3.2,OpenCL 2.0,Vulkan 1.1,支持内嵌高性能2D加速硬件 NPU:支持1T算力 多媒体

    2024年02月02日
    浏览(69)
  • 【雕爷学编程】Arduino动手做(113)---5110液晶屏模块

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)

    2024年02月09日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包