【Liux下6818开发板(ARM)】实现简易相册

  • (꒪ꇴ꒪ ),hello我是祐言
  • 博客主页:C语言基础,Linux基础,软件配置领域博主🌍
  • 快上🚘,一起学习!
  • 送给读者的一句鸡汤🤔:
  • 集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

 一、基本流程

        这个程序实现了一个实现简易的相册,使用6818开发板的液晶屏和触摸屏,可以显示多张BMP格式的图片,并支持通过触摸屏的操作切换图片。

        程序的主要功能和流程如下:

  1. 打开液晶屏设备文件,并将液晶屏映射到内存:通过打开/dev/fb0设备文件,并使用mmap函数将液晶屏映射到内存,以便后续在屏幕上显示图片。

  2. 打开触摸屏设备文件:通过打开/dev/input/event0设备文件,实现对触摸屏输入事件的捕获和处理。

  3. 获取图片路径名字:通过get_bmpname函数获取指定目录下的所有BMP格式图片的路径名字,并存储在数组bmppath中。

  4. 显示第一张图片:程序默认显示第一张图片,使用show_bmp函数将图片显示在液晶屏上。

  5. 循环监听触摸事件:进入无限循环,程序不断监听触摸屏的输入事件。根据触摸坐标判断用户点击了屏幕的哪个区域。

  6. 切换图片:根据触摸坐标的位置,如果用户点击了右上角区域,则切换到上一张图片;如果点击了右下角区域,则切换到下一张图片。通过更新bmppath数组的索引 来实现图片的切换,并调用show_bmp函数将新的图片显示在液晶屏上。

二、函数实现

        主函数代码:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <dirent.h>
