此代码是在学校组织的粤嵌实习学习时写的,比较基础比较简易,小伙伴们可以参考参考,设计出自己满意的更为精致的相册。
以下代码中涉及到了开发板显示屏和触碰屏的知识点,代码中写了一些备注以便于观看。
(注意:此代码不能直接使用,图片的地址与命名都要根据自身情况修改)
tx全局变量用于获取触碰屏幕时的X坐标位置(横向坐标)
此相册只支持三张图片的展示,但需要时也可以复制粘贴修改main()中的条件语句来增加图片数量。程序算不上有多简易,阅读时还请多谅解。
功能简单的描述一下
触屏左边,图片会显示上一张;触屏右边,图片会显示下一张。开始运行时会默认展示第一张图片,如果当前显示第一张图片并且触屏左边时,图片会显示最后一张;如果当前显示最后一张图片并且触屏右边时,图片会显示第一张。
跟着学了几天6818开发板,只能说C语言不愧是面向过程的语言。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/mman.h>
#include <linux/input.h>
#define MMAP_SIZE 800*480*4
int *p = NULL;//防止P野指针,导致程序崩溃,段错误
int lcd_fd = -1;//设置lcd_fd的初始值,如果文件未打开会接着显示打开失败
int ts_fd = -1;//设置ts_fd_fd的初始值,如果文件未打开会接着显示打开失败
int tx;
//打开显示屏文件
int lcd_init()
{
lcd_fd = open("/dev/fb0",O_RDWR);
if(lcd_fd < 0)
{
perror("打开失败\n");
return -1;
}
//对LCD进行内存映射 int a
p = mmap(NULL,MMAP_SIZE,PROT_READ | PROT_WRITE,MAP_SHARED,lcd_fd,0);
if(p == NULL)
{
perror("映射失败\n");
return -1;
}
}
//打开触摸屏文件
int cmp_init()
{
ts_fd = open("/dev/input/event0",O_RDWR);
if(ts_fd < 0)
{
perror("打开失败\n");
return -1;
}
}
//展示图片功能
int show_bmp(char*patrh)
{
//打开图片
int bmp_fd = open(patrh,O_RDONLY);
if(bmp_fd < 0)
{
perror("打开图片文件失败\n");
return -1;
}
//3、读取BMP颜色数据
char color_buf[800*480*3] = {0};
//偏移54个字节
lseek(bmp_fd,54,SEEK_SET);
read(bmp_fd,color_buf,sizeof(color_buf));
int x,y;
char r,g,b;
int color;
int i = 0;
for(y=0; y<480;y++)
{
for(x=0;x<800;x++)
{
b = color_buf[i++];
g = color_buf[i++];
r = color_buf[i++];
color = b | g<<8 | r<<16;
*(p+800*(479-y)+x) = color;
}
}
close(bmp_fd);
}
//屏幕触碰功能
int cmp()
{
int y;
//定义一个结构体变量 int a
struct input_event ts;
while(1)
{
//获取结构体成员的值
read(ts_fd,&ts,sizeof(ts));
//判断是否为触摸屏事件
if(ts.type == EV_ABS)
{
if(ts.code == ABS_X) //X轴事件
{
//tx = ts.value; //蓝色版本
tx = ts.value*800/1024; //黑色版本
}
if(ts.code == ABS_Y) //Y轴事件
{
//ty = ts.value; //蓝色版本
y = ts.value*480/600; //黑色版本
}
}
//判断是否松手
if(ts.type == EV_KEY && ts.code == BTN_TOUCH && ts.value == 0)
{
printf("(x:%d,y:%d)\n",tx,y);
break;
}
}
}
int main()
{
lcd_init();
cmp_init();
show_bmp("/xiaozu/ly.bmp");
int i = 1;
while(1)
{
cmp();
if(tx >= 0 && tx <= 250)
{
//上一张
printf("上一张\n");
i--;
if(i < 1)
{
i = 3;
}
switch (i)
{
case 1 : show_bmp("/xiaozu/1.bmp");break;
case 2 : show_bmp("/xiaozu/2.bmp");break;
case 3 : show_bmp("/xiaozu/3.bmp");break;
}
}
else if(tx >= 550 && tx < 800)
{
//下一张
printf("下一张\n");
i++;
if(i > 3)
{
i = 1;
}
switch (i)
{
case 1 : show_bmp("/xiaozu/1.bmp");break;
case 2 : show_bmp("/xiaozu/2.bmp");break;
case 3 : show_bmp("/xiaozu/3.bmp");break;
}
}
else
{
printf("结束\n");
break;
}
}
close(lcd_fd);
close(ts_fd);
return 0;
}