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

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;
}
希望有人能帮助下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
huanghaiming
1楼-- · 2020-02-09 10:07
 精彩回答 2  元偷偷看……
yklstudent
2楼-- · 2020-02-09 10:12
好了
经过慢慢摸索调试
程序问题给我解决了
PIC、AVR单片机端口电平的读取还是有区别和一些需要注意的问题
所以资料还是要好好看啊
。。。
挂了吧

一周热门 更多>