当前位置: 首页 > article >正文

单片机实现触摸按钮执行自定义任务组件

触摸按钮执行自定义任务组件

在这里插入图片描述

项目简介

本项目基于RT8H8K001开发板 + RT6809CNN01开发板 + TFT显示屏(1024x600) + GT911触摸屏实现了一个多功能触摸按钮组件。系统具备按钮控制后执行任务的功能,可用于各类触摸屏人机交互场景。

硬件平台

  • MCU: STC8H8K64U(51单片机)(注:51 / ARM等单片机皆可)
  • 显示控制器: 瑞佑科技 RA8889或者RA6809
  • 显示屏: TFT 1024x600分辨率
  • 触摸屏: GT911电容触摸屏
  • MCU–显示控制器的通信方式: SPI-4

软件架构

软件主要包含以下几个模块:

  1. 主程序模块: 实现系统初始化、主循环和事件处理
  2. 按钮控件模块: 实现按钮的创建、绘制和交互处理
  3. 触摸屏模块: 实现触摸事件的扫描和处理
  4. 扩展:文字滚动模块: 实现文字的滚动显示效果

主要功能

系统提供四种测试按钮,分别实现不同的功能:

  1. Flat Button: 平面按钮,点击后执行绘图,显示字符串两个任务
  2. Round Button: 圆角按钮,点击后执行绘图,显示字符串两个任务
  3. Disabled Button: 禁用按钮,禁用后按钮不可使用的显示状态
  4. Standard Button: 标准按钮,3D效果,点击后执行弹跳球动画与滚动显示的字符串两个任务

功能流程图

1. 主程序流程

在这里插入图片描述

2. 文字滚动功能流程 (Test_Click4)

在这里插入图片描述

代码详解

1. 主程序初始化

主程序在初始化阶段完成以下工作:

  • 配置MCU的I/O口
  • 初始化SPI通信
  • 初始化RA8889/RA6809显示控制器
  • 初始化GT911触摸屏
  • 加载背景图像
  • 创建和配置按钮控件
  • 显示提示信息
void main()
{// 声明按钮指针BUTTON* btn1;BUTTON* btn2;BUTTON* btn3;BUTTON* btn4;// MCU I/O口配置P0M0 = 0xff & cClrb5; 	// 设置P0.5为双向口模式(SPI_MISO)P0M1 = 0x00;// 更多I/O配置...// SPI初始化SPI4_Init();// RA8889硬件复位和初始化RA8889_RST = 1;delay_ms(1);RA8889_RST = 0;delay_ms(1);RA8889_RST = 1;RA8889_Initial();// 初始化触摸屏GT911_Init();// 加载背景图像SPI_NOR_initial_JPG_AVI(1,0,BUS1,CS1,1);JPG_NOR(BINARY_INFO[0].start_addr, BINARY_INFO[0].img_size, canvas_image_width, 0,0);// 显示PNG图片SPI_NOR_initial_DMA (4,BUS1,CS1,1,0);SPI_NOR_DMA_png (BINARY_INFO[2].start_addr,Layer1,0,BINARY_INFO[2].img_width,BINARY_INFO[2].img_height);BTE_alpha_blending_32bit_Pixel_mode(BINARY_INFO[2].img_width,BINARY_INFO[2].img_width,BINARY_INFO[2].img_height,800,530,Layer0,canvas_image_width,800,530,Layer0,canvas_image_width,Layer1);// 显示标题文字Foreground_color_16M(color16M_white);Select_Font_Height_WxN_HxN_ChromaKey_Alignment(24,2,2,1,0);Goto_Text_XY(280,20);    Show_String("Button Control Example");// 初始化按钮控件Button_Init();// 创建并配置4个按钮// ...创建按钮代码...// 绘制所有按钮Button_DrawAll();// 显示提示信息// ...显示提示代码...// 主循环while(1) {// 检测触摸屏if(CTP_INT == 0){GT911_Scan();}// 处理按钮触摸Button_HandleTouch();// 延时delay_ms(10);}
}

