• 嵌入式应用开发第二阶段


    下面是嵌入式应用开发第二阶段,主要介绍基本IO操作,如何使用开发板的液晶屏,如何在LCD上显示图像,碰撞球实验,BMP显示

    本文使用的是7寸800*480的液晶屏,每个像素点有4个字节,0x 00 FF FF FF,第一个字节保留,后3个字节分别代表红色,绿色,蓝色
    一、LCD 基本概念
    LCD 的构造主要是在玻璃基板当中放置液晶膜,基板玻璃上设置TFT(薄膜晶体管),
    在其之上还有彩色滤光片,通过TFT 玻璃上的信号与电压改变来控制液晶分子的转动方向,
    从而达到控制每个像素点偏振光出射与否而达到显示目的。
    1.1、像素
    像素又称画素,为图像显示的基本单位。每个像素可有各自的颜色值,可采三原色显示,因
    而又分成红、绿、蓝三种子像素
    1.2、分辨率
    图像效果最重要的指标系数之一是分辨率,分辨率是指单位面积显示像素的数量,在日
    常用语中之分辨率多用于图像的清晰度。分辨率越高代表图像质量越好,越能表现出更多的
    细节;但相对的,因为纪录的信息越多,文件也就会越大。
    1.3色彩深度
    一个像素所能表达的不同颜色数取决于比特每像素(BPP,bit per pixel)。这个最大数
    可以通过取2 的色彩深度次幂来得到。例如,常见的取值有:
    8 bpp:256 色,亦称为“8 位色”。
    16 bpp:216=65536 色,称为高彩色,亦称为“16 位色”。
    24 bpp:224=16777216 色,称为真彩色,通常的记法为“1670 万色”,亦称为“24位色”。
    32 bpp:224 +28,计算机领域较常见的32 位色并不是表示232 种颜色,而是在24
    位色基础上增加了8 位(28=256 级)的灰度(亦称“灰阶”,有时亦被实现为alpha 透明
    度),因此32 位色的色彩总数和24 位色是相同的,32 位色也称为真彩色、或全彩色。
    对于超过8 位的深度,这些数位就是三个分量(红绿蓝)的各自的数位的总和。一个
    16 位的深度通常分为5 位红色和5 位蓝色,6 位绿色(眼睛对于绿色更为敏感)。24 位的
    深度一般是每个分量8 位。而32 位的颜色深度也是常见的:这意味着24 位的像素有8 位
    额外的数位来描述透明度。
    1.4内存映射
    读者只需知道有一种叫做帧缓冲机制的东西,使得内核可以将显卡硬件抽象成一块可以直接操作的内存,将屏幕映射到用户空间的虚拟内存上,这样,我们就可以在应用程序直接写屏了

    二、文件基本IO操作
    1. open函数说明
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    原型:
    int open(const char *pathname, int flags);
    int open(const char *pathname, int flags, mode_t mode);
    功能:以指定的方式打开指定的文件
    参数:pathname 文件名,可以相对路径或绝对路径
    / 开始的是绝对路径 ,否则就是相对路径
    flags: 打开方式 ,常用: O_RDONLY, O_WRONLY, O_RDWR ,O_CREAT.
    O_RDONLY 只读
    O_WRONLY 只写
    O_RDWR 读写
    O_CREAT 当文件不存在可以创建新文件
    返回:
    >0 成功,含义是文件描述符,通过这个返回值可以读写操作文件
    -1 失败

    2. read 函数
    头文件:
    #include <unistd.h>
    原型:
    ssize_t read(int fd, void *buf, size_t count);
    功能:从 fd 指向的文件中读取 最多 conut 个数据,存放到buf指向缓冲区中
    参数:
    fd : 就是使用open函数打开后得到的返回值。
    buf : 存储读取到的结果
    count :要读取字节数量
    返回:>=0 成功,值是读取到的字节数量,0表示已经到文件末尾了。
    -1 失败

    3. write函数
    头文件:
    #include <unistd.h>
    原型:ssize_t write(int fd, const void *buf, size_t count);
    功能:把buf指向的缓冲数据写入到fd指向的文件中,最多写入 count 个
    参数:
    fd : 就是使用open函数打开后得到的返回值。
    buf : 数据源指针,存放等待写入的数据
    count :要写入字节数量
    返回:>=0 成功,值是写入的字节数量,0表示已经什么都没有做。
    -1 失败

    4. 移动文件读写位置(光标)
    #include <sys/types.h>
    #include <unistd.h>
    原型:off_t lseek(int fd, off_t offset, int whence);
    功能:重新定位文件的读写位置。根据 whence 来使用 offset 对文件读写位置进行调整。
    参数:fd 就是使用open函数打开后得到的返回值。
    offset:要调整的偏移量,但是不是最终的文件读写偏移位置,如何使用和 whence 有头
    whence:调整方式 ,可取值:
    SEEK_SET 以文件开头为参考点,最终的读写是 offset 参数值
    SEEK_CUR 以当前读写位置参考点,最终的读写位置是 【当前读写位置+offset】
    SEEK_END 以文件结尾为参考点,最终的读写位置是 【文件大小+offset】

    返回:>=0 成功,调整后的文件的读写位置
    -1 失败

    三、LCD初始化
    LCD 显示器一般对应的设备节点文件是/dev/fb0,当然如果系统有多个显示设备的话,
    还可能有/dev/fb1、/deb/fb2 等,这些文件是读写显示设备的入口
    1,打开液晶屏
    int lcd = open("/dev/fb0", O_RDWR);
    if(lcd == -1)
    {
    perror("打开 /dev/fb0 失败");
    exit(0);
    }

    2,映射一块恰当大小的内存
    char *p = mmap(NULL, 800*480*4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd, 0);
    if(p == MAP_FAILED)
    {
    perror("映射内存失败");
    exit(0);
    }

    四、实战
    LCD的显示原理和基本IO操作讲完了,下面进行实战练习

    实验一:液晶屏显示德国国旗



    实验二:液晶屏显示一个圆

    实验三:碰撞球

    实验四:BMP图片显示

    今天先到这里,后续会将4个实验讲解一下

     

     

     

     

  • 相关阅读:
    《构建之法》第四章的感悟
    单复利软件单元测试
    实验一 操作系统模仿cmd
    <构建之法>第一二三章感悟
    近期工作量统计
    复利计算3.0
    复利运算
    单利运算1
    复利计算6.0
    汉堡包
  • 原文地址:https://www.cnblogs.com/cyyz-le/p/11111408.html
Copyright © 2020-2023  润新知