找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 352|回复: 8
打印 上一主题 下一主题
收起左侧

为什么我的按键只能实现短按?长按不行?

[复制链接]
跳转到指定楼层
楼主
ID:218360 发表于 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;  // 重置计时
        }

    }

}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:891686 发表于 2024-8-2 23:45 | 只看该作者
按键有“抖动”现象,导致 BUTTON_PIN == 1 的状态中断。
解决的方法是在硬件、软件上加上“去抖动”的措施。
用“按键去抖动”搜索就能在网上能找到各种实现方法。
正式产品应该两种措施都使用。
按键抖动的过程大致 10ms~50ms 。

延时建议用计时器中断来实现:定时准确,节省 CPU 资源。
回复

使用道具 举报

板凳
ID:1109793 发表于 2024-8-3 07:45 | 只看该作者
按下为高?P1=0,电路怎么接的?不进行消斗是万万不行的。
回复

使用道具 举报

地板
ID:218360 发表于 2024-8-3 10:32 | 只看该作者
问题应该不是消抖的问题,应该只是识别到标志位flag=1
回复

使用道具 举报

5#
ID:1109793 发表于 2024-8-3 11:27 | 只看该作者
打杂的 发表于 2024-8-3 10:32
问题应该不是消抖的问题,应该只是识别到标志位flag=1

高电平有效我是不怎么习惯,你这=0了,再给他施加到高电平,得灌入多少电流啊?会不会烧掉那个引脚?
你这代码的问题是哪个flag你声明的是bit型,所以它要么是0要么是1,永远也不会等于2,即使你赋值2,它也还是1.
回复

使用道具 举报

6#
ID:1130105 发表于 2024-8-3 11:54 | 只看该作者
仔细看了一下代码,问题原因如 xiaobendan001 所说,定义类型的原因;

附加一句,仅供参考,一个建议。
count  标志量 达到一个阈值时,直接执行长按操作,即避免了使用多个标志量占内存,实时性也提高了
(count 达到阈值,直接执行长按操作,你这个是直到松开按键才判断长短按,实时性低了。  没别的意思,就是最近接收的一个工程看到的一个小问题)。
回复

使用道具 举报

7#
ID:469589 发表于 2024-8-3 11:56 | 只看该作者
我是做了一个0.1秒的“SISTICK”作为公用计时计数用的,所以当放生中断后我开始计数,通过判断按键回复时计数值大小即可,例如我是在1-4之间为短按,大于10(建议1-2秒以上)为长按。
然后执行不同的FN
回复

使用道具 举报

8#
ID:535881 发表于 2024-8-4 13:22 | 只看该作者
flag变量类型应该为unsigned char,bit只有0和1两种状态,所以永远进不了长按的条件判断语句
回复

使用道具 举报

9#
ID:1124287 发表于 2024-8-4 17:34 | 只看该作者
flag定义成了bit型,就只能取0,1;不管怎么样都不能满足你那个==2里面。可以初始就设成2试试,也是进不去的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表