找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5656|回复: 4
收起左侧

单片机按键程序单击双击长按有不同功能(c语言源程序)

[复制链接]
ID:223191 发表于 2017-8-14 14:34 | 显示全部楼层 |阅读模式
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)     //长按
        {
                /*长按,实现你要实现的功能*/
        }
}


回复

使用道具 举报

ID:188935 发表于 2017-8-15 10:24 | 显示全部楼层
这不是我写的吗?尴尬
回复

使用道具 举报

ID:92231 发表于 2017-8-15 18:58 来自手机 | 显示全部楼层
渴望壮大 发表于 2017-8-15 10:24
这不是我写的吗?尴尬

能加点注释不,大白看不懂程序
回复

使用道具 举报

ID:222635 发表于 2017-8-16 08:59 | 显示全部楼层

能加点注释不,谢谢!
回复

使用道具 举报

ID:227864 发表于 2017-8-16 10:58 | 显示全部楼层
我也同意加点注释就理能看明白 了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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