技术热线: 4007-888-234

探讨按键处理的C程序

更新时间: 2019-03-23
阅读量:1893

十年专注单片机方案开发的方案公司英锐恩,与您探讨按键处理的C程序。英锐恩现提供服务产品涉及主控芯片:8位单片机、16位单片机、32位单片机及各类运算放大器等。

//**********************************************
//**********   键程序   *************************
//**********************************************

//判断键是否松开
void keyoff(void)
{
unsigned char temp;
while(1)
{
delayms(200); //延时200ms,以保证按确认键,开停键松开后才进入程序
  temp=PORTD;

//判断健是否松开,如果松开,则退出循环
  if(temp==keytemp)
    { break;}
  }  
}

//******************************************
//判断键是否连续按下
void keykey(unsigned char tmp)
{
unsigned char temp;
delayms(5);  //延时5ms
temp=PORTD;   //再读键值  

//如果松开
if(temp!=tmp)
{keynum=0;}

//没松开
else
{
  keynum++;
  if(keynum>=20)
    { keynum=20;}
    if(keynum<=5)
      {delayms(250);delayms(250);delayms(250);}
    else if(keynum<=10)
      {delayms(250);delayms(250);}
    else if(keynum<=15)
      {delayms(50);} 

 else
      {delayms(10);}
 
  }
}

//*********************************************
//键盘键值判断
unsigned char keysub(void)
{   //传回键值
unsigned char temp1,temp2;//存储PORTD值
unsigned char key;         //设定键值 

temp1=PORTD;               //读PORTD口
delayms(10);               //延时10ms,防抖动
temp2=PORTD;
if((temp1==temp2)&&(temp2!=keytemp))
{//有键按下
  if((temp2&0X40)==0)  
   {
     key=1;      //确认键---第6位
     keyoff(); /键松开
   }

  else if((temp2&0X20)==0)
   {
     key=2;      //增---第5位
     keykey(temp2); //连续增 

}

  else if((temp2&0X10)==0)
   {
     key=3;      //减---第4位
     keykey(temp2); //连续减
   }

  else if((temp2&0X80)==0)
   {
     key=4;     //开/停键---第7位
     keyoff();
   }
  }//有键按下

  else   

{ //无键按下
    key=9;    
    keynum=0;   //恢复keynum为0,取消连续键值 
  }

return(key);      //返回键值
}

//键程序结束

(文源网络,侵删)