找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机4*4矩阵键盘的疑问

[复制链接]
跳转到指定楼层
楼主
/********************独立按键程序*****************/
uchar key_can;         //按键值

void key()         //独立按键程序
{
        static uchar key_new = 0;
        key_can = 20;                   //按键值还原
        P3 = 0x0f;
        if((P3 & 0x0f) != 0x0f)                //按键按下
        {
                delay_1ms(1);                     //按键消抖动
                if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
                {                                                //确认是按键按下
                        key_new = 0;
                        P3 = (P3 | 0xf0);   //矩阵键盘扫描
                        switch(P3)
                        {
                                case 0xee:  key_can = 1;  break;  //得到按键值
                                case 0xde:  key_can = 4;  break;   //得到按键值
                                case 0xbe:  key_can = 7;  break;   //得到按键值
                                case 0x7e:  key_can = 10;  break;   //得到按键值
        
                                case 0xed:  key_can = 0;  break;  //得到按键值
                                case 0xdd:  key_can = 8;  break;   //得到按键值
                                case 0xbd:  key_can = 5;  break;   //得到按键值
                                case 0x7d:  key_can = 2;  break;   //得到按键值
        
                                case 0xeb:  key_can = 3;  break;  //得到按键值
                                case 0xdb:  key_can = 6;  break;   //得到按键值
                                case 0xbb:  key_can = 9;  break;   //得到按键值
                                case 0x7b:  key_can = 11;  break;   //得到按键值
        
                                case 0xe7:  key_can = 15;  break;  //得到按键值
                                case 0xd7:  key_can = 14;  break;  //得到按键值
                                case 0xb7:  key_can = 13;  break;   //得到按键值
                                case 0x77:  key_can = 12;  break;  //得到按键值         
                        }        
                        beep = 0;  //蜂鸣器叫一声
                        delay_1ms(100);
                        beep = 1;
                }                        
        }
        else
                key_new = 1;        
}

这是4*4独立按键矩阵键盘的程序,为什么这个按键值是1 4 7 10;0 8 5 2;这样S形获取按键值的而不是1 4 7 10 ;2 5 8 0。按照p1口的高低四位,0按键的两端为p1.7和p1.1     口值也为01111101=0x7d。是程序错了还是我理解有误。刚开始学,有点儿疑惑,

原理.png (86.44 KB, 下载次数: 22)

这是仿真原理图

这是仿真原理图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2022-2-23 12:00 | 只看该作者
通常4*4矩阵键盘有16个状态,具体键值的含义完全由编写者自定义。你完全可以按你希望的数字排列。
回复

使用道具 举报

板凳
ID:973855 发表于 2022-2-23 12:04 | 只看该作者
wulin 发表于 2022-2-23 12:00
通常4*4矩阵键盘有16个状态,具体键值的含义完全由编写者自定义。你完全可以按你希望的数字排列。

那是程序没对是么
回复

使用道具 举报

地板
ID:134430 发表于 2022-2-23 17:17 | 只看该作者
楼上的回答是正解!
oxee,oxde等等是键值,键值是不变的,对应什么键号由自己定。你如果把  “uchar key_can;    //按键值” 的注释改成  uchar key_can;  //按键号   就理解了。
给你一个参考uchar KeyBoard()
{
    uchar K_Num=Null;               //键号
    uchar KeyValue=Null;            //键值
    uchar Tmp1=Null,Tmp2=Null;                //临时存储

   。。。。。。

            switch(KeyValue)        //根据键值确定键号
            {
                case 0xbe:K_Num=0x00; break;                        
                case 0x77:K_Num=0x01; break;
                case 0xb7:K_Num=0x02; break;
                case 0xd7:K_Num=0x03; break;
                case 0x7b:K_Num=0x04; break;
                case 0xbb:K_Num=0x05; break;
                case 0xdb:K_Num=0x06; break;
                case 0x7d:K_Num=0x07; break;
                case 0xbd:K_Num=0x08; break;
                case 0xdd:K_Num=0x09; break;
                case 0xe7:K_Num=0x0a; break;
                case 0xeb:K_Num=0x0b; break;
                case 0xed:K_Num=0x0c; break;
                case 0xee:K_Num=0x0d; break;
                case 0x7e:K_Num=0x0e; break;
                case 0xde:K_Num=0x0f; break;
            }
        }
    }
    return K_Num;       //输出键号   
}


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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