2. 文字滚动功能 (Test_Click4)

文字滚动功能实现了一个从左向右滚动的文本显示效果,同时展示了一个弹跳球动画:

  • 文本从右向左滚入屏幕,然后向右滚动
  • 两段文本之间有10个空格的间隔,形成循环显示
  • 弹跳球在固定区域内自由运动,碰到边界会改变方向
void Test_Click4(void)
{// 变量声明char str[] = " Button 4 custom function executed!";char display_buffer[100];  // 滚动文本缓冲区char temp[41];            // 临时缓冲区int str_len;               // 字符串长度int display_width = 40;    // 显示区域宽度int start_pos = -display_width + 5;  // 起始位置int i, j;int x, y, dir_x, dir_y;    // 球的位置和方向// 初始化文本和区域// ...初始化代码...// 准备滚动文本:原文本 + 10空格 + 原文本str_len = strlen(str);strcpy(display_buffer, str);// 添加空格for(i = str_len; i < str_len + 10; i++) {display_buffer[i] = ' ';}// 添加第二段文本strcpy(&display_buffer[str_len + 10], str);display_buffer[str_len * 2 + 10] = '\0';// 初始化弹跳球参数x = 38;y = 15;dir_x = 1;dir_y = 1;i = 0;// 动画循环while(1){// 清空区域BTE_Solid_Fill(0,canvas_image_width,0,LCD_Height,color16M_white,300,150);// 更新球位置并绘制// ...球位置更新代码...// 显示滚动文本memset(temp, ' ', display_width); // 用空格填充临时缓冲区temp[display_width] = '\0';       // 确保字符串正确终止// 处理负值的start_posif(start_pos < 0) {// 先填充部分空格for(j = 0; j < -start_pos && j < display_width; j++) {temp[j] = ' ';}// 再填充可见的字符串部分for(; j < display_width && j + start_pos < strlen(display_buffer); j++) {temp[j] = display_buffer[j + start_pos];}} else {// 正常填充for(j = 0; j < display_width && j + start_pos < strlen(display_buffer); j++) {temp[j] = display_buffer[j + start_pos];}}temp[display_width] = '\0'; // 确保字符串终止// ...显示文本代码...// 更新滚动位置start_pos++;if(start_pos > str_len + 10) {start_pos = -display_width + 5;}// 检测退出条件if(CTP_INT == 0) break;}
}

使用说明

程序操作流程

  1. 程序启动后,会显示四个按钮和提示信息
  2. 点击不同的按钮可以进入不同的功能模式:
    • Flat Button: 绘图和显示一串字符
    • Round Button: 绘图和显示一串字符
    • Disabled Button: 绘图和显示一串字符
    • Standard Button: 显示弹跳球和滚动文字效果

文字滚动模式使用说明

  1. 点击"Standard Button"进入文字滚动和弹跳球模式
  2. 观察文字从左向右滚动效果和弹跳球动画
  3. 触摸屏幕任意位置可以退出该模式

注意事项

  1. 触摸坐标可能需要根据实际屏幕分辨率进行换算
  2. 文字滚动功能中,如果出现末尾显示多余字符的问题,请检查temp缓冲区的初始化和终止符设置

源码下载

请看到视频末尾。

实际效果展示

单片机-RAIO液晶控制芯片-触摸按钮组件

相关文章:

单片机实现触摸按钮执行自定义任务组件

触摸按钮执行自定义任务组件 项目简介 本项目基于RT8H8K001开发板 RT6809CNN01开发板 TFT显示屏(1024x600) GT911触摸屏实现了一个多功能触摸按钮组件。系统具备按钮控制后执行任务的功能&#xff0c;可用于各类触摸屏人机交互场景。 硬件平台 MCU: STC8H8K64U&#xff0…...