#include <bmp.h>#define LCDDEV		"/dev/fb0"	#define PATH_SIZE		1024
#define PHOTO_SIZE		100#define TOUCH_DEV "/dev/input/event0" // 触摸屏设备文件路径void get_xy(int touch_fd,int *x,int *y)
{struct input_event buf;*x = -1;*y = -1;while (1){// 读取触摸事件int ret = read(touch_fd, &buf, sizeof(buf));if (ret == -1){perror("read fail");exit(errno);}// 判断事件类型是否是触摸事件if (buf.type == EV_ABS){// 根据事件类型设置对应的坐标值if (buf.code == ABS_X){*x = (buf.value * 800) / 1024;}	if (buf.code == ABS_Y){*y = (buf.value * 800) / 1024;}}if (!(*x > 0 && *x < 800 && *y > 0 && *y < 480)){continue;}	if(*x>-1 && *y>-1){break; // 得到坐标后退出}	}}// 从目录中读取BMP类型图片路径名字
void get_bmpname(char *dir, char *bmppath[])
{char *cur_path = calloc(PATH_SIZE, sizeof(char));	//程序执行的位置char *dst_path = calloc(PATH_SIZE, sizeof(char));	//指定要读取文件的路径if(  !(cur_path && dst_path) ){perror("calloc fail");exit(errno);}// 保留程序执行的位置getcwd(cur_path, PATH_SIZE);// 获取指定目录的绝对路径chdir(dir);getcwd(dst_path, PATH_SIZE);// 1.打开目录文件DIR *dp = opendir(dir);if ( dp == NULL ){perror("opendir fail");exit(errno);}// 2. 读取目录项int i = 0;struct dirent *ep = NULL;while(1){ep = readdir(dp);if ( ep == NULL && errno == 0 )	//成功读完所有的目录项{break;}		else if( ep == NULL )	//进入到这个判断,说明errno值已被改变,出现某种错误{perror("readdir fail");}if ( strstr(ep->d_name, ".bmp") ){if(bmppath[i] == NULL)bmppath[i] = calloc(PATH_SIZE, sizeof(char));elsebzero(bmppath[i], PATH_SIZE);snprintf(bmppath[i], PATH_SIZE, "%s/%s", dst_path, ep->d_name);i++;}else{continue;}}// 继续向后检索,是否为NULL,不为空这次读取的图片资源没有上次多// 应该把多余申请的资源释放掉for(; bmppath[i] != NULL; i++){free(bmppath[i]);bmppath[i] = NULL;}// 关闭目录closedir(dp);
}int main(int argc, char *argv[])
{int x,y;// 打开液晶屏设备int lcd_fd = open(LCDDEV, O_RDWR);if(lcd_fd == -1){perror("open lcd fail");exit(errno);}// 给液晶屏文件映射一块内存int *fb = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);if(fb == MAP_FAILED){perror("mmap fail");exit(errno);}// 打开触摸屏int touch_fd = open(TOUCH_DEV, O_RDONLY);if (touch_fd < 0){perror("打开触摸屏失败");exit(errno);}// 获取指定目录的图片路径名字char *bmppath[PHOTO_SIZE] = {NULL};int i = 0;get_bmpname("./", bmppath);for (i=0; bmppath[i] != NULL; i++)	//获取读到多少张图片路径/* empty */;//默认显示第一张图片	show_bmp(bmppath[0], fb, 0, 0);while(1) {	get_xy(touch_fd, &x, &y);if(x>400 && x<800 && y>0 && y<240){		//右上角的那块区域{--i; if (i < 0){i = 5;}	show_bmp(bmppath[i], fb, 0, 0);}}	else if(x>400 && x<800 && y>240 && y<480){	//右下角的那块区域++i;if (i > 5) {i = 0; // 如果i小于0,跳转至6}show_bmp(bmppath[i], fb, 0, 0);}}				// 关闭触摸屏close(touch_fd);// 关闭液晶屏munmap(fb, 800*480*4);close(lcd_fd);return 0;
}

        全部的文件打包放这了。

模拟相册icon-default.png?t=N6B9https://download.csdn.net/download/qq_64928278/88136955?spm=1001.2014.3001.5501

        更多C语言Linux系统相关文章,关注专栏:

   手撕C语言

            玩转linux

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

介绍如何快速传输100G大文件传输方法

如何快速地将100GB的大文件从一个地方传送到另一个地方&#xff0c;这是许多人都遇到过的一个难题&#xff0c;无论是个人用户还是企业用户&#xff0c;都有这样的需求。在很多场合&#xff0c;我们需要将大文件迅速地发送到远程位置。比如&#xff0c;当我们需要对重要数据进行…

心法利器[93] | 谈校招:技术面

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会&#xff0c;与大家一起成长。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。 2022年新一版的文章合集已经发布&#xff0c;累计已经60w字了&#xff0c;获取方式看这里&…

DeepVO 论文阅读

论文信息 题目&#xff1a;DeepVO Towards End-to-End Visual Odometry with Deep Recurrent Convolutional Neural Networks 作者&#xff1a;Sen Wang, Ronald Clark, Hongkai Wen and Niki Trigoni 代码地址&#xff1a;http://senwang.gitlab.io/DeepVO/ (原作者并没有开源…

插入排序算法

插入排序 算法说明与代码实现&#xff1a; 以下是使用Go语言实现的插入排序算法示例代码&#xff1a; package mainimport "fmt"func insertionSort(arr []int) {n : len(arr)for i : 1; i < n; i {key : arr[i]j : i - 1for j > 0 && arr[j] > …

Python web实战 | 使用 Flask 实现 Web Socket 聊天室

概要 今天我们学习如何使用 Python 实现 Web Socket&#xff0c;并实现一个实时聊天室的功能。本文的技术栈包括 Python、Flask、Socket.IO 和 HTML/CSS/JavaScript。 什么是 Web Socket&#xff1f; Web Socket 是一种在单个 TCP 连接上进行全双工通信的协议。它是 HTML5 中的…

【编程语言 · C语言 · 学生管理系统】

【编程语言 C语言 学生管理系统】https://mp.weixin.qq.com/s?__bizMzg4NTE5MDAzOA&mid2247491542&idx1&snf9b72a5af62a93bc902c5467056a9343&chksmcfade32ff8da6a3956be7d6a5dceb97de27e25157804abf8a3193272fa8ad68e78640ca33a5c&token1462056111&…

【大数据之Flume】四、Flume进阶之复制和多路复用、负载均衡和故障转移、聚合案例

1 复制和多路复用 &#xff08;1&#xff09;需求&#xff1a;使用 Flume-1 监控文件变动&#xff08;可以用Exec Source或Taildir Source&#xff09;&#xff0c;Flume-1 将变动内容传递给 Flume-2&#xff08;用Avro Sink传&#xff09;&#xff0c;&#xff08;用Avro Sou…

BugKu CTF(杂项篇MISC)—想要种子吗

BugKu CTF(杂项篇MISC)—想要种子吗 提 示: 描 述:flag{} 题目下载后是一张图片&#xff0c;打开如下。 一、工具 十六进制编辑器010 editor kali系统文件分离工具binwalk或者foremost 维吉尼亚密码 STEGHIDE图片隐写工具 文章所需的软件下载地址 ARCHPR压缩包密码破解…

美团2024校招6000人;伯克利博士讲Llama 2技术细节;互联网转行AIGC最全指北;技术进步周期与创客崛起 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 美团 2024 届校园招聘将录用 6000 人&#xff0c;技术类岗位扩招超 50% 美团招聘公众号宣布启动 2024 届校园招聘&#xff01;此次招聘…

PCB制版技术

1、在头脑里形成一个原理图----现在就下载AD9盖版&#xff0c;诞生了一个问题&#xff0c;电路板去哪里买&#xff0c;买了怎么焊接电路和芯片&#xff0c;怎样流程化批量制作电子产品 1.1 形成一个PCB板&#xff0c;形成一个结构 1.2 焊接&#xff0c;嫁接&#xff0c;组装等 …

Scaling Instruction-Finetuned Language Models

Paper name Scaling Instruction-Finetuned Language Models Paper Reading Note Paper URL: https://arxiv.org/pdf/2210.11416.pdf TL;DR 2022 年谷歌出的文章&#xff0c;对指令微调的影响因素进行分析&#xff0c;提出了一些提升指令微调效果的方案。与该文章一起出品…

vue sku商品规格多选

vue sku商品规格多选 1.创建一个数据对象&#xff0c;用于存储SKU的选中状态。例如&#xff0c;可以使用一个数组来表示选中的SKU&#xff0c;每个元素代表一个SKU选项的id。 data() {return {selectedOptions: []} }2.在SKU选项列表中&#xff0c;使用v-bind:class绑定一个计…

基于双层优化的微电网系统规划设计方法(Matlab代码实现)

目录 &#x1f4a5;1 概述 1.1 微电网系统结构 1.2 微电网系统双层规划设计结构 1.3 双层优化模型 1.4 上层容量优化模型 1.5 下层调度优化模型 &#x1f4da;2 运行结果 &#x1f389;3 文献来源 &#x1f308;4 Matlab代码、数据、文章讲解 &#x1f4a5;1 概述 文献来源&…

Meta “地平线世界”移动端应用即将上线,手机快乐元宇宙?

根据海外记者 Janko Roettgers 的报道&#xff0c;Meta 预计很快推出移动版的 VR 元宇宙服务 "地平线世界"&#xff0c;这是Meta 长期开发的产品。 根据最新报道&#xff0c;Meta宣布正在研发“地平线世界”的移动版&#xff0c;并表示这一服务已经可以在Quest VR设…

LInux的安装(VMware,网卡设置,SSH连接工具)

Linux的安装 1、安装方式介绍 1.安装方式: 物理机安装:直接将操作系统安装到服务器硬件上 虚拟机安装:通过虚拟机软件安装 **虚拟机( Virtual Machine&#xff09;**指通过软件模拟的具有完整硬件系统功能、运行在完全隔离环境中的完整计算机系统。 2、安装Linux 在官网将…

PoseiSwap:首个基于模块化设施构建的订单簿 DEX

在前不久&#xff0c;PoseiSwap 曾以1000万美元的估值&#xff0c;获得了来自于ZebecLabs基金会的150万美元的融资。此后 PoseiSwap 又以2500万美元的估值&#xff0c;从GateLabs、EmurgoVentures、Republic以及CipholioVentures等行业顶级投资机构中&#xff0c;获得了新一轮未…

Vue2面试题

1. Vue 的基本原理 当 一 个 Vue 实 例 创 建 时 &#xff0c; Vue 会 遍 历 data 中 的 属 性 &#xff0c; 用 Object.defineProperty &#xff08; vue3.0 使 用 proxy&#xff09; 将 它 们 转 为 getter/setter&#xff0c;并且在内部追踪相关依赖&#xff0c;在属性被访…

Java课题笔记~Maven基础知识

一、什么是Maven&#xff1f; Maven是专门用于管理和构建Java项目的工具。 它的主要功能有&#xff1a; 提供了一套标准化的项目结构提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09;提供了一套依赖管理机制 …

子域名收集工具OneForAll的安装与使用-Win

子域名收集工具OneForAll的安装与使用-Win OneForAll是一款功能强大的子域名收集工具 GitHub地址&#xff1a;https://github.com/shmilylty/OneForAll Gitee地址&#xff1a;https://gitee.com/shmilylty/OneForAll 安装 1、python环境准备 OneForAll基于Python 3.6.0开发和…

Kotlin基础(九):对象和委托

前言 本文主要讲解kotlin对象和委托。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 对象 在Kotlin中&#xff0c;对象&#xff08;Object&#xff09;是一个具有特殊用途的单例实例。它是一种创建单个实例的方式&#xff0c;确保在整个应用程序中只存在一个特…