⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.c

📁 按键状态机
💻 C
字号:

#include"key.h"

unsigned char ReadKey(void)
{
 unsigned char keyPadBuf[2];

 /*keyPad detect*/
    static unsigned char keyState = 0, keyValue, keyLine,keyTime=0; 
    unsigned char keyReturn = NOKEY,keyTemp,i; 
    
    switch (keyState) 
    {
        case 0:                         //if any key discovered,switch to keyState 1 
            keyHit = 0;
            P7 = 0x00;
            PM7 = 0x00;                 //output
            PM2 = PM2 | 0x07;           //input
            //dlyN100us(7);
            keyValue = P2&KEYMASK;
            if(keyValue != KEYMASK)
            {
                keyState++;
                keyHit = 1;
            }
            break;
        case 1:                        // just delay 600us for least; not a KEYSTATE
              P7 = 0x00;
              PM7 = 0x00;                 //output
              PM2 = PM2 | 0x07;           //input        
              //dlyN100us(7);
              if(keyValue==P2&KEYMASK)
              {
                  
                  P2 = P2&0xf8;
                  PM2 = PM2&0xf8;         //output
                  PM7 = 0xff;             //input
                  keyState++;
                  keyValue<<=4;
              }
              else
              {
                  keyState--;
              }
              break;
        case 2:                         //confirm keyhit and keep the key value
                  
                  
                  P2 = P2&0xf8;
                  PM2 = PM2&0xf8;         //output
                  PM7 = 0xff;             //input
                  //dlyN100us(7);
                  NOP();
                  keyValue = keyValue+P7;
             keyState++;     
             break;
        case 3:                       //release or start longkey timer
            P7 = 0x00;
            PM7 = 0x00;               //output
            PM2=PM2 | 0x07;           //input
            //dlyN100us(7);
            keyTemp=P2&KEYMASK;
            if( keyTemp == KEYMASK )  //key has been up
            {
                keyState=0;
                switch( keyValue )
                  {
                      case 0b01101110:
                           keyReturn = KEY1_1;
                           break;
                      case 0b01101101:
                           keyReturn = KEY1_2;
                           break;
                      case 0b01101011:
                           keyReturn = KEY1_3;
                           break;
                      case 0b01100111:
                           keyReturn = KEY1_4;
                           break;
                      case 0b01011110:
                           keyReturn = KEY2_1;
                           break;
                      case 0b01011101:
                           keyReturn = KEY2_2;
                           break;
                      case 0b01011011:
                           keyReturn = KEY2_3;
                           break;
                      case 0b01010111:
                           keyReturn = KEY2_4;
                           break;
                      case 0b00111110:
                           keyReturn = KEY3_1;
                           break;
                      case 0b00111101:
                           keyReturn = KEY3_2;
                           break;
                      case 0b00111011:
                           keyReturn = KEY3_3;
                           break;
                      case 0b00110111:
                           keyReturn = KEY3_4;
                           break;
                      default:
                           keyReturn = NOKEY;
                  }
            }
            else if(++keyTime>=80)  // queue inputing the same number
            {
                //keyValue<<=4;
                keyTime=0;
                //keyState=0;         //repeat long key
                //keyState++;         //just for first time of long key
//                P2 = P2&0xf8;
//                PM2 = PM2&0xf8;         //output
//                PM7 = 0xff;             //input
//                dlyN100us(7);           //delay for key
//                keyValue = keyValue+P7;// read P7
                switch(keyValue)
                {
                    case 0b00111110:
                        keyReturn=KEY3_1LONG;
                        break;
                    case 0b00110111:
                        keyReturn=KEY3_4LONG;
                        break;
                    default:
                        keyState=0;       //so repeat of 0~9
                }
            }
            break;
        
        case 4:                       //longkey step 2 and release longkey
            keyLine=0b11110000;
            P7 = keyLine;
            PM7 = 0x00;               //output
            PM2=PM2 | 0x07;           //input          
            //dlyN100us(7);  
            keyValue=P2&KEYMASK;
            if( keyValue == KEYMASK )
            {
                keyState=0;
            }
//            else if(++keyTime>=30)    //longkey step 2
//            {
//             keyReturn=KEY3_1LONG;
//             keyTime=0;
//            }
            break;
        default:
            keyState = 0;
     }
return keyReturn;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -