找回密码
 立即注册

QQ登录

只需一步,快速开始

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

有没有好一点的矩阵键盘识别方法?

[复制链接]
跳转到指定楼层
楼主
ID:462718 发表于 2019-3-16 21:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有没有好一点的矩阵键盘识别方法
编码在60行以内的(要用数码管来显示识别)
回答的电子烧友,小弟感激不尽
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:310519 发表于 2019-3-16 23:08 | 只看该作者
先扫描行,保存扫描结果;

再扫描列,结果与保存的行数据合并。
回复

使用道具 举报

板凳
ID:491577 发表于 2019-3-17 00:40 | 只看该作者
假设4x4矩阵按键,行为h1,h2,h3,h4;列为L1,L2,L3,L4;按键值=a;
代码:
viod anjian()   //按键子函数,每次只能按下1个按键。将这个函数放到10毫秒中断中执行。
{
n=0;//按键初值,0为没有按键按下
//扫描第一行
h1=1;h2=0;h3=0;h4=0;
L1=1;L2=1;L3=1;L4=1;
if(L1==0) a=11;//按键值=11是指第1行第1列
if(L2==0) a=12;//按键值=12是指第1行第2列
if(L3==0) a=13;//按键值=13是指第1行第3列
if(L4==0) a=14;//按键值=14是指第1行第4列
//扫描第2行
h1=0;h2=1;
if(L1==0) a=21;//按键值=21是指第2行第1列
if(L2==0) a=22;//按键值=22是指第2行第2列
if(L3==0) a=23;//按键值=23是指第2行第3列
if(L4==0) a=14;//按键值=24是指第2行第4列
//扫描第3行
h2=0;h3=1;
if(L1==0) a=31;
if(L2==0) a=32;
if(L3==0) a=33;
if(L4==0) a=34;
//扫描第4行
h3=0;h4=1;
if(L1==0) a=41;
if(L2==0) a=42;
if(L3==0) a=43;
if(L4==0) a=44;
}
回复

使用道具 举报

地板
ID:213173 发表于 2019-3-17 06:55 | 只看该作者
这是最简练的4*4矩阵键盘+两位数码管显示程序+仿真
最简矩阵键盘+仿真.zip (108.91 KB, 下载次数: 53)

评分

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

查看全部评分

回复

使用道具 举报

5#
ID:477932 发表于 2019-3-17 08:02 | 只看该作者
用数组与结构体合作可以完成这个事

评分

参与人数 2黑币 +18 收起 理由
zhengchong60 + 8
嘉立创AAA + 10

查看全部评分

回复

使用道具 举报

6#
ID:164602 发表于 2019-3-17 09:40 | 只看该作者
这个不错:
void KeyDown(void)
{
        char a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)//读取按键是否按下
        {
                Delay10ms();//延时10ms进行消抖
                if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
                {
                       
                        //测试列
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)
                        {
                                case(0X07):        KeyValue=0;break;
                                case(0X0b):        KeyValue=1;break;
                                case(0X0d): KeyValue=2;break;
                                case(0X0e):        KeyValue=3;break;
                        }
                        //测试行
                        GPIO_KEY=0XF0;
                        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++;
                        }
                }
        }
}
回复

使用道具 举报

7#
ID:472242 发表于 2019-3-17 10:18 | 只看该作者
wulin 发表于 2019-3-17 06:55
这是最简练的4*4矩阵键盘+两位数码管显示程序+仿真

很好!这个很不错!谢谢分享!
回复

使用道具 举报

8#
ID:491577 发表于 2019-3-17 10:38 | 只看该作者
6#的程序是可以实现的,都是实际应用中是不可以这样做的,单片机程序一定要学会使用分时执行,中断执行,单片机留给按键扫描、数码管显示的时间是很少的,大部分时间是留给主程序的。所以要慎用延时程序和死循环等待程序;如果要用到下面这两个程序的话只能是入门水平,离实用还有一定的距离。
Delay10ms();//延时10ms进行消抖;
while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
实际应用程序一定要学会时间的分配,各个程序要花费多少时间来执行时首先要考虑的问题,需要时间多的程序放在主程序中,需要定时扫描的程序放在中断中执行,中断中的程序是由严格时间要求的,一般都是微秒级的,如果大于1毫秒很容易出现问题。
回复

使用道具 举报

9#
ID:492770 发表于 2019-3-17 20:34 | 只看该作者
可以查看单片机的书籍,里面有详细介绍
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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