标题:
求个大神给个单片机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