按键检测

1
按键检测有以下几个步骤
1、检测有无按键按下
2、逐行扫描(逐行扫描功耗比较小,也可以采用行列反转的方式,
但是功耗比较大,多用于交流电中)

这里写图片描述

这里是四行三列的按键。

U8 Keypad_scan(void)
{
    static unsigned char result = 0;
    switch (Keypad_ScanPara.step)
    {
    case 0://确认
        keypad_init();
        if(SSW4_PV == E_KEY_ST_PUSH)//检测第一列
        {
            Keypad_ScanPara.row =1;
            Keypad_ScanPara.KeypadFLAG =1;
            Keypad_ScanPara.KeypadTime++;/*用delay()计时会导致
            KeypadTime的值得方式,来实现delay(),来实现软件滤波。*/
        }
        else if(SSW5_PV == E_KEY_ST_PUSH)
        {
            Keypad_ScanPara.row =2; 
            Keypad_ScanPara.KeypadFLAG =1 ;
            Keypad_ScanPara.KeypadTime++;
        }
        else if(SSW6_PV == E_KEY_ST_PUSH)
        {
            Keypad_ScanPara.row =3;
            Keypad_ScanPara.KeypadFLAG =1;
            Keypad_ScanPara.KeypadTime++;
        }
        else//未扫描到按键
        {
            Keypad_ScanPara.KeypadFLAG = 0;
            Keypad_ScanPara.KeypadTime = 0;
        }
        if(Keypad_ScanPara.KeypadTime >  KEY_SHORTCNT)//按键时间大于防抖时间
        {
            Keypad_ScanPara.step = 1; //确立按键按下
            Keypad_ScanPara.line = 0;
        }
        break;  
    case 1://扫描
        SSW0_OUTPUT;    SSW0_L;
        SSW1_OUTPUT;    SSW1_H;
        SSW2_OUTPUT;    SSW2_H;
        SSW3_OUTPUT;    SSW3_H;
        __NOP();        __NOP(); 
        if((SSW4_PV == E_KEY_ST_PUSH) || (SSW5_PV == E_KEY_ST_PUSH) || (SSW6_PV == E_KEY_ST_PUSH))
        {
           Keypad_ScanPara.line = 1;
        }
        else
        {
            SSW0_OUTPUT;    SSW0_H;
            SSW1_OUTPUT;    SSW1_L;
            SSW2_OUTPUT;    SSW2_H;
            SSW3_OUTPUT;    SSW3_H;
            __NOP();        __NOP();  
           if((SSW4_PV == E_KEY_ST_PUSH) || (SSW5_PV == E_KEY_ST_PUSH) || (SSW6_PV == E_KEY_ST_PUSH))
           {
              Keypad_ScanPara.line = 2;
           }
           else
           {
                SSW0_OUTPUT;    SSW0_H;
                SSW1_OUTPUT;    SSW1_H;
                SSW2_OUTPUT;    SSW2_L;
                SSW3_OUTPUT;    SSW3_H;
                __NOP();    __NOP(); 
                if((SSW4_PV == E_KEY_ST_PUSH) || (SSW5_PV == E_KEY_ST_PUSH) || (SSW6_PV == E_KEY_ST_PUSH))
                {
                    Keypad_ScanPara.line = 3;
                }
                else
                {
                    SSW0_OUTPUT;    SSW0_H;
                    SSW1_OUTPUT;    SSW1_H;
                    SSW2_OUTPUT;    SSW2_H;
                    SSW3_OUTPUT;    SSW3_L;
                    __NOP();        __NOP(); 
                    __NOP();        __NOP();
                    __NOP();        __NOP(); 
                    __NOP();        __NOP();
                    if((SSW4_PV == E_KEY_ST_PUSH) || (SSW5_PV == E_KEY_ST_PUSH) || (SSW6_PV == E_KEY_ST_PUSH))
                    {
                        Keypad_ScanPara.line = 4;
                    }
                    else
                    {
                        Keypad_ScanPara.row = 0;
                        Keypad_ScanPara.line = 0;
                        Keypad_ScanPara.KeypadFLAG = 0;
                        Keypad_ScanPara.KeypadTime = 0;
                    }
                }
            }
        }
        if(Keypad_ScanPara.line>0 && Keypad_ScanPara.line <5)
        {
           result = 1;
        }
        else
        {
           Keypad_ScanPara.step = 0 ;
        }
        break;
    case 2://弹起   
        keypad_init();
        if((SSW4_PV == E_KEY_ST_RELEASE) &&(SSW5_PV == E_KEY_ST_RELEASE) && (SSW6_PV == E_KEY_ST_RELEASE))
        {
         Keypad_ScanPara.step = 0 ;
        }
         result = 0;
        break;
    }
    return result;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值