//**********************************************
//********** 鍵程序 *************************
//**********************************************
//判斷鍵是否松開
void keyoff(void)
{
unsigned char temp;
while(1)
{
delayms(200); //延時200ms,以保證按確認鍵,開停鍵松開后才進入程序
temp=PORTD;
//判斷健是否松開,如果松開,則退出循環(huán)
if(temp==keytemp)
{ break;}
}
}
//******************************************
//判斷鍵是否連續(xù)按下
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); //連續(xù)增
}
else if((temp2&0X10)==0)
{
key=3; //減---第4位
keykey(temp2); //連續(xù)減
}
else if((temp2&0X80)==0)
{
key=4; //開/停鍵---第7位
keyoff();
}
}//有鍵按下
else
{ //無鍵按下
key=9;
keynum=0; //恢復keynum為0,取消連續(xù)鍵值
}
return(key); //返回鍵值
}
//鍵程序結(jié)束