十年专注单片机方案开发的方案公司英锐恩,与您探讨按键处理的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); //返回键值
}
//键程序结束
(文源网络,侵删)