求问:基于状态机思想的按键扫描识别?
最近接触到4*4按键
我想用状态机的思想去扫描识别
可是我编的程序在实际电路中好像无法识别出
不知道是程序中那边有问题
所以上来寻求下帮助
程序如下:(只上床按键读取函数)
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
uchar read_key(void)
{
static uchar key_state = 0;
static uchar key_value = 0;
static uchar key_line = 0;
uchar key_return = No_key,i;
KeyPort &= 0x0F;
key_value = KeyPort&Key_mast;
if(key_value!=Key_mast)
{
switch(key_state)
{
case key_state_0:
{
key_line = 0b00010000;
for(i=0;i<4;i++)
{
KeyPort = ~key_line;
KeyPort = ~key_line;
key_value = (Key_mast&KeyPort);
if(key_value==Key_mast)
{
key_line <<= 1;
}
else
{
key_state = key_state_1;
break;
}
}
break;
}
case key_state_1:
{
if(key_value==(KeyPort&Key_mast))
{
switch(key_value|key_line)
{
case 0b00011110:
{
key_return = k1_1;break;
}
case 0b00011101:
{
key_return = k1_2;break;
}
case 0b00011011:
{
key_return = k1_3;break;
}
case 0b00010111:
{
key_return = k1_4;break;
}
case 0b00101110:
{
key_return = k2_1;break;
}
case 0b00101101:
{
key_return = k2_2;break;
}
case 0b00101011:
{
key_return = k2_3;break;
}
case 0b00100111:
{
key_return = k2_4;break;
}
case 0b01001110:
{
key_return = k3_1;break;
}
case 0b01001101:
{
key_return = k3_2;break;
}
case 0b01001011:
{
key_return = k3_3;break;
}
case 0b01000111:
{
key_return = k3_4;break;
}
case 0b10001110:
{
key_return = k4_1;break;
}
case 0b10001101:
{
key_return = k4_2;break;
}
case 0b10001011:
{
key_return = k4_3;break;
}
case 0b10000111:
{
key_return = k4_4;break;
}
default:
{
break;
}
}
key_state = key_state_2;
}
else
{
key_state = key_state_0;
}
break;
}
case key_state_2:
{
KeyPort &= 0b00001111;
KeyPort &= 0b00001111;
if((Key_mast&KeyPort)==Key_mast)
{
key_state = key_state_0;
}
break;
}
default:
{
break;
}
}
}
return key_return;
}
希望有人能帮助下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
经过慢慢摸索调试
程序问题给我解决了
PIC、AVR单片机端口电平的读取还是有区别和一些需要注意的问题
所以资料还是要好好看啊
。。。
挂了吧
一周热门 更多>