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

📄 key.c

📁 按键程序讨论
💻 C
字号:
//
//  名称:
//  编写:niechao
//  日期:2012.08
//  修改:无
//  内容:按键操作程序
#include<reg52.h>
#include"timer0_1ms.h"
#include"led.h"
//按键端口定义
sbit io_set_key = P1^0 ;
sbit io_sht_key = P1^1 ;
sbit io_add_key = P1^2 ;
sbit io_sub_key = P1^3 ;

//按键初始化 主函数调用
void KeyInit(void)
{ 
     io_set_key = 1 ;
     io_sht_key = 1 ;
     io_add_key = 1 ;
     io_sub_key = 1 ; 
}

//按键键码值
#define set_key_value    10         
#define sht_key_value    20          
#define add_key_value    30          
#define sub_key_value    40         
#define     key_null     50             



unsigned char a=0;    //短按状态反馈给led。c
unsigned char *Pflag; //短按状态
unsigned char b=0;    //长按状态反馈给led。c
unsigned char *Lflag; //长按状态




//------------------------------------------------
//         判断哪个按键按的
//------------------------------------------------ 
 unsigned char  KeyScan(void)
{
    if(io_set_key == 0)return set_key_value ;
    if(io_sht_key == 0)return sht_key_value ;
    if(io_add_key == 0)return add_key_value ;
    if(io_sub_key == 0)return sub_key_value ;
    return key_null ;  
}


//------------------------------------------------
//    长按短按键值返回   
//------------------------------------------------ 

static state(unsigned char *PKeyValue,unsigned char *LKeyValue )
           //指向短按                             指向长按
           {  
		     static unsigned char count ;
          
	          if (KeyScan()!=50 )
			    
			     {
                   if (OUT1) 
				  
                      { 
					      
                         OUT1=0;                //系统160MS时标到复位
  					   
					     if (KeyScan()!=50 )     //是否有按键按下 
					   
                            { 
							  

			 				  *PKeyValue = 1 ;    //返回短按
					       							
						   	  count++;  							 						   						
							  
							  led_show();         //短按复位前先显示
							  *PKeyValue = 0 ;
					 	    }
	    
                         if (OUT2 == 1 )            //2S时标到
					   
                            {
					        
						      if (count > 12 )        //2S时标到内大于12次计数为长按 
                                                      //不可能有2S按12次的按神?
                                 {

						           *LKeyValue = 1 ;    //返回长按					      							
							    
						         }	
							  
                             }								
 
	  			       }

                   }                       

			   if ((count >= 0) && (*LKeyValue ==1)  )        //每40ms查询当长按按键按下后释放
					                                                   
						                                            //用于复位短按计数和长按标志
                   {
					        
					   if (KeyScan()==50 )                  //按键是否释放
                                                                    
                             {
                                 count = 0 ;
								   
						         *LKeyValue = 0 ;    					      							
							     
						          OUT2 = 0 ;
                                 }	
                             
                    }


               }

//------------------------------------------------
//       通过指针间接赋值短按状态 长按状态
//------------------------------------------------ 

void getkey(void)

{

    

  Pflag = &a;        //短按状态通过将 短按状态a地址 赋值 给 指针 Pflag
                     //在state(unsigned char *PKeyValue,unsigned char *LKeyValue )函数间接修改短按状态a值
  Lflag = &b;        //长按状态通过将 长按状态a地址 赋值 给 指针 Lflag
                     //在state(unsigned char *PKeyValue,unsigned char *LKeyValue )函数间接修改短按状态b值
  state(Pflag,Lflag); 

 
}












//------------------------------------------------
//         判断哪个按键按下返回对应码值 
//         此程序模版是在第二次调用时
//         无法复位20MS等时间标志位或复位标志位
//         影响使用其他时间标志 后发现可通过多 计时器时间标志求余
//         如想得到10Ms  通过现用20MS ( (20MS计数常量 % 2) >0 )结果为真
//         就是10ms的计数
//------------------------------------------------ 
/*void state(unsigned int *PKeyValue,unsigned int *LKeyValue )
           //指向短按                             指向长按
           {  
		     static  unsigned char count ;
              
              if (KeyScan()!=50 )
			    
			     {
                   if (OUT) 
				  
                      { 
                        StateChange();                             //系统20MS时标到复位
  					   
					   if (KeyScan()!=50 )                         //是否有按键按下 
					   
                          {
					        PKeyValue = KEY_STATE_PRESS ;          //返回短按
					       
						    if (OUT)                               //20ms到了是否还有按键按下
							
							  {
							    if (KeyScan()!=50)                 //是否有按键按下
					            
							     {
							      count++;
								  if (count > 40)                  
								       
								      {
                                        count = 0;

                                       LKeyValue = KEY_STATE_LONG; //返回长按
									   
									  }
								   }  
                                }
						   }

                       }

				   }

              }
			 
*/		 


	   
	   
	   

⌨️ 快捷键说明

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