快速入手-前后端分离Python权限系统 基于Django5+DRF+Vue3.2+Element Plus+Jwt

引用&#xff1a;打造前后端分离Python权限系统 基于Django5DRFVue3.2Element PlusJwt 视频教程 &#xff08;火爆连载更新中..&#xff09;_哔哩哔哩_bibili 说明&#xff1a;1、结合个人DRF基础和该视频去根据自己的项目进行开发。 2、引用该视频中作者的思路去升华自身的项…...

【go】slice的浅拷贝和深拷贝

浅拷贝(Shallow Copy) 浅拷贝是指只复制切片本身的结构&#xff08;指针、长度和容量&#xff09;&#xff0c;而不复制底层数组的元素。 实现方式 直接赋值&#xff1a; slice1 : []int{1, 2, 3} slice2 : slice1 // 浅拷贝切片操作&#xff1a; slice1 : []int{1, 2, 3} s…...

Ai云防护技术解析——服务器数据安全的智能防御体系

本文深度解析AI云防护技术如何通过智能流量分析、动态行为建模、自适应防御策略构建服务器安全体系。结合2023年群联科技实战案例,揭示机器学习算法在识别新型DDoS攻击、加密流量检测、零日漏洞防御中的技术突破,并附Gartner最新防护效果验证数据。 AI驱动的流量特征建模技术…...

科技快讯 | DeepSeek 公布模型新学习方式;Meta发布开源大模型Llama 4;谷歌推出 Android Auto 14.0 正式版

Meta发布开源大模型Llama 4&#xff0c;首次采用“混合专家架构“ 4月6日&#xff0c;Meta推出开源AI模型Llama 4&#xff0c;包括Scout和Maverick两个版本&#xff0c;具备多模态处理能力。Scout和Maverick参数量分别为170亿和4000亿&#xff0c;采用混合专家架构。Meta同时训…...

JSONP跨域访问漏洞

一、漏洞一:利用回调GetCookie <?php$conn new mysqli(127.0.0.1,root,root,learn) or die("数据库连接不成功"); $conn->set_charset(utf8); $sql "select articleid,author,viewcount,creattime from learn3 where articleid < 5"; $result…...

记录一次StarRocks集群迁移的经历

记录一次StarRocks集群迁移的经历 新入职了一家公司,刚去做了两张报表后,接到一个任务,做StarRocks 集群迁移,背景是这样的就是以前是自建的SR,但是这个SR 是给线上业务用的,也就是说不是分析性业务,而是面向产品ToC 的,也了解了一下是因为单表数据量太大了,所以直接…...

图形裁剪算法

