LCD图片显示、触摸屏、音乐播放、缩放图片和播放视频

2023-10-27

一.GEC6818开发板的LCD

1.LCD

(1)原理

LCD屏幕是由一个个像素组成的,横向像素个数和纵向像素个数是LCD的一个重要指标,称为像素分辨率,当前举例开发板的分辨率是 800X480

LCD显示从屏幕左上角的像素开始,直到右下角一帧结束

像素位数指的是存储一个像素数据所需要的空间长度,当前举例LCD的像素位数是32位(bpp)
在这里插入图片描述

(2)屏幕显示的控制

LCD的像素显示数据来自于显存,显存一般使用内存,使用一段内存空间来存储显示数据,将显存和LCD建立映射关系之后,我们往显存上写什么数据,LCD就会显示什么内容

显存在用户空间不能直接访问,需要将显存映射到用户空间之后才能访问,使用mmap函数来实现映射

LCD硬件对应的设备文件 /dev/fb0
在这里插入图片描述

2.mmap函数

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:映射区的长度(映射长度是页的倍数)

    prot:映射区权限
    
         PROT_EXEC  Pages may be executed.

         PROT_READ  Pages may be read.

         PROT_WRITE Pages may be written.

         PROT_NONE  Pages may not be accessed.
        
    flags:映射标志

         MAP_SHARED ----- 对映射区的修改要同步到文件
        
         MAP_PRIVATE ----- 对映射区的修改不同步到文件

    fd:映射的文件描述符

    offset:映射位置相对于文件开头的偏移

成功返回映射区首地址,失败MAP_FAILED((void *)-1)

映射区使用完成之后要解除映射,使用munmap函数解除,传入映射区首地址和映射区的长度

3.LCD的显存映射

使用mmap映射显存和映射普通文件的流程一样,唯一的区别是映射的文件要改成LCD的设备文件 (/dev/fb0)

对于LCD的显示来说,往先存上写什么数据,LCD就会显示什么内容,LCD显示简化成了显存操作,也就是内存操作

4.图片的显示

图片分为位图和矢量图,位图存储的是图像的像素信息,矢量图保存的是图像的轮廓信息。

位图主要用于图像显示和存储,矢量图主要用于工程制图

(1)位图的参数

位图文件存储的图像信息,图像信息就有几个重要参数 --------- 像素分辨率 像素位数

对于一个位图文件来说,我们需要找到它的 图像数据 像素分辨率 像素位数

(2)位图格式

bmp:图像数据不压缩,直接保存

jpeg:压缩的图片

png:压缩的图片

tiff:压缩的图片

gif:动态图片

5.bmp图片格式

(1)bmp图片数据组成
在这里插入图片描述

文件头:
在这里插入图片描述
信息头:
在这里插入图片描述
图像数据:

图像数据一个像素中颜色分量的顺序如下

    24位 -------- B G R

    32位 -------- B G R A

二.触摸屏

1.概念和原理

触摸屏是一个输入设备,在Linux内核中使用输入子系统的框架来实现的,使用输入子系统实现的设备驱动对应的设备文件 /dev/event0…1…2…或/dev/input/event0…1…2…

我们触摸屏对应的设备文件是 /dev/input/event0

输入子系统上报的信息(读到的信息)都是一个个的事件(struct input_event)

在/usr/include/linux/input.h 中定义

struct input_event 
{
     struct timeval time;//时间戳
     __u16 type;//事件类型
     __u16 code;// 按键事件---键值      坐标事件---坐标类型
     __s32 value;//按键事件---按键状态  坐标事件---坐标值
};

事件类型:

  #define EV_SYN                  0x00 //同步事件
  #define EV_KEY                  0x01 //按键事件
  #define EV_REL                  0x02 //相对坐标事件
  #define EV_ABS                  0x03 //绝对坐标事件
  #define EV_MSC                  0x04
  #define EV_SW                   0x05
  #define EV_LED                  0x11
  #define EV_SND                  0x12
  #define EV_REP                  0x14
  #define EV_FF                   0x15
  #define EV_PWR                  0x16
  #define EV_FF_STATUS            0x17
  #define EV_MAX                  0x1f
  #define EV_CNT                 (EV_MAX+1)

键值:

  #define KEY_ESC                 1
  #define KEY_1                   2
  #define KEY_2                   3
  #define KEY_3                   4
  #define KEY_4                   5
  #define KEY_5                   6
  #define KEY_6                   7
  #define KEY_7                   8
  #define KEY_8                   9
  #define KEY_9                   10
  #define KEY_0                   11

  #define BTN_TOUCH               0x14a

