嵌入式应用开发第二阶段

下面是嵌入式应用开发第二阶段,主要介绍基本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个实验讲解一下

 

 

 

 

原文地址:https://www.cnblogs.com/cyyz-le/p/11111408.html