扫描方法是在程序中逐行或逐列地扫描查询键盘界面,根据端口的输入情况判断按下的是哪个键,然后分别调用不同的按键处理子程序。这里以4×4矩阵键盘为例介绍列扫描方式。
使用列扫描时,矩阵键盘的电路结构如图所示,其中矩阵键盘的行线应通过上拉电阻连接到电源正极。此时若无按键按下,则对应行线为高;如果按下按钮,则相应交叉点的行列线短路,行线的输出取决于与该行相连的列的功率。平坦状态。通过逐列扫描键盘,可以实现对矩阵键盘的检测。
扫描方法的流程
键盘扫描方法流程图如图所示。键盘扫描的一般步骤如下。
(1)判断按钮是否被按下。在程序中,输出所有列行(Y0~Y3)为“0”,此时读取行行的状态( X0~X3).如果行线全为“1”,表示此时没有按键按下;如果行线不全为“1”,表示有按键按下。然后继续以下步骤。
(2)去抖按键。当判断有按键被按下时,程序延时10ms左右4*4矩阵键盘判断程序,然后再次判断键盘状态。如果还是按键状态,确定有按键按下,否则视为按键机械抖动。
(3)扫描按钮的位置,这是扫描方法在程序中,先让Y0列线输出“0”,其他三列线输出“1”。然后读取行线状态,如果行线(X0~X3)都输出“1”。如果行线(X0~X3)不都是高电平),则表示与低电平行线相交的键,Y0被按下,如果Y0列没有按下按钮,则以同样的方法检查Y1、Y2和Y3列是否有按钮按下。方式,逐列扫描,可以找到按钮(X,Y)的坐标位置,即键值。
(4)按钮程序处理。根据按钮的键值,执行相应的程序处理子程序。有时,为了保证每按一次按钮只执行一次程序处理,可以判断是否放开按键,如果放开按键,则重新开始按键扫描操作。
扫描方式C51编程
假设8051单片机的P1口接矩阵键盘,矩阵键盘的列线(Y0~Y3)接单片机P1.0~ P1.3,而行线(X0~X3)连接到P1.4~P1.7。在C51语言中,键盘的例子列扫描子程序如下。
int KeyScan()
{
unsigned char k,k_temp;
P1=0xF0;//低位置0,准备查询按键
k=P1;//取得当前P1口的状态
if(k!=0xF0)
{//如果有变化则表示有键按下
delay();//延时,进行去抖动
k_temp=P1;
if(k==k_temp)//确实有按键按下
{
k=0xFE;
do//循环扫描每一列
{
P1=k;
if(k!=P1)
{
switch(P1)//判断按键,并返回键值
{
//第1列
case 0x7e:{return 0;break;}//返回键值0
case 0xbe:{return 1;break;}//返回键值1
case 0xde:{return 2;break;}//返回键值2
case 0xee:{return 3;break;}//返回键值3
//第2列
case 0x7d:{return 4;break;}//返回键值4
case 0xbd:{return 5;break;}//返回键值5
case 0xdd:{return 6;break;}//返回键值6
case 0xed:{return 7;break;}//返回键值7
//第3列
case 0x7b:{return 8;break;}//返回键值8
case 0xbb:{return 9;break;}//返回键值9
case 0xdb:{return 10;break;}//返回键值10
case 0xeb:{return 11;break;}//返回键值11
//第4列
case 0x77:{return 12;break;}//返回键值12
case 0xb7:{return 13;break;}//返回键值13
case 0xd7:{return 14;break;}//返回键值14
case 0xe7:{return 15;break;}//返回键值15
}
}
k=_crol_(k,1);//移位,进入下一列扫描
}while(k!=0xEF);//超过范围,退出列扫描
}
}
在这个程序中,首先将所有行设置为0,然后读取端口P1。如果P1口不为0xF04*4矩阵键盘判断程序,则表示有按键动作,然后执行延时程序delay(),然后再次判断确认按键被按下。然后通过do-while循环和移位操作,逐列扫描,确定key的位置,返回key值。
这个子程序可以在程序中循环调用,对key的输入进行扫描,然后根据返回的key值执行相应的程序处理。在执行按键处理子程序时,单片机无法再次响应按键请求。因此,单片机的按键处理子程序应该执行的任务越少,占用的CPU运行时间越少。并且键盘扫描尽量安排在程序的备件中。时间满足实时准确按钮请求的目的。
请登录后发表评论
注册
社交帐号登录