坐标类型:

  #define ABS_X                   0x00
  #define ABS_Y                   0x01
  #define ABS_Z                   0x02

2.测试

(1)使用hexdump命令

hexdump /dev/input/event0
编号 时间戳 事件类型 坐标类型/键值 坐标值/按键状态
0000000 1dcc 7ff8 4e50 000e 0003 0000 01b1 0000
0000010 1dcc 7ff8 4e56 000e 0003 0001 013b 0000
0000020 1dcc 7ff8 4e5a 000e 0001 014a 0001 0000
0000030 1dcc 7ff8 4e5e 000e 0000 0000 0000 0000
0000040 1dcc 7ff8 1923 000f 0001 014a 0000 0000
0000050 1dcc 7ff8 1928 000f 0000 0000 0000 0000

(2)编写代码

编写输入子系统的代码需要包含 linux/input.h 头文件

三.音乐播放

6818开发板上的音频驱动,麦克风,耳机接口都已经实现,我们只需要使用。借助开源音乐播放器软件madplay来播放音乐

1.使用madplay直接用命令

madplay mp3音乐文件路径

2.使用system函数来执行音乐控制播放命令

(1)开始播放

system("madplay mp3音乐文件路径 &");

(2)停止播放

system("killall -KILL madplay &");

(3)暂停播放

system("killall -STOP madplay &");

(4)继续播放

system("killall -CONT madplay &");

四.图片缩放

线性差值算法是一种简易经典的图片缩放算法,就是按照比例去寻找所需要的像素点

假设图片原始的长和宽(像素)为a,b

缩放后的图片大小为a0,b0

那么缩放后图片上任意一像素点(x0,y0)对应原图片的像素坐标(x,y)为

x = x0*a/a0;

y = y0*b/b0;

注:图片的宽度必须是4的倍数

五.maplyer播放视频

1.安装mplayer

mplayer是一个开源的视频播放工具,可以用来播放各种格式的视频

mplayer已经编译好了,将下载好的mplayer文件传送到开发板文件系统,修改权限777,将文件移动到/usr/bin

2.使用mplayer播放视频

基本用法:

mplayer avi视频文件的路径

-quiet:不要显示推流

