6818开发板简易相册

        此代码是在学校组织的粤嵌实习学习时写的,比较基础比较简易,小伙伴们可以参考参考,设计出自己满意的更为精致的相册。

        以下代码中涉及到了开发板显示屏和触碰屏的知识点,代码中写了一些备注以便于观看。

(注意:此代码不能直接使用,图片的地址与命名都要根据自身情况修改)

        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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值