矩阵键盘的运用在单品机的学习傍边非常广泛,但是关于许多新手,包含自己有时也是搞不明白,昨天晚上和今日早上的考虑和同行们的评论,总算有了点条理,所以想记载下读取键盘的思路。
在单片机的学习版中,矩阵键盘一般如下图规划:
下面就以按下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哈哈~