找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1756|回复: 6
打印 上一主题 下一主题
收起左侧

这个单片机矩阵键盘程序写的这么简单,有点看不懂

[复制链接]
跳转到指定楼层
楼主
ID:656213 发表于 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;
                }
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:386001 发表于 2021-8-6 15:33 | 只看该作者
GPIO_KEY的高四位与低四位,分别对应行与列,然后通过两次扫描GPIO_KEY,将值存入KeyValue中,最后对KeyValue进行解析,得出对应的行与列的值,即可得到按键的位置了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:887202 发表于 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就是具体哪个按键被按下

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:959221 发表于 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;
                }
        }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:849376 发表于 2021-8-11 13:40 | 只看该作者
也就是行和列的坐标,把16进制的转换成2进制的然后配合你的矩阵原理图看就知道什么原理了
回复

使用道具 举报

6#
ID:656213 发表于 2021-9-15 19:43 | 只看该作者
sadv 发表于 2021-8-6 15:56
写得这么简单还看不懂?这是一个一个四×四的矩阵键盘嘛,矩阵键盘检测按键什么原理自己去查一下理解一下。 ...

弄懂了,谢谢!
回复

使用道具 举报

7#
ID:656213 发表于 2021-9-15 19:44 | 只看该作者
DS12C887 发表于 2021-8-6 16:45
//增加注释
void KeyDown(void)
{

弄懂了,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表