学习日志1:ARM开发版:在LCD屏幕上画圆,背景图自定义(图片格式为24位BMP图片)
步骤:
1.打开文件(图片文件和设备文件)
2.读取图片中的像素点数据
3.映射一块内存给fb0
4.给映射指针的循环赋值
具体代码如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <error.h>
#include <stdlib.h>
#include <sys/mman.h>
#define r_max 50 //大球半径
#define r_min 25 //小球半径
//pathname为图片路径,x0,y0为圆心起始坐标,speed为圆运动的速度
void *bmp_anywhere(char *pathname,int x0,int y0,int speed);
int main()
{
int x0=800/2,y0=480/2;
int speed;
printf("请输入你要的倍数:");
scanf("%d",&speed);
bmp_anywhere("qbhn1.bmp",x0,y0,speed);
return 0;
}
void *bmp_anywhere(char *pathname,int x0,int y0,int speed)
{
int flag_x=1;
int flag_y=1;
//打开图片
int fd_bmp = open(pathname,O_RDONLY);
int fd = open("/dev/fb0",O_RDWR);
if(fd_bmp == -1 || fd == -1)
{
perror("open");
return (void *)-1;
}
//读取图片的宽高
lseek(fd_bmp,18,SEEK_SET);
int width,height;
read(fd_bmp,&width,4);
read(fd_bmp,&height,4);
//判断图片宽度是否为4的倍数
int skip=width*3%4;
if(skip)
{
skip=4-width*3%4;
}
//读取图片的像素数据
char *bmp_space = (char *)calloc(1,width*height*3+skip*height);
lseek(fd_bmp,54,SEEK_SET);
read(fd_bmp,bmp_space,width*height*3);
//映射内存
int *mmap_bmp =(int *)mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(*mmap_bmp == -1)
{
perror("mmap");
return (void *)-1;
}
//将读出的数据放进映射指针指向的地址
int x,y,j,k,n=0;
while(1)
{
//碰壁改变标志位
if((x0+r_max)>799)
{
flag_x=0;
}
if((x0-r_max)<0)
{
flag_x=1;
}
if((y0+r_max)>479)
{
flag_y=0;
}
if((y0-r_max)<0)
{
flag_y=1;
}
//小球运动,标志位改变则改变方向
if(flag_x)
{
x0+=speed;
}
else
{
x0-=speed;
}
if(flag_y)
{
y0+=speed;
}
else
{
y0-=speed;
}
//LCD屏幕显示内容
for(y=0;y<480;y++)
{
for(x=0;x<800;x++,n+=3)
{
//显示小球
if((x-x0)*(x-x0)+(y-y0)*(y-y0)<=r_max*r_max)
{
//内球
if((x-x0)*(x-x0)+(y-y0)*(y-y0)<=r_min*r_min)
{
mmap_bmp[800*y+x]=0xffff00;
}
else
//显示外小球
{
mmap_bmp[800*y+x]=0xffffff;
}
}
//显示图片
else if(y<height&&x<width)
{
mmap_bmp[800*y+x] = bmp_space[3*((height-y)*width+x)]<<0 |
bmp_space[3*((height-y)*width+x)+1]<<8 |
bmp_space[3*((height-y)*width+x)+2]<<16;
// mmap_bmp[800*y+x] = bmp_space[3*(width*(height-y+(240-height/2))+(x+(400-width/2)))]<<0 |
// bmp_space[3*(width*(height-y+(240-height/2))+(x+(400-width/2)))+1]<<8 |
// bmp_space[3*(width*(height-y+(240-height/2))+(x+(400-width/2)))+2]<<16;
}
//图片以外的区域由黑色填充
else
{
mmap_bmp[800*y+x]=0x000000;
}
}
n+=skip;
}
}
//关闭文件,释放映射内存
close(fd);
close(fd_bmp);
munmap(mmap_bmp,800*480*4);
return (void *)0;
}