您现在的位置: 主页 > MCU > 单片机技术应用 > 矩阵键盘的编程方法——读取键值 -
本文所属标签:
为本文创立个标签吧:

矩阵键盘的编程方法——读取键值 -

来源: 网络用户发布,如有版权联系网管删除 2018-09-07 

[导读]矩阵键盘的使用在单品机的学习当中十分广泛,可是对于许多新手,包括本人有时也是搞不明白,昨天晚上和今天早上的思考和同行们的讨论,终于有了点头绪,所以想记录下读取键盘的思路。在单片机的学习版中,矩阵键盘通

矩阵键盘的使用在单品机的学习当中十分广泛,可是对于许多新手,包括本人有时也是搞不明白,昨天晚上和今天早上的思考和同行们的讨论,终于有了点头绪,所以想记录下读取键盘的思路。

本文引用地址: http://www.21ic.com/app/mcu/201808/783490.htm

在单片机的学习版中,矩阵键盘通常如下图设计:

下面就以按下S16键来讲解其思路:

首先:

P3的高位P3.4~P3.7输出为0,低位P3.0~P3.3输出为1;即P3=0x0F,当按下S16键后(有消抖动过程),P3.3的值为0,则P3的值更新为0x07;

其次:

P3的高位P3.4~P3.7输出为1,低位P3.0~P3.3输出为0;即P3=0xF0,当按下S16键后(有消抖动过程),P3.4的值为0,则P3的值更新为0xE0;

最后将两个值相加得P3=0xE7;

在keyscan()函数(假设我们的键盘扫描程序为unsigned char keyscan())返回其键盘的值供后续的程序调用,通常会有一个switch块根据其返回值来确定输出的是哪一个数值。

下面提供一段KeilC51语言的代码来解释一下:


/*------------------------------------------------

键盘扫描程序

------------------------------------------------*/

ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法

{

ucharcord_h,cord_l;//行列值中间变量

P3=0x0f;//行线输出全为0

cord_h=P3&0x0f;//读入列线值

if(cord_h!=0x0f)//先检测有无按键按下

{

delay(100);//去抖

if(cord_h!=0x0f)

{

cord_h=P3&0x0f;//读入列线值

P3=cord_h|0xf0;//输出当前列线值

cord_l=P3&0xf0;//读入行线值

return(cord_h+cord_l);//键盘最后组合码值

}

}

return(0xff);//返回该值

}


首先把P3的口赋值为0x0f,同时把P3和0x0f赋值给cord_h(行的数值),倘若有按键按下,那么P3的值就会改变,随后cord_h的只也会随之变化,经过消抖之后记录cord_h的值,

即cord_h = P3 & 0x0f;

(若以S16为例,那么P3.3的值变为0,所以cord_h的值就会变为0x07;)

接下来:P3 = cord_h | 0xf0;

意在不改变P3的第四位,把P3的高四位赋为高电平,那么P3=0x0f7;

到了关键的一步:

cord_l = P3 & 0xf0;我当初以为cord_l=0xf0呢,结果就和程序运行的不一样喽,最后还是问了我的同行(非常感谢刘伟同志!指点迷津!),其实在第二个if语言内,S16已经被按下了的,所以P3的值立刻就变为0x0e的了,以至于cord_l=0x0e,最后返回行和列的和return( cord_h + cord_l );(0xe7)。这才是最终对的结果,各位看官懂了吗?O(∩_∩)O哈哈~




              查看评论 回复



嵌入式交流网主页 > MCU > 单片机技术应用 > 矩阵键盘的编程方法——读取键值 -
 

"矩阵键盘的编程方法——读取键值 -"的相关文章

网站地图

围观()