2个回答
2020-08-21
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <linux/input.h>
int *plcd=NULL;//指向映射区域的首地址,用来操作一个个的颜色值,一个颜色值为4字节
int fd = -1;//帧缓冲设备的文件描述符
//lcd_init:lcd屏幕初始化
void lcd_init(void)
{
fd=open("/dev/fb0",O_RDWR);//打开显示屏文件
if(fd==-1)
{
perror("open lcd error:\n");
return ;
}
printf("open lcd success\n");
//如果打开了显示屏文件,游坦胡就将显示屏映射
//成功返回映射区域首地址,失败返回MAP_FAILED
plcd=mmap(NULL,800*480*4,PROT_WRITE | PROT_READ,MAP_SHARED,fd,0);
//lcd_draw_matrix(0,0,800,480,0xFFFFFF);//初始化背景色
//从文件fd 的0处开始以MAP_SHARED共享形式往有读写权限的未知区域NULL映射800*480*4这么多字节
if(plcd==MAP_FAILED)
{
perror("mmap error\n");
return;
}
printf("mmap success\n");
//至此,可以操作p_lcd来控制lcd屏幕
//如:write(fd,color,380*800*4);//从color空间读取380*800*4字节信息放到fd文件中
//这句语句相当于*(p_lcd+y*800+x)=color;//在点(x,y)处上色color
}
//lcd_uninit()关闭显示屏
void lcd_uninit()
{
munmap(plcd, 800*480*4);//解除映射
plcd = NULL;
close(fd);//关闭显示屏
}
void bmp_display(const char* filename,int x,int y)
{
//1.打开文件
int fd=open(filename,O_RDONLY);
if(-1 == fd)
{
printf("open %s fial",filename);
perror("fail");
return ;
}
//2.判断是不是bmp图片
char buf1[2];
read(fd,buf1,2);
if(!(buf1[0] == 0x42 || buf1[1] == 0x4d))
{
printf("NOT BMP\n");
return ;
}
//3.读取图片信息 宽 高 色深
int width,height;
short depth;/信穗/色深
unsigned char buf[4];
lseek(fd,0x12,SEEK_SET);
int r=read(fd,buf,4);
width=((buf[3]<<24)|(buf[2]<<16)|(buf[1]<<8)|buf[0]);
lseek(fd,0x16,SEEK_SET);
r=read(fd,buf,4);
height=((buf[3]<<24)|(buf[2]<<16)|(buf[1]<<8)|buf[0]);
lseek(fd,0x1c,SEEK_SET);
r=read(fd,buf,2);
depth=((buf[1]<<8|buf[0]));
//只显示24和32
if(!(depth==24||depth==32))
{
printf("Not support!!\n");
return ;
}
printf("width=%d hight=%d depth=%d\n"神拦,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 *piexls=malloc(total_bytes);
lseek(fd,54,SEEK_SET);
r=read(fd,piexls,total_bytes);
//一个像素 ARGB
unsigned char a,R,g,b;
int color;
int i = 0;
int x0,y0;
for(y0=0;y0<abs(height);y0++)
{ //显示一行
for(x0=0;x0<abs(width);x0++)
{
b=piexls[i++];
g=piexls[i++];
R=piexls[i++];
if(depth==32)
{
a=piexls[i++];
}
else
{
a=0;
}
color = (a<<24)|(R<<16)|(g<<8)|b;
lcd_draw_point(width>0?x+x0:abs(width)+x-1-x0,
height>0?y+height-1-y0:y+y0,color);
}
//每一行的后面。可能会有“赖子”
i += laizi;
}
free(piexls);
close(fd);
}
//触摸屏
int x=-1,y=-1;
void get_xy(void)
{
struct input_absinfo absI;
//1.打开触摸屏
int fd = open("/dev/input/event0",O_RDONLY);
if(-1 == fd)
{
perror("open fail");
return ;
}
//2.获取用户输入
struct input_event ev;
int flag_x = 0;
//int flag_y = 0;
//得到X轴的abs信息
ioctl(fd,EVIOCGABS(ABS_X),&absI);
printf("x abs lastest value=%d\n",absI.value);
printf("x abs min=%d\n",absI.minimum);
printf("x abs max=%d\n",absI.maximum);
//得到y轴的abs信息
ioctl(fd,EVIOCGABS(ABS_Y),&absI);
printf("y abs lastest value=%d\n",absI.value);
printf("y abs min=%d\n",absI.minimum);
printf("y abs max=%d\n",absI.maximum);
//得到按压轴的abs信息
ioctl(fd,EVIOCGABS(ABS_PRESSURE),&absI);
printf("pressure abs lastest value=%d\n",absI.value);
printf("pressure abs min=%d\n",absI.minimum);
printf("pressure abs max=%d\n",absI.maximum);
while(1)
{
int res=read(fd,&ev,sizeof(ev));
if(res!=sizeof(ev))
{
continue;
}
if(ev.type==EV_ABS&&ev.code ==ABS_X)//获取x轴
{
x=ev.value;//
flag_x=1;//x轴获取了
}
if(ev.type==EV_ABS&&ev.code == ABS_Y)//获取y轴
{
y=ev.value;
if(flag_x)
{
flag_x=0;
if(524<x&&x<627&&y>500&&y<600)//循环播放的位置
{
while(1)//五张图循环播放
{
bmp_display("./5.bmp",0,0);
sleep(2);
bmp_display("./6.bmp",0,0);
sleep(2);
bmp_display("./7.bmp",0,0);
sleep(2);
bmp_display("./8.bmp",0,0);
sleep(2);
bmp_display("./9.bmp",0,0);
sleep(2);
}
}
printf("%d %d\n",x,y);
break;//x y轴的坐标我们都已经找到了 退出循环落
}
}
}
close(fd);
}
int main(void)
{
lcd_init();
bmp_display("./3.bmp",410,400);//播放按钮在显示屏的位置
while(1)
{
get_xy();
}
lcd_uninit();
}
c语言开发板做的
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <linux/input.h>
int *plcd=NULL;//指向映射区域的首地址,用来操作一个个的颜色值,一个颜色值为4字节
int fd = -1;//帧缓冲设备的文件描述符
//lcd_init:lcd屏幕初始化
void lcd_init(void)
{
fd=open("/dev/fb0",O_RDWR);//打开显示屏文件
if(fd==-1)
{
perror("open lcd error:\n");
return ;
}
printf("open lcd success\n");
//如果打开了显示屏文件,游坦胡就将显示屏映射
//成功返回映射区域首地址,失败返回MAP_FAILED
plcd=mmap(NULL,800*480*4,PROT_WRITE | PROT_READ,MAP_SHARED,fd,0);
//lcd_draw_matrix(0,0,800,480,0xFFFFFF);//初始化背景色
//从文件fd 的0处开始以MAP_SHARED共享形式往有读写权限的未知区域NULL映射800*480*4这么多字节
if(plcd==MAP_FAILED)
{
perror("mmap error\n");
return;
}
printf("mmap success\n");
//至此,可以操作p_lcd来控制lcd屏幕
//如:write(fd,color,380*800*4);//从color空间读取380*800*4字节信息放到fd文件中
//这句语句相当于*(p_lcd+y*800+x)=color;//在点(x,y)处上色color
}
//lcd_uninit()关闭显示屏
void lcd_uninit()
{
munmap(plcd, 800*480*4);//解除映射
plcd = NULL;
close(fd);//关闭显示屏
}
void bmp_display(const char* filename,int x,int y)
{
//1.打开文件
int fd=open(filename,O_RDONLY);
if(-1 == fd)
{
printf("open %s fial",filename);
perror("fail");
return ;
}
//2.判断是不是bmp图片
char buf1[2];
read(fd,buf1,2);
if(!(buf1[0] == 0x42 || buf1[1] == 0x4d))
{
printf("NOT BMP\n");
return ;
}
//3.读取图片信息 宽 高 色深
int width,height;
short depth;/信穗/色深
unsigned char buf[4];
lseek(fd,0x12,SEEK_SET);
int r=read(fd,buf,4);
width=((buf[3]<<24)|(buf[2]<<16)|(buf[1]<<8)|buf[0]);
lseek(fd,0x16,SEEK_SET);
r=read(fd,buf,4);
height=((buf[3]<<24)|(buf[2]<<16)|(buf[1]<<8)|buf[0]);
lseek(fd,0x1c,SEEK_SET);
r=read(fd,buf,2);
depth=((buf[1]<<8|buf[0]));
//只显示24和32
if(!(depth==24||depth==32))
{
printf("Not support!!\n");
return ;
}
printf("width=%d hight=%d depth=%d\n"神拦,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 *piexls=malloc(total_bytes);
lseek(fd,54,SEEK_SET);
r=read(fd,piexls,total_bytes);
//一个像素 ARGB
unsigned char a,R,g,b;
int color;
int i = 0;
int x0,y0;
for(y0=0;y0<abs(height);y0++)
{ //显示一行
for(x0=0;x0<abs(width);x0++)
{
b=piexls[i++];
g=piexls[i++];
R=piexls[i++];
if(depth==32)
{
a=piexls[i++];
}
else
{
a=0;
}
color = (a<<24)|(R<<16)|(g<<8)|b;
lcd_draw_point(width>0?x+x0:abs(width)+x-1-x0,
height>0?y+height-1-y0:y+y0,color);
}
//每一行的后面。可能会有“赖子”
i += laizi;
}
free(piexls);
close(fd);
}
//触摸屏
int x=-1,y=-1;
void get_xy(void)
{
struct input_absinfo absI;
//1.打开触摸屏
int fd = open("/dev/input/event0",O_RDONLY);
if(-1 == fd)
{
perror("open fail");
return ;
}
//2.获取用户输入
struct input_event ev;
int flag_x = 0;
//int flag_y = 0;
//得到X轴的abs信息
ioctl(fd,EVIOCGABS(ABS_X),&absI);
printf("x abs lastest value=%d\n",absI.value);
printf("x abs min=%d\n",absI.minimum);
printf("x abs max=%d\n",absI.maximum);
//得到y轴的abs信息
ioctl(fd,EVIOCGABS(ABS_Y),&absI);
printf("y abs lastest value=%d\n",absI.value);
printf("y abs min=%d\n",absI.minimum);
printf("y abs max=%d\n",absI.maximum);
//得到按压轴的abs信息
ioctl(fd,EVIOCGABS(ABS_PRESSURE),&absI);
printf("pressure abs lastest value=%d\n",absI.value);
printf("pressure abs min=%d\n",absI.minimum);
printf("pressure abs max=%d\n",absI.maximum);
while(1)
{
int res=read(fd,&ev,sizeof(ev));
if(res!=sizeof(ev))
{
continue;
}
if(ev.type==EV_ABS&&ev.code ==ABS_X)//获取x轴
{
x=ev.value;//
flag_x=1;//x轴获取了
}
if(ev.type==EV_ABS&&ev.code == ABS_Y)//获取y轴
{
y=ev.value;
if(flag_x)
{
flag_x=0;
if(524<x&&x<627&&y>500&&y<600)//循环播放的位置
{
while(1)//五张图循环播放
{
bmp_display("./5.bmp",0,0);
sleep(2);
bmp_display("./6.bmp",0,0);
sleep(2);
bmp_display("./7.bmp",0,0);
sleep(2);
bmp_display("./8.bmp",0,0);
sleep(2);
bmp_display("./9.bmp",0,0);
sleep(2);
}
}
printf("%d %d\n",x,y);
break;//x y轴的坐标我们都已经找到了 退出循环落
}
}
}
close(fd);
}
int main(void)
{
lcd_init();
bmp_display("./3.bmp",410,400);//播放按钮在显示屏的位置
while(1)
{
get_xy();
}
lcd_uninit();
}
c语言开发板做的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
flash做吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询