利⽤粤嵌LinuxGEC6818开发板实现电⼦相册
实验⽬的
利⽤粤嵌LinuxGEC6818开发板实现电⼦相册,要求如下:
实验操作必须在Linux操作系统下完成
源代码模块化设计
实现⽔平或者垂直滑动切换图⽚
实验步骤
因为操作需要在Linux下运⾏,所以⾸先安装VM虚拟机,此次安装的系统是Ubuntu18,这⾥不再进⾏介绍。
涉及ARM编译,gcc编译的可执⾏⽂件,它只适合在X86架构上运⾏的linux上运⾏,并不能在ARM架构上的linux上运⾏。所以需要采⽤交叉开发。
交叉开发
有些产品(或设备)并不适合编辑编译代码。⽐如:51单⽚机,STM32…
把编辑编译和运⾏分开,我们在X86的机器上(电脑)编辑编译代码,再把可执⾏⽂件传输到产品(或设备)上运⾏。
gcc编译的可执⾏⽂件,它只适合在X86架构上运⾏的linux上运⾏。并不能在ARM架构上的linux上运⾏。
arm-linux-gcc编译的⽂件只适合在arm架构上的linux上运⾏。
因为需要让屏幕显⽰内容,必须先对屏幕进⾏坏点测试,排除屏幕坏点问题,全屏显⽰蓝⾊,程序如下:
#include"lcd.h"
/*宏定义*/
#define BLUE 0x0000FF
#define LCD_PATH "/dev/fb0"
/
/全局变量
int fd =-1;
int*plcd =NULL;
//lcd初始化
int lcd_init()
{
//1.打开屏幕⽂件
fd =open(LCD_PATH,O_RDWR);//可读可写打开
if(fd<0)
{
perror("open fail");
return-1;
}
//2.映射
plcd =mmap(NULL,
800*480*4,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd,
0);
if(plcd == MAP_FAILED)
{
perror("MAP fail");
return-1;
}
return0;
}
//LCD关闭
//LCD关闭
void lcd_close()
{
munmap(plcd,800*480*4);
close(fd);
}
//指定的点上显⽰指定的颜⾊
void display_point(int x,int y,int color)//x为⾼,y为宽
{
if(x >=0&& x <800&& y >=0&& y <480)
{
*(plcd +800* y + x)= color;
}
}
//LCD测试
linux系统安装步骤csdn
void lcd_test()
{
lcd_init();
int x,y;
for(y=0;y<480;y++)//遍历每⼀⾏
{
for(x=0;x<800;x++)//遍历每⼀列
{
display_point(x,y,BLUE);
}
}
// //写数据
/
/ write(fd,color,480*800*4);
lcd_close(fd);
}
确认屏幕没有坏点后,可以将图⽚写⼊屏幕中,让屏幕显⽰图⽚,在主函数中调⽤show_bmp(char * filename,int x0,int y0),即可显⽰让屏幕图⽚,filename为⽂件名,x0跟y0是屏幕显⽰的起始坐标,左上⾓为起始位(0,0)。程序如下:
#include"Bmp.h"
#include"lcd.h"
//显⽰图⽚
int show_bmp(char* filename,int x0,int y0)
{
//1.打开bmp图⽚
int fd =open(filename,O_RDWR);
//判断读⼊图⽚是否错误
if(-1== fd)
{
printf("Open %s Fail!\n",filename);
perror("--->");
return-1;
}
//2.判断到底是不是⼀张bmp图⽚
unsigned char buf[4];
read(fd,buf,2);
if(buf[0]!=0x42|| buf[1]!=0x4d)//若果不是B M 的ASCII码
{
printf("NOT BMP\n");
goto ERROR_END;
}
}
//3.读取数据
int width,height;
short depth;
lseek(fd,0x12,SEEK_SET);
read(fd,buf,4);
width=(buf[3]<<24)|
(buf[2]<<16)|
(buf[1]<<8)|
(buf[0]);
lseek(fd,0x16,SEEK_SET);
read(fd,buf,4);
height=(buf[3]<<24)|
(buf[2]<<16)|
(buf[1]<<8)|
(buf[0]);
lseek(fd,0x1c,SEEK_SET);
read(fd,buf,2);
depth=(buf[1]<<8)|
(buf[0]);
//只⽀持⾊深为24和32的
if(!(depth ==24|| depth ==32))
{
printf("NOT Support!\n");
goto ERROR_END;
}
printf("%s:%d*%d depth=%d\n",filename,width,height,depth);
//4.获取像素数组
int line_valid_bytes =abs(width)*depth/8;//⼀⾏有效字节数
int line_bytes;//⼀⾏总字节数=有效字节数+赖⼦数
int laizi =0;
if(line_valid_bytes%4)
{
laizi =4-line_valid_bytes%4;
}
line_bytes = line_valid_bytes + laizi;
int total_bytes = line_bytes*abs(height);//整个像素数组的⼤⼩
//开辟⼀块动态内存
unsigned char*piexl =(unsigned char*)malloc(total_bytes);//⽤完后需要释放内存
lseek(fd,54,SEEK_SET);
read(fd,piexl,total_bytes);
unsigned char a,r,g,b;
int color;
int i =0;
int x,y;
for(y=0;y<abs(height);y++)
{
for(x=0;x<abs(width);x++)
for(x=0;x<abs(width);x++)
{
/
/a r g b 0xargb ⼩端模式  b g r a
b = piexl[i++];
g = piexl[i++];
r = piexl[i++];
if(depth ==32)
{
a = piexl[i++];
}
else
{
a =0;//不透明
}
color=(a<<24)|(r<<16)|(g<<8)|(b);
//在屏幕对应的位置显⽰
display_point(width>0?x0+x:x0+abs(width)-x-1,
height>0?y0+abs(height)-y-1:y0+y,
color);
}
//每⼀⾏的末尾有可能填充⼏个赖⼦
i += laizi;
}
//释放内存
free(piexl);
//关闭显⽰
close(fd);
ERROR_END:
close(fd);
return-2;
}
//图⽚数组
// char * bmpname[] = {"1.bmp","2.bmp","3.bmp","4.bmp","5.bmp","6.bmp"}; //循环显⽰图⽚
void bmp_player(int i)
{
/
/    int i = 0;
//    while (1)
//    {
//循环显⽰
// show_bmp(bmpname[i],0,0);
//    延时5s
// sleep(5);
// i++;
// if (6 == i)
// {
//    i = 0;
/
/ }
// }
}
接下来获取⼿指触摸触摸坐标,程序如下:
#include"touch.h"
#define UP 1
#define DOWN 2
#define DOWN 2
#define LEFT 3
#define RIGHT 4
//宏定义
/
/设备⽂件
#define TOUCH_PATH "/dev/input/event0"
int GetDirection()
{
//1.打开触摸屏
lcd_init();
int fd =open(TOUCH_PATH,O_RDONLY);//只读打开
if(fd<0)
{
perror("open fail");
return0;
}
int x_start=-1,y_start=-1;//坐标的初值
int x_end =-1,y_end =-1;//坐标终点
struct input_event ev;
while(1)
{
//2.不停地从⽂件中读取数据
read(fd,&ev,sizeof(struct input_event));
//3.解析数据
pe == EV_ABS)//触摸事件
{
de == ABS_X)
{
if(-1== x_start)//x轴
{
x_start = ev.value;//起点
}
x_end = ev.value;//终点
}
de == ABS_Y)//y轴
{
if(-1== y_start)
{
y_start = ev.value;
}
y_end = ev.value;//终点
}
de ==ABS_PRESSURE && ev.value ==0)
{
if(x_start !=-1&& y_start !=-1)
{
break;
}
}
}
pe == EV_KEY && ev.code == BTN_TOUCH && ev.value ==0)//按键事件{
if(x_start !=-1&& y_start !=-1)
{
break;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。