用c语言写一个模块化思想的GEC6818电子相册代码,使用交叉开发原理,使用文件IO接口函数,能够打开文件设备、读写文件设备;来读取BMP图片文件得信息,通过算法实现转换后把数据正确得显示到开发板上去----图片显示程序,可以正确打开触摸屏设备文件,捕捉触摸事件的产生并能判断手指滑动的方向来实现图片的切换图片切换程序。
时间: 2024-03-05 13:49:08 浏览: 33
非常感谢你的提问。下面是一个简单的模块化思想的GEC6818电子相册代码,使用交叉开发原理,使用文件IO接口函数,能够打开文件设备、读写文件设备;来读取BMP图片文件得信息,通过算法实现转换后把数据正确得显示到开发板上去,同时还能够正确打开触摸屏设备文件,捕捉触摸事件的产生并能判断手指滑动的方向来实现图片的切换。
首先,我们需要引入相关的头文件和宏定义:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <linux/input.h>
#include <errno.h>
#define BMP_HEADER_SIZE 54
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 480
#define TOUCH_DEV "/dev/input/event0"
#define FB_DEV "/dev/fb0"
```
接下来,我们需要定义相关的结构体和变量:
```c
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef unsigned char BYTE;
typedef struct {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BMPFILEHEADER;
typedef struct {
DWORD biSize;
int biWidth;
int biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BMPINFOHEADER;
typedef struct {
int x;
int y;
} POINT;
int fbfd; // framebuffer 文件描述符
char *fbp; // framebuffer 指针
int screensize; // 屏幕大小
int line_length; // 扫描线的长度
int touchfd; // 触摸屏文件描述符
BMPFILEHEADER fileHeader; // BMP 文件头
BMPINFOHEADER infoHeader; // BMP 信息头
```
然后,我们需要实现相关的函数:
```c
// 打开 framebuffer 设备
int open_fbdev() {
int fd = open(FB_DEV, O_RDWR);
if (fd < 0) {
perror("open framebuffer device failed");
exit(1);
}
return fd;
}
// 映射 framebuffer 设备
char *init_fbp() {
char *fbp = (char *) mmap(NULL, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);
if (fbp == MAP_FAILED) {
perror("mmap framebuffer device failed");
exit(1);
}
return fbp;
}
// 关闭 framebuffer 设备
void close_fbdev() {
munmap(fbp, screensize);
close(fbfd);
}
// 打开触摸屏设备
int open_touchdev() {
int fd = open(TOUCH_DEV, O_RDWR);
if (fd < 0) {
perror("open touch device failed");
exit(1);
}
return fd;
}
// 关闭触摸屏设备
void close_touchdev() {
close(touchfd);
}
// 读取 BMP 头信息
void read_bmp_header(int fd) {
int ret;
ret = read(fd, &fileHeader, BMP_HEADER_SIZE);
if (ret == -1) {
perror("read BMP file header failed");
exit(1);
}
ret = read(fd, &infoHeader, sizeof(BMPINFOHEADER));
if (ret == -1) {
perror("read BMP info header failed");
exit(1);
}
}
// 显示 BMP 图像
void show_bmp(char *bmp_data) {
int x, y;
POINT p = {0, 0};
BYTE *bmp_ptr = (BYTE *) bmp_data;
BYTE *fb_ptr = (BYTE *) fbp;
for (y = SCREEN_HEIGHT - 1; y >= 0; y--) {
for (x = 0; x < SCREEN_WIDTH; x++) {
p.x = x;
p.y = y;
int offset = (p.y * line_length) + (p.x * 2);
*(fb_ptr + offset) = *(bmp_ptr + 2); // B
*(fb_ptr + offset + 1) = *(bmp_ptr + 1); // G
*(fb_ptr + offset + 2) = *(bmp_ptr); // R
bmp_ptr += 3;
}
}
}
// 读取触摸屏事件
void read_touch_event() {
struct input_event ev;
int x1, y1, x2, y2;
while (1) {
read(touchfd, &ev, sizeof(ev));
if (ev.type == EV_ABS && ev.code == ABS_X) {
x1 = ev.value;
}
if (ev.type == EV_ABS && ev.code == ABS_Y) {
y1 = ev.value;
}
if (ev.type == EV_ABS && ev.code == ABS_PRESSURE && ev.value == 0) {
read(touchfd, &ev, sizeof(ev));
if (ev.type == EV_ABS && ev.code == ABS_X) {
x2 = ev.value;
}
if (ev.type == EV_ABS && ev.code == ABS_Y) {
y2 = ev.value;
}
if (x1 - x2 > 100) { // 左滑
printf("left swipe\n");
// 切换到下一张图片
}
if (x2 - x1 > 100) { // 右滑
printf("right swipe\n");
// 切换到上一张图片
}
}
}
}
```
最后,我们可以在主函数中调用这些函数来实现图片的读取和显示,以及触摸屏事件的处理:
```c
int main(int argc, char *argv[]) {
// 打开 framebuffer 设备
fbfd = open_fbdev();
// 获取屏幕大小和扫描线长度
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo);
ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo);
screensize = vinfo.yres_virtual * finfo.line_length;
line_length = finfo.line_length;
// 映射 framebuffer 设备
fbp = init_fbp();
// 打开触摸屏设备
touchfd = open_touchdev();
// 读取 BMP 图像文件并显示
int bmpfd = open("test.bmp", O_RDONLY);
if (bmpfd < 0) {
perror("open BMP file failed");
exit(1);
}
read_bmp_header(bmpfd);
char *bmp_data = (char *) malloc(infoHeader.biSizeImage);
if (!bmp_data) {
perror("malloc failed");
exit(1);
}
lseek(bmpfd, fileHeader.bfOffBits, SEEK_SET);
read(bmpfd, bmp_data, infoHeader.biSizeImage);
show_bmp(bmp_data);
free(bmp_data);
close(bmpfd);
// 读取触摸屏事件并处理
read_touch_event();
// 关闭触摸屏设备
close_touchdev();
// 关闭 framebuffer 设备
close_fbdev();
return 0;
}
```
这样,我们就实现了一个简单的GEC6818电子相册程序,能够读取BMP图片文件得信息,通过算法实现转换后把数据正确得显示到开发板上去,同时还能够正确打开触摸屏设备,捕捉触摸事件的产生并能判断手指滑动的方向来实现图片的切换。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)