找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2872|回复: 5
收起左侧

单片机按键长短按识别程序的问题

[复制链接]
ID:91521 发表于 2018-11-17 14:49 | 显示全部楼层 |阅读模式
以下是一段识别按键长短按得单片机程序段,可是放到程序里却不能执行,请各位高手指导一下问题出在哪里?
void key_scan(void)
{
        if(key == KEY_DOWN)
        {
                delay_ms(30);
                for(keytime = 0; ((key == KEY_DOWN) && (keytime < LONG_KEY)); keytime++)
                {
                        delay_ms(50);
                }
                if(keytime >= LONG_KEY)
                {

                        led1 = LED_ON;
                        led2 = LED_OFF;               
                }                        
                if((keytime > 0) && (keytime < LONG_KEY))
                {
                    
                        led1 = LED_OFF;
                        led2 = LED_ON;
                }
        }
}   
回复

使用道具 举报

ID:428224 发表于 2018-11-17 15:32 | 显示全部楼层
可以改一下延时
回复

使用道具 举报

ID:428311 发表于 2018-11-17 17:56 | 显示全部楼层
可能for循环语句中当出现for循环过程中松开按键,没有及时跳出循环,用break跳出当前循环,有问题估计也就在循环体内
回复

使用道具 举报

ID:164602 发表于 2018-11-18 09:08 | 显示全部楼层
你这个程序的关键,就是for的循环时间,你确定你的长按时间是多少吗?如果你的长按时间没到,也就不会有你预计的结果了。
我是这样做的:
if (K1==0)
                {
                        n=0;
                        while(~Agoto)
                        {
                                n++;
                                Delay10ms(1);
                                if (n>200)
                                {
                                        break;
                                }
                        }
                        if (n>30)
                        {
                                LED=0xf0;
                        }
                        else
                        {
                                LED=0x0f;
                        }
                }
我这个是已经实验成功了的。
回复

使用道具 举报

ID:111634 发表于 2018-11-18 15:44 | 显示全部楼层
本帖最后由 zl2168 于 2018-11-19 16:12 编辑

给你介绍几个按键长短按参考案例
实例5  4种不同方式键控信号灯

Proteus仿真一下,确认有效。 实例5 不同方式键控灯.rar (31.72 KB, 下载次数: 17)
回复

使用道具 举报

ID:405193 发表于 2018-11-18 17:26 | 显示全部楼层
我也刚学单片机不久,是不是for循环语句应该这样写,for(keytime = 0; ((key == KEY_DOWN) && keytime < LONG_KEY); keytime++)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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