首页 > 其他分享 >按键扫描,记录按键变化事件

按键扫描,记录按键变化事件

时间:2024-04-23 09:00:09浏览次数:13  
标签:key 记录 扫描 event current KEY 按键 EVENT

在Keil中实现按键扫描并记录按键变化事件,可以通过创建一个按键处理函数,该函数在每次被调用时检查按键状态,并在按键状态发生变化时记录事件。以下是一个简单的示例,说明如何使用C语言在Keil中实现这个过程:

首先,创建一个头文件(例如:key_event.h)来定义函数原型和宏定义:

#ifndef KEY_EVENT_H
#define KEY_EVENT_H

#include <stdint.h>

// 定义按键的端口和引脚
#define KEY1_PORT GPIO_PORTA
#define KEY1_PIN  GPIO_PIN_0
#define KEY2_PORT GPIO_PORTA
#define KEY2_PIN  GPIO_PIN_1
#define KEY3_PORT GPIO_PORTA
#define KEY3_PIN  GPIO_PIN_2

// 按键事件枚举
typedef enum {
    KEY_EVENT_NONE,
    KEY_EVENT_PRESSED,
    KEY_EVENT_RELEASED
} KeyEvent;

// 函数原型声明
void key_event_init(void);
KeyEvent key_scan(void);
void key_event_handler(void);

#endif // KEY_EVENT_H

然后,创建一个源文件(例如:key_event.c)来实现这些函数:

#include "key_event.h"

// 按键当前状态和上一次状态
static uint8_t key1_current, key1_last;
static uint8_t key2_current, key2_last;
static uint8_t key3_current, key3_last;

// 读取按键状态的函数
static uint8_t read_key(uint32_t port, uint32_t pin) {
    // 这里应该调用一个函数来读取GPIO引脚的状态
    // 例如:return GPIO_ReadPinInput(port, pin);
    // 假设这个函数返回0表示按键按下,1表示释放
    return 0; // 模拟按键状态
}

// 初始化按键状态
void key_event_init(void) {
    key1_last = read_key(KEY1_PORT, KEY1_PIN);
    key2_last = read_key(KEY2_PORT, KEY2_PIN);
    key3_last = read_key(KEY3_PORT, KEY3_PIN);
}

// 扫描按键状态
KeyEvent key_scan(void) {
    key1_current = read_key(KEY1_PORT, KEY1_PIN);
    key2_current = read_key(KEY2_PORT, KEY2_PIN);
    key3_current = read_key(KEY3_PORT, KEY3_PIN);

    if (key1_current != key1_last) {
        key1_last = key1_current;
        return key1_current ? KEY_EVENT_RELEASED : KEY_EVENT_PRESSED;
    }
    if (key2_current != key2_last) {
        key2_last = key2_current;
        return key2_current ? KEY_EVENT_RELEASED : KEY_EVENT_PRESSED;
    }
    if (key3_current != key3_last) {
        key3_last = key3_current;
        return key3_current ? KEY_EVENT_RELEASED : KEY_EVENT_PRESSED;
    }

    return KEY_EVENT_NONE;
}

// 处理按键事件
void key_event_handler(void) {
    KeyEvent event = key_scan();

    switch (event) {
        case KEY_EVENT_PRESSED:
            // 按键按下事件处理
            break;
        case KEY_EVENT_RELEASED:
            // 按键释放事件处理
            break;
        case KEY_EVENT_NONE:
            // 无事件或事件已处理
            break;
    }
}

最后,在你的主程序中包含头文件key_event.h,并使用这些函数来实现按键扫描任务和事件处理:

#include "key_event.h"

int main(void) {
    // 初始化按键
    key_event_init();

    // 主循环
    while (1) {
        // 处理按键事件
        key_event_handler();

        // 其他代码...

        // 延时,以减慢循环速度
        // 例如:HAL_Delay(10);
    }
}

在这个示例中,我们创建了一个key_event_handler函数,它调用key_scan函数来检查按键状态。如果按键状态发生变化,key_scan函数返回一个表示按键事件的事件枚举值。然后,key_event_handler函数根据返回的事件类型执行相应的操作。这种方法的优点是代码结构清晰,易于理解和维护。

