矩阵键盘检测
//根据列线的值来判断是哪一个按键按下了
{
case 0x0E:
//P20
K5
P0 = 0xEF;
break;
case 0x0D:
//P21 K6
P0 = 0xDF;
break;
case 0x0B:
//P22 K4
P0 = 0xF7;
break;
case 0x07:
//P23 K2
P0 = 0xFD;
ucKeyValue = (P2 & 0x0F); //读取端口值
if(ucKeyValue != 0x0F) //读取列线,并判断是否有按键按下
{
Delayms(10);
//延时去抖
ucKeyValue = (P2 & 0x0F); if(ucKeyValue != 0x0F) //确定有按键按下
采用行列式键盘的优点在于:在行列键盘中,每条水平线和垂直线在交叉处不直接连通, 而是通过一个按键加以连接,这样,一个端口就可以构成 4X4 个按键,比直接接独立按键 的时候多了一倍,而且线越多,区别越明显。因此,当需要的按键比较多的时候,采用矩阵 键盘来做事比较合理的。
矩阵键盘的结构要比独立按键复杂一些,在检测的时候也要相对复杂。一般情况,将行 线所接的 IO 作为输出端,列线所接的 IO 作为输入端。当没有按键按下的时候,所有的输 出都是高电平。扫描的时候,输出端(即行线)输出低电平,一旦有按键按下了,输入线就 会被拉低,这样,通过读取输入线的状态就可以得知是否有按键按下了。
//P23 K1
P0 = 0xFE;
break;
default:
break;
}
}
}
- 专业电子技术交流社区 电子工程师网上家园 -
电子
第 4页
行扫描法矩阵键盘检测
电子园
P2 = 0xFF;
//先置位端口
Row2 = 0;
//拉低第二行检测
/forum-116-1.html
**********************************************************************/
#include <REG52.H>
sbit Row1 = P2^4; //矩阵键盘第一行 sbit Row2 = P2^5; //矩阵键盘第二行
GUI开发学习网
STM32 开发学习网
EDA软件学习网
DSP开发学习网
PIC单片机学习网
51 单片机学习网
USB开发学习网
CAN总线学习网
AVR单片机学习网
ARM开发学习网
FTPA开发学习网
ucKeyValue = (P2 & 0x0F); //读取端口值
if(ucKeyValue != 0x0F)
//读取列线,并判断是否有按键按下
{
Delayms(10);
//延时去抖
ucKeyValue = (P2 & 0x0F);
if(ucKeyValue != 0x0F)
//确定有按键按下
{
switch (ucKeyValue)
- 专业电子技术交流社区 电子工程师网上家园 -
电子
第 7页
{
switch (ucKeyValue)
//根据列线的值来判断是哪一个按键按下了
{
case 0x0E:
//P20 K7
P0 = 0xBF;
break;
case 0x0D:
//P21 K8
P0 = 0x7F;
break;
case 0x0B:
//P22 K3
P0 = 0xFB;
break;
case 0x07:
void Delayms(unsigned char); void Key_Scan(void);
//延时函数,参数每增加 1,大概延时增加 1 毫秒 //矩阵键盘扫描函数
//main 函数
- 专业电子技术交流社区 电子工程师网上家园 -
电子
第 3页
行扫描法矩阵键盘检测
行扫描法矩阵键盘检测
电子园
51 单片机进阶篇
---矩阵键盘扫描
本文作者:Cepark 更新时间:2010/07/28 作者博客:
- 专业电子技术交流社区 电子工程师网上家园 -
电子
第 1页
行扫描法矩阵键盘检测
CEPARK51 实验板上的矩阵键盘是 2X4=8 的矩阵键盘,行线接在了 P2.4 和 P2.5 口,列 线接在了 P2.0-P2.3 口。
我们的扫面思路是:先将行线 P2.4 口拉低(主动拉低),然后去检测列线 P2.0-P2.3 的 状态,如果其都为高电平,说明没有按键按下,如果都一个为低电平,那么可以通过查询 P2.0-P2.3 的状态来确定是哪一个被按下了,同理再检测 P2.5 口对应的列。在程序中我们使 用 8 个 LED 作为 8 个矩阵键盘的指示。
电源技术专区
htt疗电子专区
汽车电子专区
消费电子专区
更多子站建设中,敬请关注!
break;
default:
break;
}
}
}
}
//延时函数,ucDelay 参数每增加 1,大概延时增加 1 毫秒 //延时函数的编写可以使用软件仿真来测试 void Delayms(unsigned char ucDelay) //延时函数 {
unsigned int i; for(;ucDelay > 0;ucDelay--)
常用的矩阵按键识别方法有:行扫描法、线翻转法和利用专门的 IC 的键盘接口(如 8279)。另外,基于状态机的按键扫描方法也是一种不错的选择。行扫描法和线翻转法需要 反复查询按键的状态,会占用大量的 CPU 时间,使用专门的 IC 会提高按键的查询效率,但 是会大大提高硬件的成本。
本节将以 CEPARK51 实验板为例介绍行扫描法。
DIY开发学习网
GPS开发学习网
- 专业电子技术交流社区 电子工程师网上家园 -
电子
第 6页
行扫描法矩阵键盘检测
电子园
for(i = 112;i > 0;i--); }
- 专业电子技术交流社区 电子工程师网上家园 -
电子
第 5页
行扫描法矩阵键盘检测
电子园
1、 电子园网站简介
CEPARK 电子园是一个以讨论电源、单片机、MCU、DSP、嵌入式软件、电子 DIY 等电子 技术的开放社区网站。CEPARK 电子园的宗旨是给所有爱好电子的朋友提供一个自由、开放、 免费的交流空间,并通过零利润的公益助学活动,让爱好电子的朋友能用相当低廉的价格开 始学习电子,而 CEPARK 电子园的论坛、“家园”、资源中心、博客、群组等功能,又为您 提供了开放的学习、讨论、请教求助的空间和渠道。
CEPARK 电子园的目标是建成中国最好的电子技术开放共享社区,为推动中国电子工程 师终生学习以及电子产品研发作出贡献。为广大网友提供一个自由、开放、专业的技术交流 空间,并努力与广大 CEPARK 电子园的朋友们一起建设一个更轻松的、更惬意、更完善的技 术、生活交流家园!
CEPARK 电子园创办于 2008 年。在短短的时间里,因其便利的学习方式和货真价实的助 学产品,获得了广大电子爱好者的支持和帮助,并对网站的内容建设提出了建设性的意见和 建议。CEPARK 电子网今天已经成为获得了 Alexa 排名 15 万以内、论坛每天的平均在线交流 人数超过 300 多人、每天平均 PaveView 超过 5 万次、访问独立 IP 数超过 1 万的活跃社区。
电子园
在键盘中按键数量较多时,为了减少 IO 口的占用,通常将按键排列成矩阵形式,也就 是常说的矩阵键盘。行列式键盘的按键实际上就是一个机械开关,该开关位于行线和列线的 交点处。如下图所示就是一个 4X4 矩阵键盘的图示和实物。
当有按键按下时,其交点的行线和列线接通,相应行线活列线上的电平发生变化,从而 确定被按下的功能键。
- 专业电子技术交流社区 电子工程师网上家园 -
电子
第 2页
行扫描法矩阵键盘检测
电子园
/********************************************************************** * 文件名称: main.c/矩阵按键检测 * 程序作者: kidcao1987 * 程序版本: V1.0 * 编制日期: 2010/07/28 * 功能描述: 矩阵按键检测 * 编译器:KEIL C51 * 芯片:STC89C52,外部 11.0592MHZ 晶振 * 技术支持: * Cepark 暑期 51 在线免费培训用程序:
void main(void) {
while(1) //程序循环 {
Key_Scan(); }
电子园
}
//矩阵键盘扫描程序
void Key_Scan(void)
{
unsigned char ucKeyValue;
P2 = 0xFF; //先置位端口
Row1 = 0;
//拉低第一行
2、 电子园分站点
电子园论坛
电子园百科
电子园商城
电子园家园
电子园网址
3、 电子园子站点