求问:基于状态机思想的按键扫描识别

2020-02-09 09:25发布

求问:基于状态机思想的按键扫描识别?
最近接触到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;
}
希望有人能帮助下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。