当前位置: 首页 > news >正文

【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

📢写在最后

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

相关文章:

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

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…...

Kubernetes(K8s)从入门到精通系列之六:K8s的基本概念和术语之存储类

Kubernetes K8s从入门到精通系列之六:K8s的基本概念和术语之存储类 一、存储类二、emptyDir三、hostPath四、公有云Volume五、其他类型的Volume六、动态存储管理一、存储类 存储类的资源对象主要包括: VolumePersistent VolumePVCStorageClass基础的存储类资源对象——Volum…...

Spark-统一内存模型

总结&#xff1a; Spark的内存模型分为4部分&#xff0c;分别是存储内存&#xff0c;计算内存&#xff0c;其他内存&#xff0c;预留内存&#xff1b; 其中存储内存和计算内存可以动态占用&#xff0c;当己方内存不足对方空余则可占用对方的内存&#xff0c;计算内存被存储内…...

类的继承和super关键字的使用(JAVA)

继承 所有的OOP语言都会有三个特征&#xff1a; 封装&#xff08;点击可跳转&#xff09;&#xff1b;继承&#xff1b;多态 为什么会有继承呢&#xff1f;可以先看下面的例子&#xff1a; 上面这两个类中的代码很相似因为它们只有最后一个方法不同其它的都相同&#xff0c;这样…...

BGP属性+选路规则

目录 一&#xff0c;BGP的属性—基础属性 1.PrefVal 2.LocPrf 3、优先本地下一跳 &#xff08;NextHop&#xff09; 4、AS-PATH 5、起源属性 6、MED -多出口鉴别属性 二&#xff0c;BGP选路规则 三&#xff0c;BGP的社团属性 一&#xff0c;BGP的属性—基础…...

类的实例化

类的实例化 class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;int _day; //这只是函数的一个声明并没有定义 };上面是一个类&#xff0c;我们可以把有花括号括起来的叫做一个域&#xff…...

智能提词器有哪些?了解一下这款提词工具

智能提词器有哪些&#xff1f;使用智能提词器可以帮助你更好地准备和交付演讲、报告或其他提词场合。它可以提高你的效率&#xff0c;节省你的时间&#xff0c;并让你更加自信地与听众沟通。另外&#xff0c;智能提词器还可以提供一些有用的功能&#xff0c;如语音识别、智能建…...

oracle 19c rac环境配置firewalld

rac环境ip地址说明 [rootdb1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.100.19 db1 172.16.100.30 …...

Flutter 之Bloc入门指南实现倒计时功能

Flutter Timer By Bloc 前言Stream.periodic实现倒计时定义Bloc状态定义Bloc事件定义Bloc组件定义View层参考资料前言 使用Bloc开发Flutter的项目,其项目结构都很简单明确,需要创建状态,创建事件,创建bloc,创建对应的View。flutter_timer项目来分析下Bloc的使用方法。 通…...

目标识别数据集互相转换——xml、txt、json数据格式互转

VOC数据格式与YOLO数据格式互转 1.VOC数据格式 VOC&#xff08;Visual Object Classes&#xff09;是一个常用的计算机视觉数据集&#xff0c;它主要用于对象检测、分类和分割任务。VOC的标注格式&#xff0c;也被许多其他的数据集采用&#xff0c;因此理解这个数据格式是很重…...

211. 添加与搜索单词 - 数据结构设计---------------字典树

211. 添加与搜索单词 - 数据结构设计 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 211. 添加与搜索单词 - 数据结构设计 https://leetcode.cn/problems/design-add-and-search-words-data-structure/descriptio…...

SQL Server通过指令备份数据库和恢复数据库

数据库备份&#xff1a; backup database [MyTestDB]to diskD:\MyTestDB_20200101.bakwith format,init,stats1,compression 数据库恢复&#xff1a; restore database MyTestDB_newfrom diskD:\MyTestDB_20200101.bakwith move MyTestDB to D:\MyTestDB_new.mdf,move MyTest…...

windows如何上架ios应用到app store

Application Uploader iOS App上架工具是一款非常好用的针对iOS苹果应用程序软件开发的实用编程工具&#xff0c;它的主要作用是帮助用户进行快速的程序应用设计和程序应用调试&#xff0c;节省用户进行软件开发耗费的不必要时间&#xff01; ​ 编辑切换为居中 添加图片注释&…...

Hadoop学习日记-YARN组件

YARN(Yet Another Resource Negotiator)作为一种新的Hadoop资源管理器&#xff0c;是另一种资源协调者。 YARN是一个通用的资源管理系统和调度平台&#xff0c;可为上层应用提供统一的资源管理和调度 YARN架构图 YARN3大组件&#xff1a; &#xff08;物理层面&#xff09…...

汽车过户时,怎么选到理想的好车牌?

在汽车过户的过程中&#xff0c;选到一副理想的好车牌就像买彩票中大奖一样令人兴奋。但是&#xff0c;怎样找到这样一块车牌呢&#xff1f;这就是本文要探讨的问题。 首先&#xff0c;我们来聊聊选车牌的技巧。很多人喜欢选择有特别数字的车牌&#xff0c;如“8888”、“6666”…...

力扣468 验证IP地址

ipv4地址&#xff1a;1.必须是四个非空子串 2.每个非空子串不含前导零 3.子串里字符只能是0~255 ipv6地址&#xff1a;1.必须是八个非空子串 2。每段非空串得长度是否在1~4之间&#xff0c;且不含0-9&#xff0c;a-f&#xff0c;A-F之外得字符。 3.同时0-9也不允许含前导零 cl…...

前端静态登录页面实现

<template> <!-- <el-button type="primary" @click="handleLogin">测试登录</el-button>--> <!-- <el-button type="danger" @click="handleUserList">测试获取用户请求</el-button>-->…...

华为数通HCIA-网络参考模型(TCP/IP)

网络通信模式 作用&#xff1a;指导网络设备的通信&#xff1b; OSI七层模型&#xff1a; 7.应用层&#xff1a;由应用层协议&#xff08;http、FTP、Telnet.&#xff09;为应用程序产生对应的数据&#xff1b; 6.表示层&#xff1a;将应用层产生的数据转换成网络设备看得懂…...

java快速生成数据库表文档(HTML、DOC、MD)

在企业级开发中、我们经常会有编写数据库表结构文档的时间付出&#xff0c;关于数据库表结构文档状态&#xff1a;要么没有、要么有、但都是手写、后期运维开发&#xff0c;需要手动进行维护到文档中&#xff0c;很是繁琐&#xff0c;这里推荐一个开源项目&#xff1a;screw gi…...

Dojo学习和常用知识

目录 一、Dojo 的基本概念二、Dojo 的组件和模板三、Dojo 的应用场景四、Dojo 的未来发展五、学习 Dojo 的大纲和建议&#xff1a;六、Dojo 代码示例&#xff1a; Dojo 是一个流行的 JavaScript 库&#xff0c;用于开发 Web 应用程序。它提供了许多功能&#xff0c;如 DOM 操作…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...