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

一、基本流程
这个程序实现了一个实现简易的相册,使用6818开发板的液晶屏和触摸屏,可以显示多张BMP格式的图片,并支持通过触摸屏的操作切换图片。
程序的主要功能和流程如下:
-
打开液晶屏设备文件,并将液晶屏映射到内存:通过打开
/dev/fb0设备文件,并使用mmap函数将液晶屏映射到内存,以便后续在屏幕上显示图片。 -
打开触摸屏设备文件:通过打开
/dev/input/event0设备文件,实现对触摸屏输入事件的捕获和处理。 -
获取图片路径名字:通过
get_bmpname函数获取指定目录下的所有BMP格式图片的路径名字,并存储在数组bmppath中。 -
显示第一张图片:程序默认显示第一张图片,使用
show_bmp函数将图片显示在液晶屏上。 -
循环监听触摸事件:进入无限循环,程序不断监听触摸屏的输入事件。根据触摸坐标判断用户点击了屏幕的哪个区域。
-
切换图片:根据触摸坐标的位置,如果用户点击了右上角区域,则切换到上一张图片;如果点击了右下角区域,则切换到下一张图片。通过更新
bmppath数组的索引i来实现图片的切换,并调用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;
}
全部的文件打包放这了。
模拟相册
https://download.csdn.net/download/qq_64928278/88136955?spm=1001.2014.3001.5501
更多C语言和Linux系统相关文章,关注专栏:
手撕C语言
玩转linux
📢写在最后
- 今天的分享就到这啦~
- 觉得博主写的还不错的烦劳
一键三连喔~ - 🎉感谢关注🎉
相关文章:
【Liux下6818开发板(ARM)】实现简易相册
(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…...
Kubernetes(K8s)从入门到精通系列之六:K8s的基本概念和术语之存储类
Kubernetes K8s从入门到精通系列之六:K8s的基本概念和术语之存储类 一、存储类二、emptyDir三、hostPath四、公有云Volume五、其他类型的Volume六、动态存储管理一、存储类 存储类的资源对象主要包括: VolumePersistent VolumePVCStorageClass基础的存储类资源对象——Volum…...
Spark-统一内存模型
总结: Spark的内存模型分为4部分,分别是存储内存,计算内存,其他内存,预留内存; 其中存储内存和计算内存可以动态占用,当己方内存不足对方空余则可占用对方的内存,计算内存被存储内…...
类的继承和super关键字的使用(JAVA)
继承 所有的OOP语言都会有三个特征: 封装(点击可跳转);继承;多态 为什么会有继承呢?可以先看下面的例子: 上面这两个类中的代码很相似因为它们只有最后一个方法不同其它的都相同,这样…...
BGP属性+选路规则
目录 一,BGP的属性—基础属性 1.PrefVal 2.LocPrf 3、优先本地下一跳 (NextHop) 4、AS-PATH 5、起源属性 6、MED -多出口鉴别属性 二,BGP选路规则 三,BGP的社团属性 一,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; //这只是函数的一个声明并没有定义 };上面是一个类,我们可以把有花括号括起来的叫做一个域ÿ…...
智能提词器有哪些?了解一下这款提词工具
智能提词器有哪些?使用智能提词器可以帮助你更好地准备和交付演讲、报告或其他提词场合。它可以提高你的效率,节省你的时间,并让你更加自信地与听众沟通。另外,智能提词器还可以提供一些有用的功能,如语音识别、智能建…...
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(Visual Object Classes)是一个常用的计算机视觉数据集,它主要用于对象检测、分类和分割任务。VOC的标注格式,也被许多其他的数据集采用,因此理解这个数据格式是很重…...
211. 添加与搜索单词 - 数据结构设计---------------字典树
211. 添加与搜索单词 - 数据结构设计 原题链接:完成情况:解题思路:参考代码: 原题链接: 211. 添加与搜索单词 - 数据结构设计 https://leetcode.cn/problems/design-add-and-search-words-data-structure/descriptio…...
SQL Server通过指令备份数据库和恢复数据库
数据库备份: backup database [MyTestDB]to diskD:\MyTestDB_20200101.bakwith format,init,stats1,compression 数据库恢复: 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苹果应用程序软件开发的实用编程工具,它的主要作用是帮助用户进行快速的程序应用设计和程序应用调试,节省用户进行软件开发耗费的不必要时间! 编辑切换为居中 添加图片注释&…...
Hadoop学习日记-YARN组件
YARN(Yet Another Resource Negotiator)作为一种新的Hadoop资源管理器,是另一种资源协调者。 YARN是一个通用的资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度 YARN架构图 YARN3大组件: (物理层面)…...
汽车过户时,怎么选到理想的好车牌?
在汽车过户的过程中,选到一副理想的好车牌就像买彩票中大奖一样令人兴奋。但是,怎样找到这样一块车牌呢?这就是本文要探讨的问题。 首先,我们来聊聊选车牌的技巧。很多人喜欢选择有特别数字的车牌,如“8888”、“6666”…...
力扣468 验证IP地址
ipv4地址:1.必须是四个非空子串 2.每个非空子串不含前导零 3.子串里字符只能是0~255 ipv6地址:1.必须是八个非空子串 2。每段非空串得长度是否在1~4之间,且不含0-9,a-f,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)
网络通信模式 作用:指导网络设备的通信; OSI七层模型: 7.应用层:由应用层协议(http、FTP、Telnet.)为应用程序产生对应的数据; 6.表示层:将应用层产生的数据转换成网络设备看得懂…...
java快速生成数据库表文档(HTML、DOC、MD)
在企业级开发中、我们经常会有编写数据库表结构文档的时间付出,关于数据库表结构文档状态:要么没有、要么有、但都是手写、后期运维开发,需要手动进行维护到文档中,很是繁琐,这里推荐一个开源项目:screw gi…...
Dojo学习和常用知识
目录 一、Dojo 的基本概念二、Dojo 的组件和模板三、Dojo 的应用场景四、Dojo 的未来发展五、学习 Dojo 的大纲和建议:六、Dojo 代码示例: Dojo 是一个流行的 JavaScript 库,用于开发 Web 应用程序。它提供了许多功能,如 DOM 操作…...
8个单元素CSS加载器终极指南:如何用纯CSS创建高性能动画效果
8个单元素CSS加载器终极指南:如何用纯CSS创建高性能动画效果 【免费下载链接】css-loaders A collection of loading spinners animated with CSS 项目地址: https://gitcode.com/gh_mirrors/cs/css-loaders 在现代Web开发中,CSS加载器已成为提升…...
Claude Code子代理开发手册:如何打造专属AI编程助手(含MCP服务器对接技巧)
Claude Code子代理开发手册:如何打造专属AI编程助手(含MCP服务器对接技巧) 在当今快节奏的软件开发环境中,团队开发者越来越需要能够适应特定工作流程的智能辅助工具。Claude Code作为新一代AI编程助手平台,其子代理(…...
3分钟掌握Magika:AI驱动的文件类型检测终极指南
3分钟掌握Magika:AI驱动的文件类型检测终极指南 【免费下载链接】magika 项目地址: https://gitcode.com/GitHub_Trending/ma/magika Magika是一款基于深度学习的智能文件类型检测工具,由Google开源,能够快速准确地识别各种文件的内容…...
OpenClaw灾难恢复:Qwen3-32B-Chat配置备份与快速重建
OpenClaw灾难恢复:Qwen3-32B-Chat配置备份与快速重建 1. 为什么需要自动化备份策略 上周五凌晨三点,我的开发机突然宕机。硬盘故障导致OpenClaw所有配置和Qwen3-32B-Chat模型接入设置全部丢失——这个教训让我意识到:个人开发环境同样需要企…...
LiTmall:Java全栈电商系统的架构解密与实战应用
LiTmall:Java全栈电商系统的架构解密与实战应用 【免费下载链接】litemall linlinjava/litemall: LiTmall 是一个基于Spring Boot MyBatis的轻量级Java商城系统,适合中小型电商项目作为基础框架,便于快速搭建电子商务平台。 项目地址: htt…...
L1-012 计算指数、L1-013 计算阶乘和、 L1-014 简单题、 L1-015 跟奥巴马一起画方块、 L1-016 查验身份证
L1-012 计算指数、L1-013 计算阶乘和、L1-014 简单题、 L1-015 跟奥巴马一起画方块、 L1-016 查验身份证L1-012 计算指数题目描述输入格式输出格式输入样例输出样例解题思路C 代码双引号 " " 的作用拼接过程示例L1-013 计算阶乘和题目描述输入格式输出格式输入样例输…...
数字记忆策展:WeChatMsg与数据主权时代的个人记忆管理
数字记忆策展:WeChatMsg与数据主权时代的个人记忆管理 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCha…...
s2-pro音色复用效果实测:同一参考音频在不同文本长度下的泛化能力
s2-pro音色复用效果实测:同一参考音频在不同文本长度下的泛化能力 1. 测试背景与目的 s2-pro作为Fish Audio开源的专业级语音合成模型镜像,其核心亮点之一是支持通过参考音频复用音色。这项功能在实际应用中极为实用,比如: 企业…...
纯本地运行!AgentCPM深度研报助手,手把手教你离线生成研究报告
纯本地运行!AgentCPM深度研报助手,手把手教你离线生成研究报告 1. 为什么选择本地研报生成工具? 在信息爆炸的时代,专业研究报告的撰写面临三大痛点: 时间压力:从零开始撰写一份深度报告平均需要40-60小…...
Datart BI 工具数据库连接优化:解决 wait millis 5001 报错与连接池配置调整
1. 遇到 wait millis 5001 报错怎么办? 最近在帮客户部署 Datart BI 工具时,遇到了一个典型的数据库连接问题。每天早上业务高峰期,系统日志里就会频繁出现"wait millis 5001"的报错,但奇怪的是直接登录数据库服务器检查…...
