【STC15】前后台方式实现按键的长按检测(面向对象)
1.【STC15 学习笔记】【转载】51单片机学习教程(简单入门)2.【STC15 学习笔记】Proteus仿真3.【STC15 学习笔记】8051 中断号简介4.【STC15 学习笔记】细说STC15单片机I/O口的四种工作模式5.【STC15】单片机中常说的 1T 和 12T 的意思6.【STC15】面向对象的.h/.c程序架构7.【STC15】内部RAM讲解(data/idata/xdata的区别)&全局变量的保存位置的设定8.【STC15】通过硬件PWM调整灯亮度9.【STC15】CCP PCA PWM区别
10.【STC15】前后台方式实现按键的长按检测(面向对象)
11.【STC15】实现printf()重定向的可能出现的问题的解决12.【STC15】系统低功耗状态机编程(面向对象思想)数据结构(结构体定义借鉴了面向对象思想):
#ifndef __KEY_H_
#define __KEY_H_
//定义按键引脚
#define KEY1_State P32
//定义结构体类型
typedef struct
{
uint8_t volatile KEY_Flag; //按键标志位
uint8_t Click; //单击
uint8_t Double_Click; //双击
uint8_t Press; //长按
void (*KEY_Detect)();
}KEY_t;
/* extern variables-----------------------------------------------------------*/
extern KEY_t KEY1;
/* extern function prototypes-------------------------------------------------*/
#endif
/********************************************************
End Of File
********************************************************/
后台:中断
/*
* @name INT0_isr
* @brief 外部中断0中断处理函数
* @param None
* @retval None
*/
void INT0_isr() interrupt 0
{
KEY1.KEY_Flag = TRUE;
//Run_LED.Run_LED_Flip();
}
前台:轮询
/* Includes ------------------------------------------------------------------*/
#include <main.h>
/* Private define-------------------------------------------------------------*/
/* Private variables----------------------------------------------------------*/
static void KEY_Detect();
/* Public variables-----------------------------------------------------------*/
KEY_t KEY1 = {FALSE,FALSE,FALSE,FALSE,KEY_Detect};
/* Private function prototypes------------------------------------------------*/
/*
* @name KEY_Detect
* @brief 按键检测
* @param None
* @retval None
*/
static void KEY_Detect()
{
uint8_t i;
//长按检测
if(KEY1.KEY_FLAG == TRUE)
{
KEY1.Press = TRUE; //如果有按键按下,默认会进行长按
for(i = 0;i<200;i++) //每次循环延时10ms,即延时2秒
{
Public.Delay_ms(10);
if(KEY1_State == 1) //如果这期间按键松开了,则达不到长按的条件
{
KEY1.Press = FALSE; //长按标志位清0
break; //提前结束延时
}
}
}
}
/*
* @name KEY_Act
* @brief 按键功能执行
* @param None
* @retval None
*/
static void KEY_Act()
{
//按键功能
//单击 -> 运行指示灯翻转
//长按 -> 运行指示灯闪一下
if(KEY1.Press == TRUE)
{
Run_LED.Run_LED_Flip();
Public.Delay_ms(100);
Run_LED.Run_LED_Flip();
}
else
{
if(KEY1.Click == TRUE)
{
Run_LED.Run_LED_Flip();
}
}
KEY1.Click = FALSE;
KEY1.Press = FALSE;
EX0 = 1; //打开中断
}
主函数:
/*
* @name main
* @brief 主函数
* @param void
* @retval int
*/
int main(void)
{
//系统初始化
Hradware.Sys_Init();
//系统主循环
while(1)
{
KEY1.KEY_Detect();//按键检测
KEY1.KEY_Act();//按键功能执行
}
}
扩展:单前台轮询方式实现多按键检测:
if(KEY_IO != 0xFF) //检测到有按键按下
{
DelayNms (20); //延时20毫秒(严重影响单片机的运行效率)
if (KEY_IO !=0xFF) //确认按键按下
{
switch (KEY_IO)
{
case 0xFE: KeyValue=1 ; break;
case 0xFD: KeyValue=2 ; break;
default: KeyValue=0 ; break;
}
}
}
参考文章:
原文链接:https://blog.csdn.net/weixin_46251230/article/details/126659466
合集:
STC15学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具