标题: 单片机按键长短按识别程序的问题 [打印本页]

作者: daiya    时间: 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;
                }
        }
}   

作者: 红枫叶    时间: 2018-11-17 15:32
可以改一下延时
作者: xiong2013    时间: 2018-11-17 17:56
可能for循环语句中当出现for循环过程中松开按键,没有及时跳出循环,用break跳出当前循环,有问题估计也就在循环体内
作者: HC6800-ES-V2.0    时间: 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;
                        }
                }
我这个是已经实验成功了的。
作者: zl2168    时间: 2018-11-18 15:44
本帖最后由 zl2168 于 2018-11-19 16:12 编辑

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

Proteus仿真一下,确认有效。 实例5 不同方式键控灯.rar (31.72 KB, 下载次数: 17)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1.书中电路和程序设计有详细说明,程序语句条条有注解。

作者: yong761228    时间: 2018-11-18 17:26
我也刚学单片机不久,是不是for循环语句应该这样写,for(keytime = 0; ((key == KEY_DOWN) && keytime < LONG_KEY); keytime++)




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1