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

📄 key3a.c

📁 这是一个PIC单片机的实时操作系统
💻 C
字号:
#ifndef _key_c
#define  _key_c

//************************************************************************************
//
//#include <pic.h>
//#include <pic1687x.h>
#include"config.h"
//------------------------------------------------file "key.c"-----------------------------------------------

//#include "KEY.h"


unsigned char is_repeat_key(unsigned char);
void scan_key();
void process_panel_key();
void tmint(void); //
void interrupt clkint(void);   //定时器中断函数
void  KEYINT(void) ;//按键初始化
  


//*************************************************



/*====================================================================================================
                                    扫描面板按键程序
====================================================================================================*/
void scan_key()
{ 
	 KEYPORT=0xFF;
   col1=1;
   col2=1;
   col3=1;
   key = NO_KEY;

    col1=0;
    col2=1;
    col3=1;
   if (row1==low)     key = KEY1;    
   if (row2==low)     key = KEY4;
   if (row3==low)     key = KEY7;  
 //  if (row4==low)     key = KEYCLEAR; 
	
		col1=1;
		col2=0;
		col3=1;
   if (row1==low)     key = KEY2; 
   if (row2==low)     key = KEY5;
   if (row3==low)     key = KEY8;
  // if (row4==low)     key = KEY0;

    col1=1;
    col2=1;
    col3=0;
   if ( row1==low)     key = KEY3;    
   if ( row2==low)     key = KEY6;  
   if ( row3==low)     key = KEY9;   
  // if ( row4==low)     key = KEYOK;         

}

/*====================================================================================
                                   处理面板按键程序
=====================================================================================*/

void process_panel_key()
{
  scan_key();
  switch (scan_key_state)
  {
     case KEY_IDLE_STATE:   //按键空闲状态
   //    case KEY_SHAKE_STATE:  
 //    current_key = AUTO_SEARCH_UP_KEY;
      //     if (!shake_cancel_timer) 
      //         ; 
      //      {
       if (key!=NO_KEY)  //如果有按键按下,则进入按键消抖状态。
	//  	 ;
	       {
	          key_bak = key;           
	          shake_cancel_timer = 1;  //消抖时间设定为20ms
	          scan_key_state = KEY_SHAKE_STATE;
	        }   
       else            //如果没有按键按下,继续为空闲检测状态。
        {
         scan_key_state = KEY_IDLE_STATE;
         
         }
  //   break;
    case KEY_SHAKE_STATE: //按键去抖状态
      if (!shake_cancel_timer)
      {
         if (key == key_bak)     //消抖后,如果按键未变,进入复合检测状态。
		         {
		            scan_key_state = KEY_COMPLEX_STATE;		            complex_key_timer = 100;  //复合判断时间为200ms 小于200ms为原功能,大于200ms为复合功能。
		         }
          else                  //确认为按键抖动。
	         {
	            scan_key_state = KEY_IDLE_STATE;
	         }
      }
     break;
   case KEY_COMPLEX_STATE: //按键复合处理状态
      if (!complex_key_timer)
      {
        if (key == key_bak)  //复合检测时间到,按键仍按下。
        {
            if (key == SEARCH_UP_KEY)       //执行next的复合功能。
            {
              current_key = AUTO_SEARCH_UP_KEY;
            }else if (key == SEARCH_DOWN_KEY) //执行prev的复合功能。
            {
              current_key = AUTO_SEARCH_DOWN_KEY;
            }else                     //执行没有复合功能的按键。
            {
              current_key = key;
            }

            if (is_repeat_key(key))   //检测为可重复按键时,进入重复状态。
           {
             repeat_key = current_key;
             scan_key_state = KEY_REPEAT_STATE;
             repeat_key_timer = 20; // 按键重复时间为200ms,如果连续按键,每200ms执行重复按键操作。
            }else                    //检测为不可重复按键时,进入按键抬起等待状态。
            {
             scan_key_state = KEY_WAIT_UP;
            }
         }else       //按键已经抬起,执行未复合功能。
         {
           current_key = key_bak;
           scan_key_state = KEY_IDLE_STATE;
         }
       }else          
       {
          if (key != key_bak)          //按键抬起,执行未复合功能。
          {
             current_key = key_bak;
             scan_key_state = KEY_IDLE_STATE;
           }
       }
      break;
    case KEY_REPEAT_STATE:    //按键重复处理状态
      if (key == key_bak)
      {
        if (!repeat_key_timer)    //按键重复时间到,再次执行按键功能。
        {
           repeat_key_timer = 20; // 按键重复时间为200ms,如果连续按键,每200ms执行重复按键操作。
           current_key = repeat_key;
        }
      }else                     //按键抬起,回到按键空闲检测状态。
      {
           scan_key_state = KEY_IDLE_STATE;
      }
     break;
   case KEY_WAIT_UP:             //按键等待抬起状态
     if (key!= key_bak)
     {
        scan_key_state = KEY_IDLE_STATE;   //按键抬起,返回按键空闲检测状态。 
     }
    break;
  }

}
/*------------------------------------------------------------------------------------------------*/
unsigned char is_repeat_key(unsigned char r_key)    //重复按键检测通行函数。
{
   if ((r_key == VOLUME_UP_KEY)||(r_key == VOLUME_DOWN_KEY)||(r_key == SEARCH_UP_KEY)||(r_key == SEARCH_DOWN_KEY))
   {
       return 1;
   }else
   {
       return 0;
   }
}
/*-----------------------------------------------------------------------------------------------*/


 
 
void KEYINT(void)//按键初始化
{
  T0CS=0; 
	ledadr=0;
	tmint();              //调用定时器初始化程序    
	GIE=1;	

	
	} 
	//把按键输入的8位数据处理成三个门禁的字节
void Key( ) //按键值处理
 {
 	uint32 Buf;//键值处理缓存
  BJCardBuf[0]=KeyBuf[0]*100+KeyBuf[1]*10+KeyBuf[2];
   nop;
  Buf=(KeyBuf[3]*10000+KeyBuf[4]*1000+KeyBuf[5]*100)+KeyBuf[6]*10+KeyBuf[7];
   nop;
  BJCardBuf[2]=Buf%256;
  BJCardBuf[1]=Buf>>8; 
  
  nop;
 	}	
 	







 
/* 
main(void)
{
		TRISB=0xF8;//低四位是输入,高四位为输出
	//	TRISC=0;
	//	TRISB=0x00;
	//	TRISC=0x00;
		PORTB=0XFF;
	//	PORTC=0x00;
	//	RB0=1;RB2=0;//接两个LED,开始为全灭
		PCFG3=0;
		PCFG2=1;
		PCFG1=1;
		PCFG0=1;
		TRISA=0;
		PORTA=0;
		T0CS=0;
		RA4=0;
		ledadr=0;
		tmint();              //调用定时器初始化程序    
		GIE=1;
   //    scan_key();
        nop;
    while(1)
     {
       nop;
	  process_panel_key();
        nop;
	  if(current_key!=NO_KEY)
	  	{
	  		nop;
	  		nop;
	  		current_key=NO_KEY;
	  		scan_key_state = KEY_IDLE_STATE;
	  		}
	   nop;
         nop;
	   }//end while
	
	}
*/
#endif

⌨️ 快捷键说明

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