更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。

首先是外部进程传参,传进的是某目录文件的路径(绝对路径/相对路径)。接着打开目录文件,遍历目录内所有的文件,将后缀名为“.bmp”的普通文件全部找出来,并拼接保存它们的路径到双向循环链表里,一个节点存放一个bmp图片的路径。再通过触摸屏返回的坐标值进行逻辑判断,例如返回坐标值 < 400,触摸了左边的显示屏,我们应该让双向循环链表的当前节点 p 指向 p->prev节点,最后输出显示。

后续更新:
加上音频、视频后:基于ARM的LCD(800*480)触摸屏实现音频、视频播放、图像显示功能
加入百叶窗基本效果:LCD显示屏加入百叶窗特效显示BMP图片

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>
#include <sys/mman.h>
#include <linux/input.h>
#include <errno.h>
#include <dirent.h>int tsfd ;//触摸屏驱动
int dst;  //显示屏驱动//显示任意位置任意大小的BMP图片
bool showbmp(char *bmppath)
{int w = 0;int h = 0;int src = open(bmppath , O_RDWR);if(src == -1){printf("到头了!\n");}lseek(src, 18 ,SEEK_SET);   //获取BMP图片的宽w信息read(src, &w, 4);lseek(src, 22 ,SEEK_SET);    //获取BMP图片的高h信息read(src, &h, 4);char bmpbuf[w*h*3];int  lcdbuf[w*h];int  tempbuf[w*h];dst = open("/dev/fb0",O_RDWR);  //打开显示屏驱动if(dst == -1){printf("显示屏打开失败!\n");return -1;}lseek(src, 54, SEEK_SET);     //跳过BMP图片头信息字节int rubbish = (4-(w*3)%4)%4; //BMP图片字节不能被4整除时,加入的垃圾字节数for(int i = 0; i < h; i++){read(src, &bmpbuf[w*i*3],w*3);lseek(src, rubbish, SEEK_CUR);   //在字节读入时,跳过垃圾字节}for(int i = 0; i < w*h; i++)       //将RGB转换成BGR{lcdbuf[i] = 0x00<<24 | bmpbuf[i*3+2]<<16 | bmpbuf[i*3+1]<<8 | bmpbuf[i*3];}for(int i = 0; i < w; i++){for(int j = 0; j < h; j++){tempbuf[(h-1-j)*w+i] = lcdbuf[j*w+i]; //BMP像素点上下反转}}//内存映射int *mmap_bmp = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, dst, 0);for(int i = 0; i < h; i++){for(int j = 0; j < w; j++){//                自定义y偏移量    自定义x偏移量*(mmap_bmp+800*(((480-h)/2)+i)+((800-w)/2)+j) = tempbuf[i*w+j];}}//解除内存映射munmap(mmap_bmp, 800*480*4);close(src);close(dst);
}   //打开触摸屏
int touch_open()
{   tsfd=open("/dev/input/event0",O_RDWR);   //打开触摸屏驱动if(tsfd==-1){perror("打开触摸屏失败!\n");return -1;}return 0;}int get_xy(int *x, int *y)      //获取触摸屏的坐标值
{struct input_event myevent;int count = 0;while(1){read(tsfd,&myevent,sizeof(myevent));if(myevent.type==EV_ABS) //说明触发的是触摸屏事件{if(myevent.code==ABS_X) //x坐标{*x = (myevent.value*800)/1024;count ++;}if(myevent.code==ABS_Y) //y坐标{*y = (myevent.value*480)/600;count ++;}}if(count == 2)break;}
}   //关闭触摸屏
int touch_close()
{close(tsfd);return 0;
}//设置节点
struct node
{char *data;struct node *next;struct node *prev;
};//初始化链表
struct node *list_init()
{struct node *head = malloc(sizeof(struct node));head->next = head;head->prev = head;return head;
}//创建新节点
struct node *newnode(char *newdata)
{struct node *new = malloc(sizeof(struct node));new->data = newdata;new->next = NULL;new->prev = NULL;
}//加入新节点
int addnode(struct node *new,struct node *list)
{struct node *p = list;while(p->next != list){p = p->next;}new->prev = list->prev;new->next = list;list->prev = new;new->prev->next = new;
}int main(int argc,char **argv)
{struct node *list = list_init();//初始化双向循环链表DIR *dp = opendir(argv[1]);       //打开目录文件argv[1]struct dirent *p;while(p = readdir(dp))     //遍历目录文件{if(p->d_type == DT_REG){if(strstr(p->d_name,".bmp")) //判断是否为.bmp文件{struct node *new = newnode(p->d_name); //创建新节点addnode(new,list);  //插入新节点}                }}char buf[20];struct node *head = list->next;int tx = 0,ty = 0;touch_open();//打开触摸屏while(1){     get_xy(&tx, &ty);//获取触摸屏的坐标if(ty > 190 && ty < 290){if(tx > 700 && tx < 800)    //右翻{//printf("你点击的坐标位置X坐标是:%d\n", tx);//printf("你点击的坐标位置Y坐标是:%d\n", ty);head = head->next;bzero(buf,20);sprintf(buf,"%s/%s",argv[1],head->data);}if(tx < 100 && tx > 0)     //左翻{//printf("你点击的坐标位置X坐标是:%d\n", tx);//printf("你点击的坐标位置Y坐标是:%d\n", ty);head = head->prev;bzero(buf,20);sprintf(buf,"%s/%s",argv[1],head->data);}showbmp("background.bmp");//开发板下,可执行文件目录下存放的背景图(可以使用绝对路径!)showbmp(buf);    //显示BMP图片}  if(tx > 700 && ty < 100){showbmp("background.bmp");break;}}//关闭触摸屏touch_close();
}

我的background图:

基于Linux+6818开发板实现普通电子相册翻页功能相关推荐

  1. 迅为4418/6818开发板实现最小Linux系统自动挂载SD/TF卡/U盘等存储设备

    本文转自迅为论坛:http://www.topeetboard.com 在论坛里找到的,先做个笔记以后用到随时看 通过 mdev 工具实现 U 盘和 SD/TF 卡的自动挂载步骤如下: 一.配置内核 ...

  2. 利用粤嵌LinuxGEC6818开发板实现电子相册

    实验目的 利用粤嵌LinuxGEC6818开发板实现电子相册,要求如下: 实验操作必须在Linux操作系统下完成 源代码模块化设计 实现水平或者垂直滑动切换图片 实验步骤 因为操作需要在Linux下运 ...

  3. 【Verilog】基于Nexys4DDR开发板实现数字钟

    功能: 基于Nexys4DDR开发板实现的数字钟,六位数码管显示时分秒,可切换24时制/12时制,有整点报时功能(led灯闪烁). Verilog代码: `timescale 1ns / 1ps//数 ...

  4. 基于PYNQ-Z2开发板实现矩阵乘法加速详细流程

    基于PYNQ-Z2开发板实现矩阵乘法加速 主要内容 1.在Vivado HLS中生成矩阵乘法加速的IP核. 2.在Vivado中完成Block Design. 3.在Jupyter Notebook上 ...

  5. Mixly(米思齐)的安装以及基于Arduino开发板实现电容触摸控制灯

    Mixly(米思齐)的安装以及基于Arduino开发板实现电容触摸控制灯 1.Mixly下载 http://mixly.org/bnu-maker/mixly-arduino-win Mixly软件安 ...

  6. 基于STM32开发板实现传感数据采集-DHT11温湿度采集

    基于STM32开发板实现传感数据采集-DHT11温湿度采集 一.项目简介 本次项目是基于STM32开发板实现传感数据采集-DHT11温湿度采集.采用ARM结构中最为代表的Cortex-M4系列的芯片, ...

  7. STM32实例——基于STM32开发板实现传感数据采集-DHT11温湿度采集

    STM32开发板实现传感数据采集-DHT11温湿度采集 一.前言 本项目是基于STM32开发板的温湿度采集,传感器采用DHT11温湿度传感器,软件采用keil5等.本项目采用ARM结构中最为代表的Co ...

  8. 基于RK3588开发板实现多屏拼接

    基于RK3588开发板实现多屏拼接 多屏拼接功能说明 将一组完整的画面分割为若干子画面分别送给不同的屏幕显示,可以支持下图的多种模式 硬件环境 基于RK3588 EVB开发板实现4屏拼接,RK3588 ...

  9. RT3070无线网卡AP模式——开发板实现路由功能

    RT3070无线网卡有两种工作模式STA模式和softAP模式,分别由STA驱动和softAP驱动来实现,STA驱动支持无线网卡工作在STA模式下,可以连接到网络实现上网功能.而SoftAP的驱动支持 ...

最新文章

  1. 堆栈——Windows核心编程学习手札之十八
  2. 更换Winform 皮肤(上)----使用现有皮肤
  3. 小程序: 在同一个文件夹中配置多个页面
  4. 苹果屏幕一半失灵一半好的_佛说:一半一半(写的真好!)
  5. Visual Studio配置64/32位汇编程序开发环境
  6. 大学大专mysql考试试卷_MySQL数据库基础应用-中国大学mooc-试题题目及答案
  7. 王一博、张艺兴等多位明星起诉医美平台更美App
  8. Fragment+ViewPager+ButterKnife时控件会报空指针问题
  9. .Net程序猿玩转Android开发---(8)表格布局TableLayout
  10. mall架构及功能概览
  11. ubuntu:磁盘清理
  12. 多标签分类问题中的评价指标:准确率,交叉熵代价函数
  13. (struct)结构体变量作为函数参数调用的方法小结
  14. Google的搜索结果真的没有人为参与吗?
  15. apk开发教程!了解Android架构组件后,构建APP超简单!先收藏了
  16. DAE系统的设计-豆瓣首席架构师洪强宁
  17. php微擎Goto2C解密研究
  18. html文件访问遭拒,防止IE中出现“ SCRIPT5:访问被拒绝”错误
  19. win7系统32位和64位的区别是什么32位和64位哪一个更好
  20. 【CV】图像卷积计算即二维矩阵卷积(Python)

热门文章

  1. 利用公交刷卡数据分析北京职住关系和通勤出行
  2. 【element-ui】
  3. 使用python uiautomation从钉钉网页版提取公司所有联系人信息
  4. DC-DC PCB layout 指导
  5. ubuntu安装Linux集成服务,Hyper-v R2中安装ubuntu后,安装集成环境。--梦飞翔的地方(梦翔天空)...
  6. 什么是拓扑(Topology) - 3D 角色 建模过程中的 中的术语:拓扑
  7. 中山大学 精品课程C++ 视频教学
  8. 博学谷在线python教育_2020年最新 博学谷Python基础班(共9天)
  9. 异或运算与奇偶校验的作用
  10. 断舍离的难处-less is more