/*作业2.触摸屏划动控制浏览 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/fb.h> // 帧缓冲设备头文件
#include <fcntl.h>
#include <linux/input.h> // 输入设备头文件int lcd_fd; // LCD设备文件描述符
int *memp; // 显存映射指针// 定义颜色数组(ARGB格式):红、绿、蓝、青、紫、黄、黑
int mycolor[] = {0x00ff0000,0x0000ff00,0x000000ff,0x0000ffff,0x00ff00ff,0x00ffff00,0x00000000};
int color_index = 0; // 当前颜色索引// 在LCD上显示指定颜色
void show_color(int color)
{// 操作显存int i,j;for (i = 0; i < 480; i++) // 遍历屏幕每一行{for(j = 0; j < 800; j++) // 遍历屏幕每一列{// 设置当前像素为指定颜色*(memp + i*800 + j) = mycolor[color];} }
}int main()
{// 初始化LCDlcd_fd = open("/dev/fb0", O_RDWR); // 打开帧缓冲设备文件if (lcd_fd < 0){perror("open"); // 打印错误信息exit(1); // 异常退出}// 映射显存:将物理显存映射到用户空间地址memp = mmap(NULL, 800*480*4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd_fd, 0);if (memp == MAP_FAILED){perror("mmap"); // 打印内存映射错误exit(1);}// 显示初始颜色show_color(color_index);// 打开触摸屏设备int fd = open("/dev/input/event0", O_RDONLY);if (fd == -1){perror("open");exit(1);}struct input_event ev; // 定义输入事件结构体int x,y,x1,y1; // x,y:当前坐标;x1,y1:触摸起始坐标// 主循环:持续监听触摸屏事件while (1){read(fd, &ev, sizeof(ev)); // 读取触摸屏事件// 调试输出:显示事件类型、代码和值//printf("type = %d, code = %d, value = %d\n", ev.type, ev.code, ev.value);// 处理X坐标事件(将1024范围映射到800像素)if (ev.type == EV_ABS && ev.code == ABS_X){x = ev.value*800/1024;}// 处理Y坐标事件(将600范围映射到480像素)else if (ev.type == EV_ABS && ev.code == ABS_Y){y = ev.value*480/600;}// 处理触摸屏按下事件(记录起始坐标)else if (ev.type == EV_KEY && ev.code == BTN_TOUCH && ev.value == 1){x1 = x;y1 = y;//printf("按下的坐标(%d, %d)\n", x, y);}// 处理触摸屏松开事件(判断滑动方向)else if (ev.type == EV_KEY && ev.code == BTN_TOUCH && ev.value == 0){//printf("松开的坐标(%d, %d)\n", x, y);// 左划超过50像素:切换到下一种颜色if (x < x1 - 50){color_index = (color_index + 1) % 6; // 循环切换颜色(0-5)show_color(color_index);}// 右划超过50像素:切换到上一种颜色else if (x > x1 + 50){color_index = (color_index - 1 + 6) % 6; // 循环切换颜色(处理负数)show_color(color_index);}// 上划超过100像素:退出程序(显示黑色)else if(y < y1 - 100){show_color(6); // 显示黑色break; // 退出循环}}}// 释放资源munmap(memp, 800*480*4); // 解除显存映射close(lcd_fd); // 关闭LCD设备文件close(fd); // 关闭触摸屏设备文件return 0;
}
关键功能说明:
-
颜色切换机制:
- 定义了 7 种颜色(红、绿、蓝、青、紫、黄、黑)
- 通过左右滑动屏幕切换颜色,上滑退出程序
-
滑动检测逻辑:
- 按下屏幕时记录起始坐标 (x1,y1)
- 松开屏幕时计算位移,判断滑动方向
- 水平滑动阈值为 50 像素,垂直滑动阈值为 100 像素
-
显存操作:
- 通过
mmap将 LCD 显存映射到用户空间 show_color函数直接操作显存指针填充颜色
- 通过
潜在问题:
- 颜色数组中索引 6 为黑色(0x00000000),但数组注释中未明确说明
- 滑动检测仅在触摸释放时进行,无法检测滑动过程中的连续变化
- 缺少错误处理(如触摸屏设备不存在)
- 程序退出时可能未正确清理资源(应添加信号处理)