标题: 这个单片机矩阵键盘程序写的这么简单,有点看不懂 [打印本页]

作者: jiahz2019    时间: 2021-8-6 09:30
标题: 这个单片机矩阵键盘程序写的这么简单,有点看不懂
为什么这个矩阵键盘程序写的这么简单,有点看不懂,(16个按键,对应在数码管上显示1,2,3.....F)有没有老师指点一下?

void KeyDown(void)
{
        char a;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)
        {
                Delay10ms();
                if(GPIO_KEY!=0x0f)
                {
                        KeyState=1;
                        //2aêÔáD
                        GPIO_KEY=0X0F;
//                         Delay10ms();
                        switch(GPIO_KEY)
                        {
                                case(0X07):        KeyValue=0;break;
                                case(0X0b):        KeyValue=1;break;
                                case(0X0d): KeyValue=2;break;
                                case(0X0e):        KeyValue=3;break;                        }
                        //2aêÔDD
                        GPIO_KEY=0XF0;
                        Delay10ms();
                        switch(GPIO_KEY)
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;                        }
                        while((a<50)&&(GPIO_KEY!=0xf0))         //¼ì2a°′¼üËéêÖ¼ì2a
                        {
                                Delay10ms();
                                a++;
                        }
                        a=0;
                }
        }
}



作者: sustlixin    时间: 2021-8-6 15:33
GPIO_KEY的高四位与低四位,分别对应行与列,然后通过两次扫描GPIO_KEY,将值存入KeyValue中,最后对KeyValue进行解析,得出对应的行与列的值,即可得到按键的位置了
作者: sadv    时间: 2021-8-6 15:56
写得这么简单还看不懂?这是一个一个四×四的矩阵键盘嘛,矩阵键盘检测按键什么原理自己去查一下理解一下。代码一句一句来看嘛
void KeyDown(void)
{
        char a;        //就是一个临时变量不解释
        GPIO_KEY=0x0f;       //将前四个IO口拉低,后四个拉高
        if(GPIO_KEY!=0x0f)   //判断有没有按键按下,有按键按下的话GPIO_KEY就不会等于0x0f
        {
                Delay10ms();   //这个延时相当于一个消抖的作用
                if(GPIO_KEY!=0x0f)    //再次判断
                {
                        KeyState=1;    //此时确认有按键按下,状态标志符置1
                        //2aêÔáD
                        GPIO_KEY=0X0F;   //感觉这句有点多余,可有可无的样子
//                         Delay10ms();
                        switch(GPIO_KEY)    //这个switch就是看哪一行有按键按下
                        {
                                case(0X07):        KeyValue=0;break;
                                case(0X0b):        KeyValue=1;break;
                                case(0X0d): KeyValue=2;break;
                                case(0X0e):        KeyValue=3;break;                        }
                        //2aêÔDD
                        GPIO_KEY=0XF0;
                        Delay10ms();
                        switch(GPIO_KEY)   //这个switch就是看哪一列有按键按下
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;                        }
                        while((a<50)&&(GPIO_KEY!=0xf0))         //¼ì2a°′¼üËéêÖ¼ì2a
                        {
                                Delay10ms();
                                a++;
                        }
                        a=0;
                }
        }
}
最后的KeyValue就是具体哪个按键被按下
作者: DS12C887    时间: 2021-8-6 16:45
//增加注释
void KeyDown(void)
{
        char a;
        GPIO_KEY=0x0f;              //按键口置高
        if(GPIO_KEY!=0x0f)          //如果按键有按下
        {
                Delay10ms();            //延时去抖
                if(GPIO_KEY!=0x0f)      //还是按下
                {
                        KeyState=1;     //记录按下状态
                        //2aêÔáD
                        GPIO_KEY=0X0F;
//                         Delay10ms();
                        switch(GPIO_KEY)    //判断哪行按下,并记录键值
                        {
                                case(0X07):        KeyValue=0;break;
                                case(0X0b):        KeyValue=1;break;
                                case(0X0d): KeyValue=2;break;
                                case(0X0e):        KeyValue=3;break;                        }
                        //2aêÔDD
                        GPIO_KEY=0XF0;
                        Delay10ms();
                        switch(GPIO_KEY)    //判断哪列按下,并记录键值
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;                        }
                       //等待松开或超时
                        while((a<50)&&(GPIO_KEY!=0xf0))   
                        {
                                Delay10ms();
                                a++;
                        }
                        a=0;
                }
        }
}
作者: Letitia    时间: 2021-8-11 13:40
也就是行和列的坐标,把16进制的转换成2进制的然后配合你的矩阵原理图看就知道什么原理了
作者: jiahz2019    时间: 2021-9-15 19:43
sadv 发表于 2021-8-6 15:56
写得这么简单还看不懂?这是一个一个四×四的矩阵键盘嘛,矩阵键盘检测按键什么原理自己去查一下理解一下。 ...

弄懂了,谢谢!
作者: jiahz2019    时间: 2021-9-15 19:44
DS12C887 发表于 2021-8-6 16:45
//增加注释
void KeyDown(void)
{

弄懂了,谢谢!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1