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;
}
相关文章
|
3月前
|
编解码 数据格式
IMX6ULL开发板spi OLED驱动
【8月更文挑战第24天】本文档介绍在IMX6ULL开发板上实现SPI接口OLED显示器驱动的步骤。首先需正确连接OLED至开发板的SPI接口,包括时钟(SCLK)、数据(MOSI)及片选(CS)等线路。理解SPI协议与OLED规格也很关键:SPI为同步串行通信,涉及主从设备交互;OLED参数如分辨率、颜色深度等须明确。接下来配置IMX6ULL的SPI控制器,通过设备树设定时钟频率、数据宽度等参数,并加载内核驱动。最后编写驱动程序,初始化SPI设备、发送控制命令与数据以完成OLED初始化,并实现文本或图像的显示功能。
|
4月前
STM32CubeMX mpu6050驱动
STM32CubeMX mpu6050驱动
65 10
|
6月前
|
Linux 芯片
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-1
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-1
|
6月前
|
Ubuntu Linux
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-2
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-2
|
6月前
|
Linux 芯片 Ubuntu
Linux驱动入门 —— 利用引脚号操作GPIO进行LED点灯
Linux驱动入门 —— 利用引脚号操作GPIO进行LED点灯
|
计算机视觉
树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)
树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)
树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)
|
存储 芯片
51单片机--LCD1602
51单片机--LCD1602
330 1
|
Ubuntu Linux 芯片
史上最全的LED点灯程序—使用STM32、FPGA、Linux点亮你的LED灯
不知道小伙伴们点亮过多少板子的LED灯,有很多小伙伴留言说讲一下stm32、fpga、liunx他们之间有什么不同,不同点很多,口说无凭,今天就来点亮一下stm32、fpga和liunx板子的led灯,大家大致看一下点灯流程和点灯环境以及点灯流程,就能大概的了解一下三者的区别,可以有选择的去学习!
384 0
史上最全的LED点灯程序—使用STM32、FPGA、Linux点亮你的LED灯