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