-zoom -x 800 -y 480:指定视频播放大小

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LCD图片显示、触摸屏、音乐播放、缩放图片和播放视频 的相关文章

  • 配置:错误:无法运行C编译的程序

    我正在尝试使用 Debian Wheezy 操作系统在我的 Raspberry Pi 上安装不同的软件 当我运行尝试配置软件时 我尝试安装我得到此输出 checking for C compiler default output file
  • 推荐用于小型站点的 IRC 服务器 (ircd)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 情况 我想使用 IRC 机器人作为我正在研究的其他代码的通用通信接口 服务器硬件陈旧且内存不足 但运行在相对最新的 Debian GNU
  • 可以对 Xcode 中的 Arm 架构设置进行一些澄清

    据我了解 iPhone 5将采用新的架构 armv7s 我的项目具有有效的架构armv7 并且有Build Active Architecture Only set to true 由于现在商店中的每个应用程序都是为armv6 and or
  • 如何从 Linux 内核模块获取使用计数?

    我对正在开发的内核模块的使用计数有疑问 我想打印它以进行调试 如何从模块代码中获取它 有问题的内核版本 Linux 2 6 32 module refcount http lxr linux no linux v2 6 34 1 inclu
  • 在 Linux 上创建线程与进程的开销

    我试图回答在 python 中创建线程与进程有多少开销的问题 我修改了类似问题的代码 该问题基本上运行一个带有两个线程的函数 然后运行带有两个进程的相同函数并报告时间 import time sys NUM RANGE 100000000
  • C++:Linux平台上的线程同步场景

    我正在为 Linux 平台实现多线程 C 程序 其中我需要类似于 WaitForMultipleObjects 的功能 在搜索解决方案时 我发现有一些文章描述了如何在 Linux 中实现 WaitForMultipleObjects 功能
  • XAMPP Windows 上的 Php Cron 作业

    嗯 我是这个词的新手CRON 据我所知 这是一个Unix安排特定操作在定义的时间间隔后执行的概念 我需要运行一个php文件 每小时更新一次数据库 但我的困惑在于安排执行 我在用XAMPP用于 Windows 7 上的本地开发测试 我发现了什
  • ubuntu 的 CSS 更少(并且自动编译)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试过 simples 但现在 l
  • 如何在 Linux/OS X 上温和地终止 Firefox 进程

    我正在使用 Firefox 进行一些自动化操作 尽管我可以从 shell 打开 Firefox 窗口 但我无法正确终止它 如果我kill火狐进程与kill 3 or kill 2当我下次打开新的 Firefox 窗口时 命令会询问我是否要在
  • Python将文件从Linux复制到WIndows

    我正在构建一个网站 该网站有一个表单 可以捕获用户数据并在用户数据上运行一些cgi cgi 的第一步是需要将文件从 Linux Web 服务器复制到 Windows 计算机 服务器将使用 Active Directory 角色帐户作为复制凭
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

    To bx对于 Thumb 函数 需要设置地址的最低有效位 GNU 作为文档states https sourceware org binutils docs as ARM Opcodes html当地址是从一个生成时这是如何工作的adr伪
  • 可以作为命令行参数传递多少数据?

    在 Linux 下生成进程时可以发送多少字节作为命令行参数 gahooa 推荐了一篇好文章http www in ulm de mascheck various argmax http www in ulm de mascheck vari
  • 在非实时操作系统/内核上执行接近实时任务的最佳方法是什么?

    在一台 GNU Linux 机器上 如果想要执行 实时 亚毫秒级时间关键 任务 您几乎总是必须经历漫长 复杂且容易出现问题的内核补丁过程 以提供足够的支持 1 http en wikipedia org wiki RTLinux Backg
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 如何将 elf 解释器(ld-linux.so.2/ld-2.17.so)构建为静态库?

    如果我的问题不准确 我深表歉意 因为我没有太多 Linux 相关经验 我目前正在构建一个 Linux 从头开始 主要遵循 linuxfromscratch org 版本的指南 7 3 我遇到了以下问题 当我构建可执行文件时 获取一个称为 E
  • Grep 递归和计数

    需要在具有大量子目录的目录中搜索文件内的字符串 我在用着 grep c r string here 我怎样才能找到总数量 如何仅输出至少具有一个实例的文件 使用 Bash 的进程替换 这给出了我认为是您想要的输出 如果不是 请澄清问题 gr
  • php_network_getaddresses: getaddrinfo 失败: 名称或服务未知 (0) 连接失败..!

    我正在使用 php 邮件程序功能 但出现以下错误 如何修复它 2016 01 22 06 15 48 SMTP 错误 无法连接到服务器 php network getaddresses getaddrinfo失败 名称或服务未知 0 连接失
  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • 如何从程序内部获取指向程序的特定可执行文件部分的指针? (也许是诽谤)

    我在 Linux 环境中 需要编写一个程序来检索放置在其可执行文件的某个部分中的一些数据 那么 如何从程序内部获取指向程序某个部分 通过其名称 的指针呢 我知道可以使用elf getdata 将节的索引作为参数传递给 get 和Elf Da

