五天完成项目-《基于Linux环境下的Cortex A53的手势识别智能家居》-第二天

7 篇文章 0 订阅
6 篇文章 0 订阅

《智能家居系列》

五天完成项目-《基于Linux环境下的Cortex A53的手势识别智能家居》-前言
五天完成项目-《基于Linux环境下的Cortex A53的手势识别智能家居》-第一天
五天完成项目-《基于Linux环境下的Cortex A53的手势识别智能家居》-第二天
五天完成项目-《基于Linux环境下的Cortex A53的手势识别智能家居》-第三天
五天完成项目-《基于Linux环境下的Cortex A53的手势识别智能家居》-第四天
五天完成项目-《基于Linux环境下的Cortex A53的手势识别智能家居》-第五天

一、LCD显示原理

LCD也叫做液晶显示屏,是目前市面上应用最广泛的显示设备,在消费类电子产品,广告显示屏,家电显示设备领域应用十分丰富,是嵌入式设备中应用最多的显示设备。
目前所有的LCD显示屏设备的工作原理都是一样,掌握LCD设备的使用,对于以后的工作,学习都是很有帮助的。

二、LCD初步使用

1、Linux下一切都是文件

2、文件IO

1)函数man手册的使用
1 Executable programs or shell commands
2 System calls (functions provided by the kernel) //系统调用函数
3 Library calls (functions within program libraries) //库函数
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd
6 Games
7 Miscellaneous (including macro packages and conventions), e.g.
man(7), groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]

2)open函数 --》 打开文件 man 2 open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //头文件

   int open(const char *pathname, int flags);
==》pathname : 路径名
==》flags : 标志 ==》打开文件的权限

O_RDONLY, //只读
O_WRONLY, //只写
or O_RDWR //读写
返回值:成功返回一个文件描述符。失败返回-1.
文件描述符:文件操作的钥匙
硬盘:一栋大楼
文件:大楼里面的房间
操作系统:大楼管理员
Open: 找大楼管理员要钥匙

3)write
#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);
==》fd : 文件描述符
==》buf : 数据缓冲区首地址
==》count : 想要写入的字节数

返回值:成功返回实际写入的字节数,0代表没有写入。失败返回-1.

4)close 关闭文件

阶段作业 (14:15 ~ 15:15)
1,在GEC6818开发板上显示俄罗斯国旗(基础)
2,在GEC6818开发板上显示法国国旗(拓展)
3,在GEC6818上显示九宫格(加分题)(任意9个颜色即可)
在这里插入图片描述

三、图片显示

1,图片显示流程

2,图片素材选择

Jpeg, jpg, bmp, png, GIF …
==> bmp 图片 :原图(图片数据没有经过任何压缩算法,直接存储的图片文件)
==> 24位位图,每一个像素点的数据都是24位(3字节:RGB)
==>计算:一张800480的bmp图片应该是多大? 800480*3 字节
1,152,054 字节
BMP图片特点:每一张BMP图片都会在图片的开头存在54字节头信息

准备一张800*480的图片素材。

3,图片显示实现

1)read函数分析
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
==》fd : 需要读取数据的文件描述符
==》buf : 存放读取的数据的缓冲区
==》count : 一次读取的字节数
返回值: 成功返回实际读取的字节数,0代表读取到文件末尾,失败返回-1

图片显示中的问题:
1)图片未能完全覆盖 LCD
2)图片颜色严重失真

后面会使用内存映射方法修改!!

原因: LCD上的像素点每个是4字节,bmp图片上的像素点每个是3字节。

在这里插入图片描述

练习:利用show_bmp函数,实现一个自动循环播放的幻灯片功能(至少3张)。10:00 ~ 10:30
运行程序,自动循环播放图片,每隔2秒播放下一张。 sleep(2);

4、U盘实现文件拷贝到开发板:

1,准备需要拷贝的数据到U盘,最好直接放在U盘的文件夹下 pic/
2,U盘插入开发板
3,进入这个路径,进行文件拷贝

拷贝完成即可。

四,内存映射显示图片

前面实现的图片显示代码,显示图片时,在LCD上会有一条一条的”线”,一段时间后消失。这是因为LCD没有及时将数据显示在屏幕上,

1,内存映射函数 mmap

#include <sys/mman.h>

void *mmap(void addr, size_t length, int prot, int flags,int fd, off_t offset);
int munmap(void addr, size_t length);
==> addr :映射空间的首地址 NULL (系统自动分配空间)
==> length : 映射空间的大小 800
480
4 字节
==> port : PROT_READ | PROT_WRITE 读写
==> flags : MAP_SHARED
==> fd : lcd的文件描述符
==> offset :偏移量 0

返回值:映射空间的首地址

2,动态显示图片

在一些软件上,经常可以看到图片的花样显示,从上往下拉幕式,中间往两边拉幕式… ,在学习内存映射显示图片后,我们可以设计程序实现这种效果。

例:从上往下显示图片

作业1: 14:00 ~ 14:30
参考mmap.c,实现图片的动态显示。
1)从左往右显示
2)从中间往两边
3)百叶窗显示
拓展:
方形扩散
圆形扩散

3,显示任意大小图片

关于图片显示,前面的实验都是显示与屏幕大小匹配的图片(800*480),如果在实际应用中需要显示小尺寸的图片,如何实现?
==》显示原理都是一样,将图片的像素点数据经过转码,编码处理之后写入LCD上对应的像素点的位置,那么显示小尺寸的图片只需把显示图片的代码修改一下即可。

例如:在LCD上显示一张200*150的bmp图片。

练习:准备一张400*300的bmp图片,然后显示在LCD上。

4,任意位置显示图片

函数show_xbmp可以实现在LCD上显示任意大小的图片,但是显示的图片都是从第一个像素点的位置开始显示的,如何想要显示在LCD的任意位置,如何实现?

例如:将一张200*150的bmp图片显示在LCD的起点为 (150, 100)的位置。

练习:参考代码,设计程序,将一张400*300的图片显示在起点为(200,100)的位置

作业2:设计一个函数show_xbmp_mid(int win, int high, char *picname)
==>将一张宽为win,高位high的图片 居中显示
==>居中显示:显示在屏幕的正中间

在主函数中调用函数 show_xbmp_mid(400, 300, “1.bmp”); 实现将一张大小为400 * 300的bmp图片显示在LCD正中间。

要求:循环显示2张图片(大小不能一样),调用居中显示的函数,实现图片的居中显示。

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值