|
学习了马老师的状态机后自己写的键盘子程序。我觉得用状态机做键盘,最好分开写,一个是键盘检测,别一个是键盘功能。我在学习了马老师的键盘程序后自己写了一个,很好用 。
char key_scan()
{ //键盘子程序
static char key_state=0,key_time,key_old;
char key_data,key_return=0;
P1=P1|0x0f;
key_data=P1&0x0f;
switch(key_state)
{
case 0:
if(key_data!=0x0f)
{ //有键按下
key_state=1;
key_old=key_data;
}
break;
case 1:
if(key_data==key_old)
{ //确认键盘
key_state=2;
key_time=0;
key_return=1;
switch(key_data)
{
case 0x0e:
key_temp=1;// 启动键
break;
case 0x0d:
key_temp=2; //加1键
break;
case 0x0b:
key_temp=3; //减1键
break;
case 0x07:
key_temp=4; //设置键
break;
default:
break;
}
}
else
{
key_state=0;
break;
}
case 2:
//
if(key_data==0x0f)
{ //松开
key_state=0;
key_temp=0;//无键按下??????????????????????????????????
// key_return=1;
}
else if(++key_time >= 50) // 按键时间计数
{
key_state = 3; // 按下时间>1s,状态转换到计时2
key_time = 0; // 清按键计数器
key_return = 2; // 输出"2"
}
break;
case 3:
//
if (key_data==0x0f)
{
key_state =0;
key_temp=0;//无键按下???????????????????????????????????
} //按键已释放,转换到按键初始态
else
{
if (++key_time >= 10) // 按键时间计数
{
key_time = 0; // 按下时间>0.5s,清按键计数器
key_return = 2; // 输出"2"
}
}
break;
}
return(key_return);
}
//键盘处理
void key_down()
{
key_zt=key_scan();//读键盘
switch(key_zt)//根据键状态决定功能
{
case 1:
{ // 单击
switch(key_temp)
{
case 1: //开始
do thing;
break;
case 2: //单加1
ci++;
break;
case 3: //单减1
ci--;
break;
case 4:
do thing;
break;
default :
break;
}
}
break;
case 2:
{ //连击
switch(key_temp)
{
case 2: //连加1
ci++;
break;
case 3: //连减1
ci--;
break;
default :
break;
}
}
break;
default :
break;
}
} |
|