标题: 求个大神给个单片机4x3矩阵按键扫描程序的思路,本人有点束手无策. [打印本页]

作者: yzcook    时间: 2018-6-13 17:05
标题: 求个大神给个单片机4x3矩阵按键扫描程序的思路,本人有点束手无策.
是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;




作者: zhanghyg    时间: 2018-6-14 09:24
先把所有的行置高电平,所有的列置低电平,等待高电平的引脚变低也就是键按下的时候(这时候就能判断是哪一行的键被按下了),然后立即把所有的行置低电平,所有的列置高电平(这时候按键还未松开),看哪一列的引脚变低了,就能判断是哪一列的键被按下了,然后两者结合就能判断是哪个键按下了。
作者: zhb2004xp    时间: 2018-6-14 10:40
使用20ms中断计数,状态字=0进行扫描,状态字=1进行消抖,输出键值,状态字=2判断按键松开;
作者: a89588038    时间: 2019-9-25 09:54
楼主解决这个问题没,小弟也不是很清楚,可以讲解一下吗?

作者: csmyldl    时间: 2019-9-25 12:04
这种不连续的IO口线编程是困难些,但原理是一样的,用定时计数器依次使P16 P17 P32为低电平进行列扫描,在主程序中依次检查P34 P35 P27 P33的电平状态,如果某一根线的电平为低电平就可以判断出来,楼主碰到这种不连续的IO口接线,一定是硬件设计与软件设计没有规划好,一个大硬件系统各端口的分配要依照软件编程方便的原则,不要给编程者造成较大的麻烦
作者: xianfajushi    时间: 2019-9-26 08:45
楼主这样的端口定义,与传统的思路有区别,传统用的是直接读取整个IO值,而楼主这种则要分别送信号和读取判断即可,比如3线的口其中1口送信号,4线的端口分别判断,即可求出哪个按钮按下了.
作者: yfpc2006    时间: 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;
        }
}







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