您的位置 首页 观点

单片机矩阵键盘的使用之读取键盘

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

矩阵键盘的运用在单品机的学习傍边非常广泛,但是关于许多新手,包含自己有时也是搞不明白,昨天晚上和今日早上的考虑和同行们的评论,总算有了点条理,所以想记载下读取键盘的思路。

单片机的学习版中,矩阵键盘一般如下图规划:

下面就以按下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言语的代码来解释一下:

/*————————————————

键盘扫描程序

————————————————*/

uchar keyscan( void ) //键盘扫描函数,运用队伍回转扫描法

{

uchar cord_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哈哈~

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/345907.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部