标题:
为什么我的按键只能实现短按?长按不行?
[打印本页]
作者:
打杂的
时间:
2024-8-2 17:20
标题:
为什么我的按键只能实现短按?长按不行?
#include <reg51.h>
/*
// 按下按键为高,松开为低。
//
*/
sbit led=P2^0; // 定义LED连接的端口,假设连接到P2.0
sbit BUTTON_PIN=P1^0; // 定义按钮连接的端口,假设连接到P1.0
bit flag = 0; // 用于标记按键状态
unsigned int count = 0; // 用于计时
void delay_ms(unsigned int ms) {
// 简单的延时函数,用于延时ms毫秒
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 335; j++);
}
void main()
{
P1 = 0x00; // 初始化 P1 口为高电平
while (1)
{
if (BUTTON_PIN == 1) // 检测按键是否按下
{
count++; // 开始计时
if (count < 500) // 短按判断(假设 500 个单位时间为短按阈值)
{
flag = 1; // 标记短按
}
else // 长按
{
flag = 2; // 标记长按
}
}
else // 按键松开
{
if (flag == 1) // 短按处理
{
led = 0; // 点亮 LED
delay_ms(500); // 闪烁间隔 500ms
delay_ms(500); // 闪烁间隔 500ms
delay_ms(500); // 闪烁间隔 500ms
delay_ms(500); // 闪烁间隔 500ms
delay_ms(500); // 闪烁间隔 500ms
delay_ms(500); // 闪烁间隔 500ms
led = 1;
}
else if (flag == 2) // 长按处理
{
led = ~led; // 闪烁 LED
delay_ms(500); // 闪烁间隔 500ms
}
flag = 0; // 重置标记
count = 0; // 重置计时
}
}
}
作者:
Jack315
时间:
2024-8-2 23:45
按键有“抖动”现象,导致 BUTTON_PIN == 1 的状态中断。
解决的方法是在硬件、软件上加上“去抖动”的措施。
用“按键去抖动”搜索就能在网上能找到各种实现方法。
正式产品应该两种措施都使用。
按键抖动的过程大致 10ms~50ms 。
延时建议用计时器中断来实现:定时准确,节省 CPU 资源。
作者:
xiaobendan001
时间:
2024-8-3 07:45
按下为高?P1=0,电路怎么接的?不进行消斗是万万不行的。
作者:
打杂的
时间:
2024-8-3 10:32
问题应该不是消抖的问题,应该只是识别到标志位flag=1
作者:
xiaobendan001
时间:
2024-8-3 11:27
打杂的 发表于 2024-8-3 10:32
问题应该不是消抖的问题,应该只是识别到标志位flag=1
高电平有效我是不怎么习惯,你这=0了,再给他施加到高电平,得灌入多少电流啊?会不会烧掉那个引脚?
你这代码的问题是哪个flag你声明的是bit型,所以它要么是0要么是1,永远也不会等于2,即使你赋值2,它也还是1.
作者:
Ubuntu312
时间:
2024-8-3 11:54
仔细看了一下代码,问题原因如 xiaobendan001 所说,定义类型的原因;
附加一句,仅供参考,一个建议。
count 标志量 达到一个阈值时,直接执行长按操作,即避免了使用多个标志量占内存,实时性也提高了
(count 达到阈值,直接执行长按操作,你这个是直到松开按键才判断长短按,实时性低了。 没别的意思,就是最近接收的一个工程看到的一个小问题)。
作者:
GlenXu
时间:
2024-8-3 11:56
我是做了一个0.1秒的“SISTICK”作为公用计时计数用的,所以当放生中断后我开始计数,通过判断按键回复时计数值大小即可,例如我是在1-4之间为短按,大于10(建议1-2秒以上)为长按。
然后执行不同的FN
作者:
lxj1245481730
时间:
2024-8-4 13:22
flag变量类型应该为unsigned char,bit只有0和1两种状态,所以永远进不了长按的条件判断语句
作者:
04097
时间:
2024-8-4 17:34
flag定义成了bit型,就只能取0,1;不管怎么样都不能满足你那个==2里面。可以初始就设成2试试,也是进不去的。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1