1.学习目标 理解区域编码(Region Code&#xff0c;RC) 设计Cohen-Sutherland直线裁剪算法 编程实现Cohen-Sutherland直线裁剪算法 2.具体代码 1.具体算法 /*** Cohen-Sutherland直线裁剪算法 - 优化版* author AI Assistant* license MIT*/// 区域编码常量 - 使用对象枚举…...

Python字典实战: 三大管理系统开发指南(班级+会议+购物车)(附源码)

目录 摘要 一、班级管理系统&#xff08;含成绩模块&#xff09; 1. 功能概述 2. 完整代码与解析 3. 代码解析与亮点 二、会议管理系统 1. 功能概述 2. 完整代码 3. 代码解析与亮点 三、购物车管理系统 1. 功能概述 2. 完整代码 3. 代码解析与亮点 四、总结与扩…...

R 语言科研绘图第 36 期 --- 饼状图-基础

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

vue 3 从零开始到掌握

vue3从零开始一篇文章带你学习 升级vue CLI 使用命令 ## 查看vue/cli版本&#xff0c;确保vue/cli版本在4.5.0以上 vue --version ## 安装或者升级你的vue/cli npm install -g vue/cli ## 创建 vue create vue_test ## 启动 cd vue_test npm run servenvm管理node版本&#…...

【R语言绘图】圈图绘制代码

绘制代码 rm(list ls())# 加载必要包 library(data.table) library(circlize) library(ComplexHeatmap) library(rtracklayer) library(GenomicRanges) library(BSgenome) library(GenomicFeatures) library(dplyr)### 数据准备阶段 ### # 1. 读取染色体长度信息 df <- re…...

OCR迁移

一、环境 操作系统&#xff1a;Centos57.6 数据库版本&#xff1a;12.2.0.1 场景&#xff1a;将OCR信息从DATA磁盘组迁移到OCR磁盘组 二、操作步骤 1.查看可用空盘 set lin 200 set pagesize 200 col DGNAME format a15 col DISKNAME format a15 col PATH format a20 col N…...

OpenCV 图形API(17)计算输入矩阵 src 中每个元素的平方根函数sqrt()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 计算数组元素的平方根。 cv::gapi::sqrt 函数计算每个输入数组元素的平方根。对于多通道数组&#xff0c;每个通道会独立处理。其精度大约与内置的 …...

python中的in关键字查找的时间复杂度

列表&#xff08;List&#xff09; 对于列表来说&#xff0c; in 运算符的复杂度是 O(n)&#xff0c;其中n是列表的长度。这意味着如果列表中有n个元素&#xff0c;那么执行 in 运算符需要遍历整个列表来查找目标元素。 以下是一个示例&#xff0c;演示了在列表中使用 in 运算…...

Python爬虫第6节-requests库的基本用法

目录 前言 一、准备工作 二、实例引入 三、GET请求 3.1 基本示例 3.2 抓取网页 3.3 抓取二进制数据 3.4 添加headers 四、POST请求 五、响应 前言 前面我们学习了urllib的基础使用方法。不过&#xff0c;urllib在实际应用中存在一些不便之处。以网页验证和Cookies处理…...

什么是可靠性工程师?

一、什么是可靠性工程师&#xff1f; 可靠性工程师就是负责确保产品在使用过程中不出故障、不给客户添麻烦。 你可以理解为是那种“挑毛病的人”&#xff0c;但不是事后挑&#xff0c;是提前想清楚产品在哪些情况下可能会出问题&#xff0c;然后解决掉。 比如&#xff1a; …...

linux (CentOS 10)使用传统程序语言(C)进行编译---主,子程序连接:子程序的编译

1 主程序 rootlocalhost:~/testc/testlink3# cat thanks.c #include <stdio.h> // 声明子程序 void thanks_2(void); int main(void) {printf("Hello World\n");thanks_2(); }2 子程序 rootlocalhost:~/testc/testlink3# cat thanks_2.c #include <stdio.…...

如何根据设计稿进行移动端适配:全面详解

如何根据设计稿进行移动端适配&#xff1a;全面详解 文章目录 如何根据设计稿进行移动端适配&#xff1a;全面详解1. **理解设计稿**1.1 设计稿的尺寸1.2 设计稿的单位 2. **移动端适配的核心技术**2.1 使用 viewport 元标签2.1.1 代码示例2.1.2 参数说明 2.2 使用相对单位2.2.…...

【Kafka基础】Kafka 2.8以下版本的安装与配置指南:传统ZooKeeper依赖版详解

对于仍在使用Kafka 2.8之前版本的团队来说&#xff0c;需要特别注意其强依赖外部ZooKeeper的特性。本文将完整演示传统架构下的安装流程&#xff0c;并对比新旧版本差异。 1 版本特性差异说明 1.1 2.8 vs 2.8-核心区别 特性 2.8版本 2.8-版本 协调服务 可选内置KRaft模式 …...

Redis-x64-3.2.100.msi : Windows 安装包(MSI 格式)安装步骤

Redis-x64-3.2.100.msi 是 Redis 的 Windows 安装包&#xff08;MSI 格式&#xff09;&#xff0c;适用于 64 位系统。 在由于一些环境需要低版本的Redis的安装包。 Redis-x64-3.2.100.msi 安装包下载&#xff1a;https://pan.quark.cn/s/cc4d38262a15 Redis 是一个开源的 内…...

ZoomCharts使用方法

本篇没有讲解&#xff0c;只是自己的小笔记&#xff0c;有看到的网友想明白具体用法的可以来私信我 <div class"zoomChartsComponent"><div id"zoomCharts-demo"></div></div> var ZoomChartsLicense ; var ZoomChartsLicenseKey…...

【云计算】打造高效容器云平台:规划、部署与架构设计

引言 随着移动互联网时代的大步跃进&#xff0c;互联网公司业务的爆炸式增长发展给传统行业带来了巨大的冲击和挑战&#xff0c;被迫考虑转型和调整。对于我们传统的航空行业来说&#xff0c;还存在传统的思维、落后的技术。一项新业务从提出需求到立项审批、公开招标、项目实…...

DeepSeek底层揭秘——《推理时Scaling方法》内容理解

4月初&#xff0c;DeepSeek 提交到 arXiv 上的最新论文正在 AI 社区逐渐升温。 论文核心内容理解 DeepSeek与清华大学联合发布的论文《奖励模型的推理时Scaling方法及其在大规模语言模型中的应用》&#xff0c;核心在于提出一种新的推理时Scaling方法&#xff0c;即通过动态调…...

JavaScript之Json数据格式

介绍 JavaScript Object Notation&#xff0c; js对象标注法&#xff0c;是轻量级的数据交换格式完全独立于编程语言文本字符集必须用UTF-8格式&#xff0c;必须用“”任何支持的数据类型都可以用JSON表示JS内内置JSON解析JSON本质就是字符串 Json对象和JS对象互相转化 前端…...

OBS 中如何设置固定码率(CBR)与可变码率(VBR)?

在使用 OBS 进行录制或推流时,设置“码率控制模式”(Rate Control)是非常重要的一步。常见的控制模式包括: CBR(固定码率):保持恒定的输出码率,适合直播场景。 VBR(可变码率):在允许的范围内动态调整码率,适合本地录制、追求画质。 一、CBR vs. VBR 的差异 项目CBR…...

使用 Rsync + Lsyncd 实现 CentOS 7 实时文件同步

文章目录 &#x1f300;使用 Rsync Lsyncd 实现 CentOS 7 实时文件同步前言介绍架构图&#x1f9f1;系统环境&#x1f527;Rsync配置&#xff08;两台都需安装&#xff09;关闭SELinux&#xff08;两台都需&#xff09; &#x1f4e6;配置目标端&#xff08;client&#xff09…...

C# 多线程并发编程基础

1. 线程基础 1.1 线程简介 C# 中的线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程中&#xff0c;是进程中的实际运作单位。一个进程可以包含多个线程&#xff0c;这些线程可以并发执行不同的任务。 1.2 线程的创建与启动 在 C# 中&#xff0c;可以使…...

RAG(检索增强生成)系统,提示词(Prompt)表现测试(数据说话)

在RAG(检索增强生成)系统中,评价提示词(Prompt)设计是否优秀,必须通过量化测试数据来验证,而非主观判断。以下是系统化的评估方法、测试指标和具体实现方案: 一、提示词优秀的核心标准 优秀的提示词应显著提升以下指标: 维度量化指标测试方法事实一致性Faithfulness …...

QML和C++交互

目录 1 QML与C交互基础1.1 全局属性1.2 属性私有化(提供接口访问) 2 QT与C交互&#xff08;C创建自定义对象&#xff0c;qml文件直接访问&#xff09;3 QT与C交互&#xff08;qml直接访问C中的函数&#xff09;4 QT与C交互&#xff08;qml端发送信号 C端实现槽函数&#xff09;…...