标题: 为什么我的按键只能实现短按?长按不行? [打印本页]

作者: 打杂的    时间: 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