day27-LCD开发板操作(2022.2.24)

2022-12-02 14:40:05 浏览数 (2)

================== 1.LCD认识 =====================

——》 液晶显示屏。

3个基本概念: 1.像素:图像显示的最小单位,单个像素只能显示1个颜色。 三原色RGB:红、绿、蓝颜色分量。 (范围:0~255,0000 0000b~1111 1111b,0x00~0xFF,占用8位->1字节) 如纯红色: 100% 0% 0% 纯绿色: 0% 100% 0% 纯黄色: 100% 100% 0% 纯白色: 100% 100% 100% 结论—》在内存中表示RGB至少需要3字节(24位) 2.分辨率:横向和纵向像素点的乘积。720P 1080P 2K 4K 8K (6818开发板屏幕分辨率:800*480) 3.色彩深度: RGB:24位 (6818开发板屏幕色深aRGB:32位=24位RGB 8位灰度)

开发板LCD屏幕也是文件: ——》“/dev/fb0“

把大象塞冰箱,分几步?(把像素点塞入LCD屏幕) 1.打开冰箱门 ——》打开屏幕设备文件 open() 2.把大象塞进去 ——》将像素点写入到LCD中 write() 3.关闭冰箱门 ——》关闭设备 close() 大象:像素点颜色(int) 冰箱:LCD屏幕

1.demo1_循环显示3个颜色.c

代码语言:javascript复制
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int main()
{
	// 1.	打开冰箱门	——》打开屏幕设备文件
	int lcd_fd;
	lcd_fd = open("/dev/fb0", O_RDWR);
	if(lcd_fd == -1)
	{
		perror("open lcd failed");
		return -1;
	}

	// 2.	把大象塞进去	——》将像素点写入到LCD中	
	int color_red   = 0x00FF0000;	// 纯红色16进制表示aRGB
	int color_green = 0x0000FF00;	// 纯绿色16进制表示aRGB
	int color_blue  = 0x000000FF;	// 纯蓝色16进制表示aRGB

	int x, y;
	while(1)
	{
		lseek(lcd_fd, 0, SEEK_SET);
		for(y=0; y<480; y  )
			for(x=0; x<800; x  )
				write(lcd_fd, &color_red, 4);
		sleep(1);

		lseek(lcd_fd, 0, SEEK_SET);
		for(y=0; y<480; y  )
			for(x=0; x<800; x  )
				write(lcd_fd, &color_green, 4);
		sleep(1);

		lseek(lcd_fd, 0, SEEK_SET);
		for(y=0; y<480; y  )
			for(x=0; x<800; x  )
				write(lcd_fd, &color_blue, 4);
		sleep(1);
	}

	// 3.	关闭冰箱门	——》关闭设备				
	close(lcd_fd);

	return 0;
}

2.demo2_mmap显示.c

代码语言:javascript复制
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int main()
{
	// 1.	打开冰箱门	——》打开屏幕设备文件
	int lcd_fd;
	lcd_fd = open("/dev/fb0", O_RDWR);
	if(lcd_fd == -1)
	{
		perror("open lcd failed");
		return -1;
	}
		// 显存映射(int *类型表示操作对象是像素点)
	int *FB = mmap(	NULL,	// 填NULL表示显存地址由系统自动分配
					800*480*4, 	// 整块屏幕的显存大小
					PROT_READ|PROT_WRITE, 	// 显存保护权限:可读可写
					MAP_SHARED, 	// 多进程共享设置
					lcd_fd, 	// LCD文件描述符
					0);			// 0表示不偏移
	if(FB == MAP_FAILED)
	{
		perror("mmap failed");
		return -2;
	}

	// 2.	把大象塞进去	——》将像素点写入到LCD中	
	int color_red   = 0x00FF0000;	// 纯红色16进制表示aRGB
	int color_green = 0x0000FF00;	// 纯绿色16进制表示aRGB
	int color_blue  = 0x000000FF;	// 纯蓝色16进制表示aRGB

	int x, y;
	while(1)
	{
		for(y=0; y<480; y  )
			for(x=0; x<800; x  )
				*(FB x 800*y) = color_red;
		sleep(1);

		for(y=0; y<480; y  )
			for(x=0; x<800; x  )
				*(FB x 800*y) = color_green;
		sleep(1);
		
		for(y=0; y<480; y  )
			for(x=0; x<800; x  )
				*(FB x 800*y) = color_blue;
		sleep(1);
	}

	// 3.	关闭冰箱门	——》关闭设备
	close(lcd_fd);

	return 0;
}

3.demo3_显示国旗.c

代码语言:javascript复制
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int main()
{
	// 1.	打开冰箱门	——》打开屏幕设备文件
	int lcd_fd;
	lcd_fd = open("/dev/fb0", O_RDWR);
	if(lcd_fd == -1)
	{
		perror("open lcd failed");
		return -1;
	}
		// 显存映射(int *类型表示操作对象是像素点)
	int *FB = mmap(	NULL,	// 填NULL表示显存地址由系统自动分配
					800*480*4, 	// 整块屏幕的显存大小
					PROT_READ|PROT_WRITE, 	// 显存保护权限:可读可写
					MAP_SHARED, 	// 多进程共享设置
					lcd_fd, 	// LCD文件描述符
					0);			// 0表示不偏移
	if(FB == MAP_FAILED)
	{
		perror("mmap failed");
		return -2;
	}

	// 2.	把大象塞进去	——》将像素点写入到LCD中	
	int color_white = 0x00FFFFFF;	// 纯白色16进制表示aRGB
	int color_red   = 0x00FF0000;	// 纯红色16进制表示aRGB
	int color_blue  = 0x000000FF;	// 纯蓝色16进制表示aRGB

	int x, y;
	for(y=0; y<480/3; y  )
		for(x=0; x<800; x  )
			*(FB x 800*y) = color_white;
	for(y=480/3; y<480/3*2; y  )
		for(x=0; x<800; x  )
			*(FB x 800*y) = color_blue;
	for(y=480/3*2; y<480; y  )
		for(x=0; x<800; x  )
			*(FB x 800*y) = color_red;

	// 3.	关闭冰箱门	——》关闭设备
	close(lcd_fd);

	return 0;
}

0 人点赞