我想不依靠输入而是触摸屏实现

时间: 2024-03-03 16:47:30 浏览: 22
好的,如果要使用触摸屏输入三个点的坐标,可以使用 Linux 下的输入子系统(input subsystem)来实现。下面是修改后的代码: ``` #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <errno.h> #include <unistd.h> #include <string.h> #include <math.h> #include <linux/input.h> // 添加了输入子系统的头文件 int lcd_fd = 0; int input_fd = 0; // 用来保存触摸屏的文件标识符 int OPEN_FIEL(char *pathname) { int fd = open(pathname,O_RDWR); if(fd == -1) { perror("open file fault!\n"); } return fd; } void CLOSE_FIEL(int fd) { close(fd); } void Lcd_Draw_Point(int x,int y,unsigned int color) { if(x<800 && x>=0 && y<480 && y>=0) { int offset = 4*(y*800+x); lseek(lcd_fd,offset,SEEK_SET); write(lcd_fd,&color,4); } } void Lcd_Clear(unsigned int color) { unsigned int temp_arr[480*800] = {0}; for(int i =0;i<480*800;i++) { temp_arr[i] = color; } write(lcd_fd,temp_arr,(480*800*4)); } void Lcd_draw_line(int y,unsigned int color) { for(int i =0;i<800;i++) { Lcd_Draw_Point(i,y,color); } } void Lcd_draw_triangle(int x1, int y1, int x2, int y2, int x3, int y3, unsigned int color) { float area = fabs((x1 - x3) * (y2 - y1) - (x1 - x2) * (y3 - y1)) / 2.0; int step_y = (y1 < y2) ? 1 : -1; int min_y = y1; int max_y = y3; if (y2 < min_y) { min_y = y2; } else if (y2 > max_y) { max_y = y2; } for (int y = min_y; y <= max_y; y += step_y) { float x_left = x1 + (y - y1) * (x3 - x1) / (y3 - y1); float x_right = x2 + (y - y2) * (x3 - x2) / (y3 - y2); for (int x = x_left; x <= x_right; x++) { Lcd_Draw_Point(x, y, color); } } } int main() { lcd_fd = OPEN_FIEL("/dev/fb0"); Lcd_Clear(0xffffffff); // 打开触摸屏 input_fd = OPEN_FIEL("/dev/input/event0"); // 读取三个点的坐标 int x1 = 0, y1 = 0, x2 = 0, y2 = 0, x3 = 0, y3 = 0; int point_count = 0; while (point_count < 3) { struct input_event ev; read(input_fd, &ev, sizeof(struct input_event)); if (ev.type == EV_ABS && ev.code == ABS_X) { if (point_count == 0) { x1 = ev.value; } else if (point_count == 1) { x2 = ev.value; } else if (point_count == 2) { x3 = ev.value; } } else if (ev.type == EV_ABS && ev.code == ABS_Y) { if (point_count == 0) { y1 = ev.value; } else if (point_count == 1) { y2 = ev.value; } else if (point_count == 2) { y3 = ev.value; } } else if (ev.type == EV_KEY && ev.code == BTN_TOUCH && ev.value == 0) { point_count++; } } // 绘制三角形 Lcd_draw_triangle(x1, y1, x2, y2, x3, y3, 0xffff0000); CLOSE_FIEL(lcd_fd); CLOSE_FIEL(input_fd); // 关闭触摸屏 return 0; } ``` 修改后的代码打开了触摸屏设备文件 `/dev/input/event0`,然后在一个循环中读取输入事件,当读取到 `ABS_X` 和 `ABS_Y` 类型的事件时,将事件的值保存到三个点的坐标变量中,当读取到 `BTN_TOUCH` 类型的事件时,说明一个点已经输入完成,将点的计数器 `point_count` 加 1。当 `point_count` 等于 3 时,就说明三个点都已经输入完成,此时调用 `Lcd_draw_triangle` 函数绘制三角形。注意,触摸屏的坐标值可能会超出屏幕的范围,因此需要在绘制三角形前添加检查坐标值是否在有效范围内的代码。

相关推荐

最新推荐

recommend-type

触摸屏与单片机的通信实现

本文介绍MODBUS RTU通信格式,字符帧由8个数据位,1个起始位,1个停止位,1个奇偶校验位(当不采用校验位时,则设置2个停止位)。发送或接收每个字节,必需经过一次CRC出错校验运算。
recommend-type

实现三菱PLC触摸屏控制伺服电机.doc

实现三菱PLC触摸屏控制伺服电机doc,实现三菱PLC触摸屏控制伺服电机
recommend-type

昆仑通态触摸屏导出工程目录方法

昆仑通态触摸屏运行工程文件夹加导出方法,得到mcgsbin文件,用于复制屏,或者解决锁机问题等等
recommend-type

基于Proteus的虚拟液晶触摸屏设计与应用

利用Proteus ISIS 中的元件制作功能,结合256 ×256 的图形液晶显示器,设计了一款虚拟液晶触摸屏,并将其应用到简易国际象棋对弈控制系统中,通过此嵌入式系统的设计和仿真,对虚拟液晶触摸屏的制作、合成及软件...
recommend-type

Qt下触摸屏鼠标动作的实现原理

描述了Qt下,触摸屏鼠标事件(如click ,press ,pressup)的实现原理
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。