矩阵键盘的使用在单品机的学习当中十分广泛,可是对于许多新手,包括本人有时也是搞不明白,昨天晚上和今天早上的思考和同行们的讨论,终于有了点头绪,所以想记录下读取键盘的思路。
在单片机的学习版中,矩阵键盘通常如下图设计:
下面就以按下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哈哈~
CAN总线关闭故障诊断
固态LED照明技术在园艺方面的应用
单片机中断优先级应用案例
地平线与大唐移动签署战略合作协议
变电站无人值守监控系统
单片机矩阵键盘的使用之读取键盘
电动车充电器原理及维修技巧
出售R3765CH R3765CH R3765CH 网络分析
PCB内层和外层蚀刻方法
与非网承办第三代半导体创新创业大赛长三角赛区赛事启动
后摩尔时代,3D封装成为重要发展方向
Intel新步进九代酷睿全部型号公布
无线、隔离、时钟三管齐下壮大工业4.0发展
学习一下电工识图,里面的电路图的项目代号
三星:未来两三年对OLED很重要,不要重蹈LCD覆辙
中国工业企业利润出现近三年来首次下滑
2019年国际航空航天领域发生的各种大型事件回顾
脉冲第三刹车灯电路-ulsing Third Brake L
媲美iOS 华为方舟编译器它的玄乎所在
浅谈FPGA内部的时钟网络设计