就是这个表:
最后就是课后小练,
就结束了第十课的学习!
今天开始学习 第十一集 矩阵按键
先看看电路图:
那么像这种矩阵式的按键, 它和独立按键的区别就是它的端可是可以复用的,
可以看到这里有8个按键, 如果说按照独立按键的接法, 他是不是应该接在8个10口上?但是这里可以看到他只有6个,是不是能发现他横着4个,接在一个脚上。
这里两行占了两个竖的一列,竖的1列接在了一个引脚上,对不对这里有4列,所以有4个端口,他总共用了6个端口,他就可以实现我们8个按键。如果是16个按键,他是不是只要4列加4行都可以?这种就是一个矩阵按键。
最大的好处在哪里呢?就是它可以用有限的端口,去实现我们更多的按键。
这个按键检测,会比这个独立按键比较慢,因为独立按键他单个端口就检测一个引脚对不对,那么这里的话他要反复的去扫描。先一列一列的扫过去,然后再一行一行的扫过去。好那我们来看一下这个原理这个矩阵按键的原理是什么呢?
按键识别原理:端口默认为高电平,实时读取到引脚为低电平是表示按下。
① 第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的10就会变成低电平,就可以判断出哪一行按下了。
② 第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的10就会变成低电平,就可以判断出哪一列按下了。
③ 第三步:行列组合一下就可以判断出是哪个按键按下了。
就是说是通过横纵扫描来推断,你按下了那颗按钮
程序实现:
先定义端口:
水平占2个IO口P06P07
竖直占4个IO口P00P01P02P03
先把源程序放上来:
u8 key_num = 0xff;
//任务1:数码管显示当前的按键号
void Task_1(void)
{
//①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
COL1 = 0;
COL2 = 0;
COL3 = 0;
COL4 = 0;
ROW1 = 1;
ROW2 = 1;
if(( ROW1 == 0 ) || ( ROW2 == 0 )) //如果行按键有按下
{
if(( ROW1 ==0 ) && ( ROW2 ==0 )) //如果两行都有按键按下,不处理
{
}
else if((( ROW1 ==1 )&&( ROW2 ==0 )) || (( ROW1 ==0 )&&( ROW2 ==1 ))) //如果有按键按下,而且只有一颗
{
if( ROW1 ==0 ) //判断哪一行,输出行开始的序号
key_num = 0;
else if( ROW2 ==0 )
key_num = 4;
//②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
COL1 = 1;
COL2 = 1;
COL3 = 1;
COL4 = 1;
ROW1 = 0;
ROW2 = 0;
if( COL1 ==0 ) //判断哪一列,叠加按键的序号
{
// key_num = key_num ; //③第三步:行列组合一下就可以判断出是哪个按键按下了。
}
else if( COL2 ==0 )
{
key_num = key_num + 1;
}
else if( COL3 ==0 )
{
key_num = key_num + 2;
}
else if( COL4 ==0 )
{
key_num = key_num + 3;
}
}
COL1 = 0;
COL2 = 0;
COL3 = 0;
COL4 = 0;
ROW1 = 1;
ROW2 = 1;
}
else
{
key_num = 0xff;
}
}
大致逻辑是先判断是哪行,
第一行key_num=0,第二行key_num=4
再判断是哪列,第一列+0,第二列+1, 第三列+2,第四列+3
这样最后key_num的值就和下图对上了: