keyscan.c

来自「cs5460a做功率表用 cs5460a做功率表用 cs5460a做功率表」· C语言 代码 · 共 124 行

C
124
字号
/********************************************
公司名称:
文 件 名:
版 本 号:
程序设计:
说    明:
完成日期:
修改日期:
功能摘要:
**********************************************/
#define  _KeyScanV20
#include  "includes.h"
//---------------------------------------------
uint8   KeyVal;
WAIT_TIME_STRUCT  KeyScan = {0,_10MS};
WAIT_TIME_STRUCT  WatchKeyTime = {0,0};

void   	WatchKey(void);	  
void    ScanKey_MainLoop(void)
{
  static  uint8 KeyState = 0;              //按键状态
  static  uint8 OldKeyCode = 0;            //老键值缓存 
  static  uint8 KeyCount = 0;              //按键按下的时间,用于连击处理
  uint8   GETKEY = 0;   
        
  if (!KeyScan.fGetTime)
     { KeyVal = 0;    }
  else
     {               //系统时间到进行按键扫描 
       KeyScan.fGetTime = 0;
       KeyScan.WaitTime = _10MS;
	         
	  if (!SET_KEY) GETKEY |= 0x04;     
	  if (!UP_KEY)  GETKEY |= 0x02;     
	  if (!DN_KEY)  GETKEY |= 0x01;	

       switch (KeyState)             //根据按键不同的状态进行处理
       {
        case 0:
         if (GETKEY)
           {
             OldKeyCode = GETKEY;
             KeyState = 1;            
            }
         KeyVal = 0;
         break;
                    
         case 1:
         KeyState = 2;           //按键消抖20ms         
         break;
              
         case 2:
         if (OldKeyCode == GETKEY)
           {
             KeyState = 3;          //按键按下
             KeyVal = OldKeyCode;    //传递键值
             WatchKeyTime.WaitTime = _60S;                  
           }
         else
           {  KeyState = 0; }       //抖动                
         break;
              
         case 3:
         if (OldKeyCode == GETKEY)
         {
            KeyCount++;            
            if (KeyCount >= 250)     //按键时间大于250MS吗?
              {
                 if (TaskID)
                   {
                     SaveFunData();     //常按保存数据
                     while(1);
                   }
                 else
                   {
                     KeyVal = 6;
                     KeyCount = 0;        //常按进入功能参数设定
                     IO_HighAlarm = ON;
					 fH_Alarm = OFF;  //关闭报警		
					 L_Alarm  = ON;
					 fL_Alarm  = OFF;                  
                     break;                                 
                   }
               }
         
            else if ((KeyCount >= 15) && (OldKeyCode != 0x04))
              {
                 WatchKeyTime.WaitTime = _60S; 
                 if (fDOKEY) 
				    {
                       KeyCount = 0;
                       KeyVal = 0;
                    } 
			     else 
				    {
                       KeyCount -= 15;
                       KeyVal = OldKeyCode;
                     }                
               }         
            else 
		      { KeyVal = 0; }
          }
        else 
		  {
            KeyState = 0;    //按键松开
            KeyCount = 0;
            fDOKEY = 0;            
            KeyVal = 0;
           }         
        break; 
        
        default:
        break; 
      }
    }
 }
//--------------------------------------------------
void   WatchKey(void)
{
		if ((TaskID) && (WatchKeyTime.fGetTime))
		while (1);
}
//--------------------------------------------------

⌨️ 快捷键说明

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