标题:
关于按键的单击和长按程序的问题
[打印本页]
作者:
231244234
时间:
2023-5-17 09:26
标题:
关于按键的单击和长按程序的问题
#include <stc8h.h>
#define BUTTON1_PIN P00
#define BUTTON2_PIN P01
#define LONG_PRESS_THRESHOLD 500 // 长按阈值,单位为毫秒
// 假设按键状态的枚举类型为 ButtonState
typedef enum {
IDLE,
PRESS,
RELEASE,
LONG_PRESS
} ButtonState;
// 按键状态变量
ButtonState button1State = IDLE;
ButtonState button2State = IDLE;
// 处理按键1的单击操作
void handleButton1Click() {
// 处理按键1的单击操作
COM4_DA_L= 0xff;
// ...
}
// 处理按键2的单击操作
void handleButton2Click() {
// 处理按键2的单击操作
COM5_DA_L= 0xff;
// ...
}
// 处理按键1的长按操作
void handleButton1LongPress() {
// 处理按键1的长按操作
// ...
}
// 处理按键2的长按操作
void handleButton2LongPress() {
// 处理按键2的长按操作
// ...
}
void delayMs(unsigned int ms) {
unsigned int i, j;
for (i = ms; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void main(void) {
// 初始化按键引脚设置
TSCHEN1 = 0xff;
TSCHEN2 = 0xff;
TSCFG1 = (7<<4) + 6; //开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1))
TSCFG2 = 1;
TSCTRL = 0x80;//使能触摸按键功能、自动重复扫描按键、不等待标志清零、使用内部32K晶振、不使能16位比较器、不使能低功耗唤醒、单次扫描1次
P_SW2 |= 0x80; //开启控制寄存器
P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
COMEN = 0xff; //使能 COM0~COM7
SEGENL = 0xff; //使能 SEG0~SEG7
SEGENH = 0xff; //使能 SEG8~SEG15
LEDCTRL = 0x20; //LED 驱动共阴/共阳模式
LEDCKS = 7; //设置 LED 刷新频率
LEDCTRL |= 0x80; //LED启动
while (1) {
// 检测按键1状态
if (BUTTON1_PIN == 0) {
delayMs(5); // 延时去抖动
if (BUTTON1_PIN == 0) {
// 按键1被按下
button1State = PRESS;
// 延时一段时间,并检测是否达到长按阈值
delayMs(LONG_PRESS_THRESHOLD);
if (BUTTON1_PIN == 0) {
// 达到长按阈值
button1State = LONG_PRESS;
handleButton1LongPress();
} else {
// 没有达到长按阈值,执行单击操作
button1State = RELEASE;
handleButton1Click();
}
// 等待按键释放
while (BUTTON1_PIN == 0);
button1State = IDLE;
}
}
// 检测按键2状态
if (BUTTON2_PIN == 0) {
delayMs(5); // 延时去抖动
if (BUTTON2_PIN == 0) {
// 按键2被按下
button2State = PRESS;
// 延时一段时间,并检测是否达到长按阈值
delayMs(LONG_PRESS_THRESHOLD);
if (BUTTON2_PIN == 0) {
// 达到长按阈值
button2State = LONG_PRESS;
handleButton2LongPress();
} else {
// 没有达到长按阈值,执行单击操作
button2State = RELEASE;
handleButton2Click();
}
// 等待按键释放
while (BUTTON2_PIN == 0);
button2State = IDLE;
}
}
}
}
// 执行其他代码逻辑
复制代码
为啥我按键没按他就已经亮了
作者:
wulin
时间:
2023-5-17 21:00
STC8H触摸键功能做长按有点难度。
Desktop.rar
(1.26 MB, 下载次数: 10)
2023-5-17 21:00 上传
点击文件名下载附件
作者:
lids
时间:
2023-5-18 08:43
按键消抖不要用延时
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1