标题: 单片机按键程序单击双击长按有不同功能(c语言源程序) [打印本页]

作者: 无奥运    时间: 2017-8-14 14:34
标题: 单片机按键程序单击双击长按有不同功能(c语言源程序)
uchar S_key = 2,D_key = 1,L_key = 3,N_key = 0;
bit b_key_led;
bit b_key_smg;

uchar key_drive(void)
{
        static uchar key_state;
        static uint key_time = 0;
        uchar key_return;
        key_return = N_key;

        switch(key_state)
        {
                case 0:
                {
                        if(!S1)
            {
                                key_state = 1;
                        }
                };break;
                case 1:
                {
                        if(!S1)
                        {
                                key_time = 0;
                                key_state = 2;
                        }
                        else
                        {
                                key_state = 0;
                        }
                };break;
                case 2:
                {
                        if(S1)
                        {
                                key_return = D_key;
                                key_state = 0;
                        }
                        else if(++key_time >= 1500)
                        {
                                key_return = L_key;
                                key_state = 3;
                        }
                };break;
                case 3:
                {
                        if(S1)
                        {
                                key_state = 0;
                        }
                };break;
        }
        return key_return;
}

uchar key_read(void)
{
        static uchar key_state_1,key_time_1 = 0;
        uchar key_return,key_temp;

        key_temp = key_drive();
        switch(key_state_1)
        {
                case 0:
                {
                        if(key_temp == D_key)
                        {
                                key_time_1 = 0;
                                key_state_1 = 1;
                        }
                        else
                        {
                                key_return = key_temp;
                        }
                };break;
                case 1:
                {
                        if(key_temp == D_key)
                        {
                                key_return = S_key;
                                key_state_1 = 0;
                        }
                        else if(++key_time_1 >= 250)
                        {
                                key_return = D_key;
                                key_state_1 = 0;
                        }
                };break;
        }
        return key_return;
}
void key_on(void)
{
        uchar state_1;
        state_1 = key_read();
        if(state_1 == S_key)     //双击
        {
                /*双击按键实现呼吸灯功能*/
                state_1 = 0;
                b_key_led = 1;
                b_key_smg = 0;
                seg = 0x00;
                seg_l = 0x00;
        }
        if(state_1 == D_key)     //单按
        {
                /*单击实现数码管走时*/
                state_1 = 0;
                b_key_smg = 1;
                b_key_led = 0;
                PW1D = 0x0000;
        }
        if(state_1 == L_key)     //长按
        {
                /*长按,实现你要实现的功能*/
        }
}



作者: 渴望壮大    时间: 2017-8-15 10:24
这不是我写的吗?尴尬
作者: whengfu    时间: 2017-8-15 18:58
渴望壮大 发表于 2017-8-15 10:24
这不是我写的吗?尴尬

能加点注释不,大白看不懂程序
作者: zhongyude    时间: 2017-8-16 08:59

能加点注释不,谢谢!
作者: 怪怪爱玩    时间: 2017-8-16 10:58
我也同意加点注释就理能看明白 了




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