标签:key,记录,扫描,event,current,KEY,按键,EVENT
From: https://www.cnblogs.com/icaowu/p/18152033

相关文章

  • 记录一次Prism报错
    前提:我的WPF程序在进入主程序之前显示登录界面此时不想登录,点击退出的时候报错了报错提示Anexceptionoccurredwhileinitializingmodule'ShellModule'.-Theexceptionmessagewas:Anexceptionhasoccurredwhiletryingtoaddaviewtoregion'AsideRegion'......
  • ROS1学习记录(1)
    学习视频:8.ROS命令行工具的使用_哔哩哔哩_bilibiliRSO指令:(1)rqt_graph :快速可视化节点关系在运行小海龟的时候可以再开一个终端就可以可视化两个节点之间关系;eg:上图可以看出从键盘节点输入信息最后运用在海龟图像节点上,这是他们之间的通讯关系,中间的/turtle1/cmd_vel就......
  • ARC176D 做题记录
    考场被创死了。套路,枚举值域\(i\),统计\(\lei\)和\(>i\)相邻的贡献。那么原排列对应一个\(01\)序列,其中\(0\)表示\(\lei\),\(1\)表示\(>i\)。然后拆贡献,考虑每个位置\(j(1\lej<n)\),\(j,j+1\)的组合有\(00,01,10,11\),我们只关心每次交换后的组合会怎么变。于是......
  • 记录如何用php做一个网站访问计数器的方法
    简介创建一个简单的网站访问计数器涉及到几个步骤,包括创建一个用于存储访问次数的文件或数据库表,以及编写PHP脚本来增加计数和显示当前的访问次数。方法以下是使用文件存储访问次数的基本步骤:创建一个文本文件来存储计数:在网站的根目录下创建一个名为counter.txt的文件,这个文......
  • 接口自动化Python+requests踩坑记录
    问题描述同一个接口,传参相同,用postman,jmeter等接口工具都能正常访问,后台也能正常返回数据,但是用requests.post()调用就会返回400jmeter传参以及响应这是一个登录接口,如图所示的传参,是可以正常登录的  postman传参以及响应可以看到,两个工具的传参不一样,但是也是同样可以正......
  • 记录真实项目中遇到的bug--010:支付截止bug
    T10:支付截止bug:1.优先级:T22.前提条件:已到截止时间,用户A未刷新页面3.预期结果:用户A点击支付宝,提示:支付已截止,并返回dashboard页面4.实际结果:用户A点击支付宝展示空白页5.缺陷跟踪:bug同步产品,告知先放着,只记录,不更改。6.总结:跟支付策略有关,无法修改原因:浏览器禁止用户在做异......
  • 数据湖问题记录跟进
    一、问题追踪问题详细描述提出问题时间是否完成计划完成时间备注了解Iceberg数据存储方式了解元数据存储信息、数据组织方式、查询时处理流程等20231013是20231019!!!20231124前均为大致的时间调研报告:调研报告-基于Iceberg构建湖仓一体平台调......
  • 记录:Flask 框架中,g对象的生命周期
    在Flask框架中,g对象是一个特殊的全局对象,它的设计目的是为了在不同的请求处理函数之间共享数据,但不需要将数据存储在session或数据库中。g对象的生命周期与当前的请求/响应周期紧密相关。以下是g对象生命周期的要点:创建:当一个请求到达Flask应用时,g对象会被创建并初始......
  • JPA使用问题总结记录
    1.jpa使用@OneToMany和@ManyToOne注解映射两个实体类的关系时报栈溢出的错误:>实体代码片段:①主表(一)@OneToMany(fetch=FetchType.EAGER,mappedBy="crewManagement",cascade=CascadeType.REMOVE)privateList<CrewMember>crewMemberList;②关联表(多)@ManyToOne@......
  • 新手学习记录丨Excel VBA(1)
    准备工作:开启ExcelVBA工作环境在MicrosoftExcel中,按键Alt+F11(或者Alt+Fn+F11)即可打开VBA编辑器。如下图所示,右键插入“模块”,即可开始在右侧的编辑器中编辑代码。实现最基本的任务:打印Helloworld在ExcelVBA中,字符串用双引号包围。我们可以使用MsgBox函数输出文......