================== 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;
}