找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求个大神给个单片机4x3矩阵按键扫描程序的思路,本人有点束手无策.

[复制链接]
跳转到指定楼层
楼主
ID:305998 发表于 2018-6-13 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
是4x3矩阵按键扫描的刚学单片机不就。以前接触的按键扫描都是连续的io口,一整组的P1 或者P2这样数据口 。
但是换到这种不连续的不规则的 本人有点束手无策 希望有个大神帮我解答下。万分感谢。

实现按下一次出一个值,消抖方面最好不用延迟消抖。
sbit X1 = P3^4;// 行
sbit X2 = P3^5;
sbit X3 = P2^7;
sbit X4 = P3^3;

sbit Y1 = P1^6;// 列
sbit Y2 = P1^7;
sbit Y3 = P3^2;



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

使用道具 举报

沙发
ID:330198 发表于 2018-6-14 09:24 | 只看该作者
先把所有的行置高电平,所有的列置低电平,等待高电平的引脚变低也就是键按下的时候(这时候就能判断是哪一行的键被按下了),然后立即把所有的行置低电平,所有的列置高电平(这时候按键还未松开),看哪一列的引脚变低了,就能判断是哪一列的键被按下了,然后两者结合就能判断是哪个键按下了。
回复

使用道具 举报

板凳
ID:234075 发表于 2018-6-14 10:40 | 只看该作者
使用20ms中断计数,状态字=0进行扫描,状态字=1进行消抖,输出键值,状态字=2判断按键松开;
回复

使用道具 举报

地板
ID:370231 发表于 2019-9-25 09:54 | 只看该作者
楼主解决这个问题没,小弟也不是很清楚,可以讲解一下吗?
回复

使用道具 举报

5#
ID:235200 发表于 2019-9-25 12:04 | 只看该作者
这种不连续的IO口线编程是困难些,但原理是一样的,用定时计数器依次使P16 P17 P32为低电平进行列扫描,在主程序中依次检查P34 P35 P27 P33的电平状态,如果某一根线的电平为低电平就可以判断出来,楼主碰到这种不连续的IO口接线,一定是硬件设计与软件设计没有规划好,一个大硬件系统各端口的分配要依照软件编程方便的原则,不要给编程者造成较大的麻烦
回复

使用道具 举报

6#
ID:332444 发表于 2019-9-26 08:45 | 只看该作者
楼主这样的端口定义,与传统的思路有区别,传统用的是直接读取整个IO值,而楼主这种则要分别送信号和读取判断即可,比如3线的口其中1口送信号,4线的端口分别判断,即可求出哪个按钮按下了.
回复

使用道具 举报

7#
ID:138119 发表于 2019-10-2 01:32 | 只看该作者
#define S8      RB5
#define S7      RB4
#define S6      RC2
#define S5      RC1
#define S4      RC0
#define S3      RA2
#define S2      RA1
#define S1      RA0

#define KEY_delay_OK                30


void Scan_KEY(void)
{
        if(S1==0 && S2==1 && S3==1 && S4==1)
        {
                ++KEY_tmp;
                if(KEY_tmp >= KEY_delay_OK)       
                {
                        KEY_tmp = 0;
                        if(S5==0 && S6==1 && S7==1 && S8==1)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 4;
                                        KEY_one_bit = 0;                               
                                }
                        }
                        else if(S5==1 && S6==0 && S7==1 && S8==1)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 3;
                                        KEY_one_bit = 0;                               
                                }
                        }
                        else if(S5==1 && S6==1 && S7==0 && S8==1)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 2;
                                        KEY_one_bit = 0;                               
                                }
                        }
                        else if(S5==1 && S6==1 && S7==1 && S8==0)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 1;
                                        KEY_one_bit = 0;                               
                                }
                        }
                }
        }
        else if(S1==1 && S2==0 && S3==1 && S4==1)
        {
                ++KEY_tmp;
                if(KEY_tmp >= KEY_delay_OK)
                {
                        KEY_tmp = 0;
                        if(S5==0 && S6==1 && S7==1 && S8==1)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 8;
                                        KEY_one_bit = 0;                       
                                }
                        }
                        else if(S5==1 && S6==0 && S7==1 && S8==1)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 7;
                                        KEY_one_bit = 0;                       
                                }
                        }
                        else if(S5==1 && S6==1 && S7==0 && S8==1)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 6;
                                        KEY_one_bit = 0;                       
                                }
                        }
                        else if(S5==1 && S6==1 && S7==1 && S8==0)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 5;
                                        KEY_one_bit = 0;                       
                                }
                        }
                }       
        }       
        else if(S1==1 && S2==1 && S3==0 && S4==1)
        {
                ++KEY_tmp;
                if(KEY_tmp >= KEY_delay_OK)       
                {
                        KEY_tmp = 0;
                        if(S5==0 && S6==1 && S7==1 && S8==1)       
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 12;
                                        KEY_one_bit = 0;               
                                }
                        }
                        else if(S5==1 && S6==0 && S7==1 && S8==1)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 10;
                                        KEY_one_bit = 0;               
                                }
                        }
                        else if(S5==1 && S6==1 && S7==0 && S8==1)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 11;
                                        KEY_one_bit = 0;               
                                }
                        }
                        else if(S5==1 && S6==1 && S7==1 && S8==0)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 9;
                                        KEY_one_bit = 0;               
                                }
                        }
                }
        }
        else  if(S1==1 && S2==1 && S3==1 && S4==0)
        {
                ++KEY_tmp;
                if(KEY_tmp >= KEY_delay_OK)       
                {
                        KEY_tmp = 0;
                        if(S5==0 && S6==1 && S7==1 && S8==1)       
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 16;
                                        KEY_one_bit = 0;       
                                }
                        }
                        else if(S5==1 && S6==0 && S7==1 && S8==1)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 15;
                                        KEY_one_bit = 0;       
                                }
                        }
                        else if(S5==1 && S6==1 && S7==0 && S8==1)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 14;
                                        KEY_one_bit = 0;       
                                }
                        }
                        else if(S5==1 && S6==1 && S7==1 && S8==0)
                        {
                                if(KEY_num_bit == 0)
                                {
                                        KEY_num_bit = 1;
                                        KEY_num = 13;
                                        KEY_one_bit = 0;       
                                }
                        }
                }
        }
        else
        {
                KEY_tmp = 0;
                KEY_num = 0;
                KEY_num_bit=0;
        }
}


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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