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

📄 _keyboard.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/****************************************************************
**                                                              *
**  FILE         : _KeyBoard.C                                   *
**                                                              *
**  By : Cyb 2007.01.10                                         *
****************************************************************/


#include "includes.h"
#include "bsp.h"
#include "timetask.h"
#include "systask.h"
#include "message.h"
#include "errcode.h"
#include "errtask.h"
#include "uart_drv.h"
#include "hardware.h"
#include "DisplayTask.h"
#include "_KeyBoard.h" 
#include "ScanKeyBoard.h"

#define  LONGKEY    1

/*
*******************************************************************************
* define config parameters
*******************************************************************************
*/
#define  PERIOD_KBSCAN    MILTICK,       1
/*
*******************************************************************************
* define module variants
*******************************************************************************
*/            

static TMR_TSK   *KBScanTmr;
static INT8U     Step;
static INT32U    Value;
static INT32U    StorKey;
static INT8U     KeepTimes;
static INT8U     Key;
static INT8U     KeyTable[]={
                              0x01,	        //数字键"1"(礼貌用语1)    
					    	  0x02,	        //数字键"5"(增大音量)          
					          0x03,	        //数字键"9"(下行)        
					          0x04,	        //进站
					          0x05,	        //数字键"2"(礼貌用语2)
					          0x06,		    //数字键"6"(减小音量)
					          0x07,	        //数字键"0"(快退)
					          0x08,	        //出站
					          0x09,         //数字键"3"(礼貌用语3)
					          0x0a,         //数字键"7"(按键音启闭)
					          0x0b,         //确认键(快进)
					          0x0c,         //重拨键
					          0x0d,         //数字键"4"(礼貌用语4)
					          0x0e,         //数字键"8"(上行)
					          0x0f,         //取消键
					          0x10          //功能切换键
                            };
                           

/*
*******************************************************************************
* Procure of pushing key
*******************************************************************************
*/
static void PushKeyProc(void)
{
      StartTmr(KBScanTmr,PERIOD_KBSCAN);
      
      if(Step > 5) 
      {
           Step = 0;
      }
    
      if(Step==0)                                              // 步骤0
      {                            
          Pulldown_AllX();
                
          Value = ReadPort_AllY();                             // 读Y口的值
                                       
          Value |= ~(PORT_Y0 | PORT_Y1 | PORT_Y2|PORT_Y3 );           //看Y0~3有没有0
          KeepTimes = 0;                                       //初始化击键次数
        
          if(Value == 0xffffffff)
          { 
              return;                                          //表示没有按键
		  }
		  else
		  { 
		      Step = 1;
		      return;	
		  }
	  }
 
	  if(Step==1)                                             //步骤1
	  {                    
	      Pulldown_AllX();
	      
          Value = ReadPort_AllY();                            //再次读Y口
          
          Value |= ~(PORT_Y0 | PORT_Y1 | PORT_Y2|PORT_Y3);
                       
          if(Value == 0xffffffff)                             //如果还是FFFFFFFF,则返回步骤0
          {                          
		        Step=0;			 
		  }	
		  else
		  {                                                   //否则扫描键盘
		        Value = ScanKeyBoard();
		       
		        StorKey = Value;
		        
		        if(Value==0xEE)                               //如果得到的是EE,返回步骤0
		        {         
		            Step=0;			   
		        }	
                else                                          //否则,确定有按键
                {		            
                                       
			        Step=2;
                    Key = KeyTable[Value];
#if DEBUG_UARTNo_KEYBOARD <= 1
                    OSQPost(SysTaskMsgQue,MSG_DEBUG_KEYBOARD,Key,0);
#endif                    
                   OSQPost(DisplayTaskQ,MSG_DISPLAYTASK_KEY,Key,0);

                } 
		  }
      
		  return;
	  }

	  if(Step == 2)                                         //步骤2
	  {                       
	       Value = ScanKeyBoard();                          //扫描键盘
		   
		   if(Value==0xff)                                  //如果是FF
		   {                
		        Step=4;	                                    //进入步骤4
			
		   }
		   else if(Value==StorKey)                          //如果跟原来的一样
		   {      
		      if(++KeepTimes>25)                            //如果超过25次一样 ,认为是长键 
		      {                               
               
                  Key = KeyTable[Value]|0x80;               //或上80表示长按键
#if DEBUG_UARTNo_KEYBOARD <= 1
                  OSQPost(SysTaskMsgQue,MSG_DEBUG_KEYBOARD,Key,0);
#endif                  
                  OSQPost(DisplayTaskQ,MSG_DISPLAYTASK_KEY,Key,0);

#if LONGKEY          
                  Step=3;                                   //进入步骤3
#else
                  Step=5;         
#endif
			  }           
		   }
		   else if(Value!=StorKey)
		   {
		          Step=4;                                   //进入步骤4   
		   }
		   return;
	}
   
    if(Step==3)                                             //步骤3
    {                        
	      Value = ScanKeyBoard();                           //扫描键盘
		  
		  if(Value==0xff)                                   //如果是FF                                
		  {               
		          Step=4;	                                //进入步骤4
			
		  }
		  else if(Value==StorKey)                           //如果跟原来的一样
		  {      
		        if(++KeepTimes>150)                         //如果超过150次一样 ,认为是更长键
		        {                                
                
                  KeepTimes = 0;
			      Key = KeyTable[Value]|0x80;               //或上80表示长按键
#if DEBUG_UARTNo_KEYBOARD <= 1
                  OSQPost(SysTaskMsgQue,MSG_DEBUG_KEYBOARD,Key,0);
#endif			      
                  OSQPost(DisplayTaskQ,MSG_DISPLAYTASK_KEY,Key,0); 

                  Step=3;                                   //进入步骤5
			    }           
		  }
		  else if(Value!=StorKey)
		  {
		        Step=4;                                     //进入步骤4   
		  }
		  return;
	}

    if(Step==4)
    {
	     Value = ScanKeyBoard();                             //扫描键盘
       
         if(Value ==0xff)
         {                                                   //如果是FF,返回步骤 0
		     Step=0;	
		 }
		 else if(Value ==StorKey)                            //如果跟原来一样,返回步骤2
		 {                          
		     Step=2;
		 }
		 else if(Value!=StorKey)                            //如果不一样,返回步骤0
		 {                          
		     Step=0;
		 }
		 return;
    }
	 
    if(Step==5)                                             //步骤5 
    {                         
	    Value = ScanKeyBoard();
        if(Value==0xff){                                    //如果是FF。返回步骤0
		    Step=0;
		}else return;                                        //一直返回
    }  
}
/*
*******************************************************************************
* initialization of keyboard module
*******************************************************************************
*/
void InitKeyBoard(void)
{
      Step  = 0;
            
      InitPort_AllY();
     
      KBScanTmr =  CreateTimer(PushKeyProc,0);
      StartTmr(KBScanTmr,PERIOD_KBSCAN);
}

⌨️ 快捷键说明

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