首页 > 编程知识 正文

矩阵键盘扫描原理和过程(两种方式实现矩阵键盘扫描(含程序))

时间:2023-05-03 17:06:47 阅读:122753 作者:4298

1矩阵键盘结构下图为4*3矩阵键盘示意图,三条列线连接到P1.4-P1.6引脚。 在4条行线上连接P1.0-P1.3端子

2逐行扫描法中,首先使与3条列线连接的I/O端子P14-P16输出低电平,使与4条行线连接的I/O端子P10-P13输出高电平。 如果未按下键,则读取到与4条线路连接的I/O端子的全部变为高电平。 此外,按下按钮时,该按钮所在的行线和列线相连,因此行线会下降到低电平。 此时,与读取线连接的引脚P10-P13不再全部为高电平,能够判断为有键按下。 判断为键被按下后,通过逐行扫描的方法获取键的键值。

逐行列扫描法的原理表示,将列线按列依次设为低电平来读取行线,如果某行线为低电平,则按压位于该行线与当前成为低电平的列线的交叉点的键,能够取得键的键值。

#define keyboard P1 //书行线三条列线连接的IO端口unsignedcharcheck _ keyboard ({ unsignedcharrow _ scan _ code=0x 01; //行扫描码unsigned char col_scan_code=0xEF; //列扫描码无符号字符码; //键值unsigned char i,x,j; //抖动消除处理for(I=0; i3; 逐列扫描,逐列降低列线{keycode=i 1; keyboard=col_scan_code; x=keyboard; //读取线状态for(j=0; j4; 逐行扫描j//1行{if (! (xrow_scan_code )//按说明相应行的键,使行线下移({keycode=3*j; //如果键尚未释放,则仍会将行引向低级别while () ) (keyboard0x0f )!=0x0f; 按//按钮等待释放P1=0x0F; //恢复原始状态,为下一个按钮做准备; 检测到//键码。 返回(elserow_scan_code=_crol_ ) row_scan_code,1 )。 } col _ scan _ code=_ crol _ (col _ scan _ code,1 );//左移一位,将下一列线条降低row_scan_code=0x01; //重置行扫描码,准备下一行扫描}keycode=0; //无键按下,键值为0返回键; )在三行翻转法的基础上逐行扫描方法繁琐,实际单片机系统中常用行翻转法。

线反转法的原理是,首先使P1端口的前4位输出高电平,使P1端口的后4位输出低电平。 此时,键盘的行线高,列线低。 键按下时,其中一条线会被拉下。 此时,P1端口的前4位被读取,读取的全部不再是高电平,表示有按键。 从连接有读取了[在判断键是否被按下这一点上,行反转法与逐行的依次扫描法一致]0的值的I/O端口的行,能够判断被按下的键位于哪一行。 接着,使P1端口的高位4位输出为低电平,使P1端口的低位4位输出为高电平。 (也就是说,与上次输出的电平相反,所以称为线反转法。 如果有按键,此时读取P1端口的后4位,读取的键将不再全部为高电平,可以从连接有读取了0值的I/O端口的列线判断被按下的键位于哪一列。 通过合并键所在的行线和列线,可以唯一确定键所在的位置并获取键的键值。

//@brief:判断是否在4*4矩阵键盘上可靠地按下了键,在高位4位的端口线、低位4位的端口线//@retval:上可靠地按下了键的情况下返回1-16的键值If (键盘! 按=0x0f )//键,然后按{Delay_ms(10 ); 延迟10ms挥动if (键盘!=0x0f ()//确保按下包含键的列,然后使用包含键的列的第一行中的键值分配给KeyValuekeyboard=0X0F的switch(keyboard ) case (0x 07 ) 3360 key value 布雷克; //在第一列中按case(0x0b ) :KeyValue=2的break;//第2列为case(0x0d ) : KeyValue=3; 布雷克;//第3列为case(0x0e ) :KeyValue=4; 布雷克; //第4列按下(//判断按钮所在行keyboard=0XF0; 交换机(密钥板情况)0x70 ) :KeyValue=KeyValue; 布雷克;//第1行按case(0XB0) :KeyValue=KeyValue 4; 布雷克;//第2行按case(0xd0) : KeyValue=KeyValue 8; 布雷克; 在//第3行按case(0xe0 ) :KeyValue=KeyValue 12; 布雷克;//在第4行中(while(keyboard!=0xf0; 按下//按钮松开手后退出返回密钥值; }else //否则,信号干扰引起的{return 0; 我想没有按//按钮} }返回0; 如果不按下//按钮,则返回零}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。