随机推荐

  • np.diag()函数

    nunpyp diag 调用方法 numpy diag v k 0 各个参数意义 v 如果v是一个2维数组 就会返回这个二维数组中第k个对角线上值新组成的一维数组 如果v是一维数组 返回一个二维数组 其中v处于第k个对角线上 k 可选参数
  • 设计模式Java实战

    文章目录 一 前置 1 1 目的 1 2 面向对象 1 3 接口和抽象类 二 七大设计原则 2 1 单一职责 2 2 接口隔离原则 2 3 依赖倒转原则 2 4 里氏替换原则 2 5 开闭原则 2 6 不要重复原则 2 7 迪米特最少知道法
  • layui - 重载和刷新表格时保持在当前页码 - 获取当前数据所在的页码 和 显示条数

    感谢大佬 转载文章自己存档 https blog csdn net COCOLI BK article details 88417605 layui laypage em next html 当前页码值 layui laypage limi
  • Android显示系统 SurfaceFlinger内部机制 3 APP申请创建Surface的过程

    韦东山 笔记 3 APP申请创建Surface的过程 看看Surface test的过程 1 获取SF服务 2 创建Surface 3 得到buffer 4 写buffer 5 回顾下获取SF服务过程 AP获取SF服务 调用createCo
  • C++获取当前时间 (std::chrono)

    在C 11之前要获取当前时间 大多数情况下要使用C语言的time库 include
  • vue.config.js文件配置devServer和devServer.proxy多个代理地址

    如何在vue config js文件配置属性devServer和devServer proxy配置多个代理地址 如下所示 比如 封装请求方法格式 可以略过 module exports outputDir dist 打包后输出文件名称 以及
  • vue-amap 定位和逆解码

    1 安装 npm install vue amap save 2 main js引入 import VueAMap from vue amap Vue use VueAMap VueAMap initAMapApiLoader key ke
  • 向量与矩阵的相乘

    向量与矩阵的相乘 2016年07月31日 10 00 55 阅读数 2253 在学习计算机图形学的时候 最常遇到的就是矩阵的乘法了 下面我们就简单的介绍下 使用程序如何编写两个矩阵的相乘呢 其实这个问题 大一的孩子都会写的 不是很难的 但是
  • 【文本信息处理】网络文本访问和处理+分词

    一 网络文本访问和处理 1 re findall 返回string中所有与pattern匹配的全部字符串 返回形式为数组 def findall pattern string flags 0 Return a list of all non
  • unity 实现Android端视频在UI上播放

    之前unity实现在RawImage上播放视频主要是通过movieTexture 而现在这个方法已经被抛弃 采用VideoPlayer来实现 实现的原理是将VideoPlayerd的视频渲染到UGUI的RawImage上 private V
  • 【C++拾遗之八】#pragmaonce与#ifndef的用法总结

    宏定义 一 两种宏定义的功能 二 两种宏定义的用法 三 两种宏定义的区别 一 两种宏定义的功能 ifndef 和 pragma once都是C C 中的两种宏定义 它们的作用是为了避免同一个头文件被多次包含 include note 只能保
  • Nginx入门笔记

    目录 Nginx 快速入门 1 启动 停止和重新加载 Nginx 配置 2 配置文件的结构 3 提供静态内容服务 静态网站 4 设置简单的代理服务器 5 设置 FastCGI 代理 Nginx 进程和运行时控制 1 主进程和工作进程 2 控
  • idea 配置(下载) golang 环境 GOROOT、GOPATH

    windows 10 平台 golang镜像下载地址 https gomirrors org 选择稳定版的windows amd64 msi或者zip zip 解压到目录即可 msi 打开直接安装 配置环境变量 高版本有的会自己配置环境变量
  • [定向爬虫] 网络爬虫实例2-淘宝定向爬虫

    import requests import re import time 获取html页面 def getHTMLText url try r requests get url timeout 30 r raise for status
  • 【雕爷学编程】MicroPython手册之 WiPy 特定端口库 wipy.machine.I2C.stop()

    MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器 与常规Python相比 MicroPython解释器体积小 仅100KB左右 通过编译成二进制Executable文件运行 执行效率较高 它使用
  • 一文了解电商大促系统的高可用保障思路

    本文面向受众可以是运营 可以是产品 也可以是研发 测试人员 作者希望通过如下思路 知历史 gt 清家底 gt 明目标 gt 定战略 gt 做战术 gt 促成长 帮助大家能够了解电商大促系统的高可用保障 减少哪些高深莫测的黑话和高大尚的论调
  • 【linux】linux中fork()详解(实例讲解)

    目录 linux中fork 函数详解 从一道面试题谈linux下fork的运行机制 linux中fork 函数详解 原文 linux中fork 函数详解 原创 实例讲解 jason314的博客 CSDN博客 fork 函数 一 fork入门
  • Conda 创建和删除虚拟环境

    1 检验当前conda的版本 conda V 2 conda常用的命令 查看已有的虚拟环境 conda env list 创建虚拟环境和删除虚拟环境 anaconda命令创建python版本为x x 名字为env name的虚拟环境 env
  • 微信小程序授权获取头像昵称的最新形式——头像昵称填写

    微信小程序授权用户信息 不知道有没有人像我一样 从wx getUserInfo到wx getUserProfile再到头像昵称填写获取用户头像昵称全部尝试了一遍 怪就怪自己一开始没仔细看官方文档 没注意到小程序的官方公告 不多说了 整理一下
  • LCD图片显示、触摸屏、音乐播放、缩放图片和播放视频

    一 GEC6818开发板的LCD 1 LCD 1 原理 LCD屏幕是由一个个像素组成的 横向像素个数和纵向像素个数是LCD的一个重要指标 称为像素分辨率 当前举例开发板的分辨率是 800X480 LCD显示从屏幕左上角的像素开始 直到右下角