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

📄 key.c

📁 一款电力行业使用的温湿度控制器源代码 湿度传感器采用HF3223 温度采用DS18B20 单片机采用mega8 编程采用winavr2007
💻 C
字号:
#include "inc/config.h"

#define KEY_C  1


u08 KeyRead(void)   
{
    u08 keyval=0;
 
    if(KEY_ADD==0) 	keyval=2;
    if(KEY_DEC==0) 	keyval=3;
    if(KEY_SET==0) 	keyval=4;//20070715此种算法仅支持单个按键,且set优先
 	return       (  keyval);
}


struct KEY key =
    {
        NOKEY,                                 //无键按下    
        NON,
        YES
    };


void   KeyScan(void)
{
    static uint8  key_val_pre  =0;     //上次扫描键值
    static uint8  key_val_now  =0;     //当前扫描键值 
    static uint16 key_down_cnt =0;     //按键down计数
    static uint8  key_status   =0;     //按键所处状态
	
	if(f_15ms==TRUE)
    {
       f_15ms=false;				   //扫描间隔为15ms
    }
	else
	{
		return;
	}

    key_val_now   =KeyRead();

	 if(key.fkeydone ==NO) return;	  //按键未处理完毕 则不扫描

     if( key_val_now)                //有键按下
    {
         switch (key_status)
	     {
		        case 0:             //first down
                                key_status=key_status + 1;
                                key_val_pre =key_val_now; 
                                break;
                //down filter. make sure that key is down!
                case 1: if(     key_val_now == key_val_pre ) //delay for noise
                        {       
                                key_status  =2;             //trans to state 2,
                                key_val_pre =key_val_now; 
                        }
                        else                                //just the random noise
                        {
                                key_status  =0;             //reset the state record
                        }
                        break;

                //BUTTON was down .Judge it long or short!
		        case 2: if(     key_val_now == key_val_pre ) //delay for noise,judge key really down
                        {
                                key_down_cnt++ ;
                            if( key_down_cnt < KEYLONGTICKS)         //juded as the short push button
                            {
                                key_status  =2;             //keep  state 2, wait for bounce
                                key_val_pre =key_val_now;   //fresh the key value!
                            }
                            else                            // >200, judged as long button
                            {
                                key_down_cnt=0;
                                key.val     =   key_val_pre;//send key val
                                key.type    =   PRESS_LONG_1ST; //key type is long first
                                key.fkeydone=   NO;         //key has not been processed!
                                key_status  =   3 ;           //reset the state counter! 
                             }
                        }
                        else                                //maybe key up,send message to keyprocess
                        {
                                key.val     =   key_val_pre;//send key val
                                key.type    =   PRESS_ONCE; //key type is short
                                key.fkeydone=   NO;         //key has not been processed!
                                key_status  =   0  ;           //reset the state counter!
                                key_val_pre = key_val_now=0;
                        }
                        break;
//------------------------------------------------------------------------------------------------
                //button was long pressed
		        case 3: if(     key_val_now == key_val_pre ) //key still down
                        {
                                key_down_cnt++;
                           if ( key_down_cnt > KEYLONGFREQUENCY)  //controll the long press frequency
                              {
                                key_down_cnt=1;             //reset for new long press loop
                                key.val     =   key_val_pre;//send key val
                                key.type    =   PRESS_LONG; //key type is long
                                key.fkeydone=   NO;         //key has not been processed!
                                key_status  =   3 ;         //keep the state counter!
                              }
                        }
                        else                                //key up and long press end
                        {
                                key_down_cnt=  0;           //reset for new key down
                                key.val     =  0;           //send  NO key
                                key.type    =  NON;         //key type is NON
                                key.fkeydone=  NO;          //key has not been processed!
                                key_status  =   0 ;         //reset the state counter!
                                key_val_pre = key_val_now=0;
                        }	 
                        break;

		        default:break;
	        }
     }    //end if( key_val_now )   有键按下

     else //无任何键按下.或者所有按键已经弹起
     {
            switch (key_status)
            {
                    case 2:     
                            {
                                key.val     =   key_val_pre;//send key val
                                key.type    =   PRESS_ONCE; //key type is short
                                key.fkeydone=   NO;         //key has not been processed!
                                key_status  =   0 ;         //reset the state counter!
                                key_down_cnt=   0;
                            }
                             break;
                    case 3:  {
                                key_down_cnt=   0;          //reset for new key down
                                key.val     =   0;          //send  NO key
                                key.type    =   NON;        //key type is NON
                                key.fkeydone=   NO;         //key has not been processed!
                                key_status  =   0 ;         //reset the state counter!
                              }
                             break;
                    default: break;            
            
            }

     }  
     

}

⌨️ 快捷键说明

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