day27-LCD开发板操作(2022.2.24)

简介: day27-LCD开发板操作(2022.2.24)

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;
}
相关文章
|
5月前
STM32CubeMX mpu6050驱动
STM32CubeMX mpu6050驱动
87 10
|
5月前
STM32CubeMX 按键控制LED
STM32CubeMX 按键控制LED
79 0
|
存储 芯片
51单片机--LCD1602
51单片机--LCD1602
352 1
|
7月前
STM32F103驱动oled显示屏
STM32F103驱动oled显示屏
149 0
野火RA6M5开发板 IIC-OLED测试学习
野火RA6M5开发板 IIC-OLED测试学习
104 0
野火RA6M5开发板 IIC-OLED测试学习
野火STM32F1开发板 IIC 0.96OLED 波形显示
野火STM32F1开发板 IIC 0.96OLED 波形显示
110 0