网站公告列表     本站开通全国范围代收货款业务,详情请点击  [dycxin  2008年5月14日]        
加入收藏
设为首页
联系站长
您现在的位置: EDA加油站 >> 51单片机 >> 实验板DIY >> 初级实验板 >> 正文
  [推荐]4 x 4矩阵键盘识别实例分析           ★★★ 【字体:
4 x 4矩阵键盘识别实例分析
4 x 4矩阵键盘识别实例分析
作者:未知    51单片机来源:本站原创    点击数:    更新时间:2008-8-14    
在单片机应用系统中,键盘是人机对话不可缺少的组件之一。在按键比较少时,我们可以一个单片机I/O口接一个按键,但当按键需要很多,I/O资源又比较紧张时,使用矩阵式键盘无疑是最好的选择。

        4 x 4矩阵键盘是运用得最多的键盘形式,也是单片机入门必需掌握的一种键盘识别技术,下面我们就以实例来说明一下4 x 4矩阵键盘的识别方法。如下图所示,我们把按键接成矩阵的形式,这样用8个I/O口就可以对16个按键进行识别了,节省了I/O口资源。

       我们的识别思路是这样的,初使化时我们先让P1口的低四位输出低电平,高四位输出高电平,即让P1口输出0xF0。扫描键盘的时候,我们读P1口,看P1是否还为0xF0,如果仍为0xF0,则表示没有按键按下;如果不0xF0,我们先等待10ms左右,再读P1口,再次确认是否为0xF0,这是为了防止是抖动干扰造成错误识别,如果不是那就说明是真的有按键按下了,我们就可以读键码来识别到底是哪一个键按下了。

        识别的过程是这样的,初使化时我们让P1口的低四位输出低电平,高四位输出高电平,确认了真的有按键按下时,我们首先读P1口的高四位,然后P1口输出0x0F,即让P1口的低四位输出高电平,高四位输出低电平,然后读P1口的低四位,最后我们把高四位读到的值与低四位读到的值做或运算就得到了该按键的键码。就可以知道是哪个键按下了。

        以0键为例,初使化时P1输出0xF0,当0键按下时,我们读高四位的状态应为1110,即P1为0xE0,然后让P1输出0x0F,读低四位产状态应为0111,即P1为0x07,让两次读数相与得0xE7。

        现在我们在P0口和P2口分别接一个共阳极的数码管,用来显示我们按下去的键的键值,P0口接的是个位,P2口接的是十位。如0键按下显示00,1键按下显示01,15键按下显示15……,实现的程序如下:

#include <reg52.h>
unsigned char num[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极LED段码0~9
unsigned char k;
/*************延时Xms*****************/
void Delay_nms(unsigned int n) //延时程序
{ unsigned int i,j;
for(i=n;i>0;i--)
for(j=112;j>0;j--);
}
void GetKey ( )//键盘扫描函数,用于识别哪一个键按下,并读取键值
{ unsigned char X,Y,Z;
P1=0x0f; //先对P3置数 行扫描
if(P1!=0x0f) //判断是否有键按下
{
Delay_nms(10); //延时,软件去干扰
if(P1!=0x0f) //确认按键按下X = P3;
{
X=P1&0x0f; //保存行扫描时有键按下时状态
P1=0xf0; //列扫描
Y=P1&0xf0; //保存列扫描时有键按下时状态
Z=X|Y; //取出键值
switch ( Z ) //判断键值(那一个键按下)
{
case 0xe7: k=0; break; //对键值赋值
case 0xd7: k=1; break;
case 0xb7: k=2; break;
case 0x77: k=3; break;
case 0xeb: k=4; break;
case 0xdb: k=5; break;
case 0xbb: k=6; break;
case 0x7b: k=7; break;
case 0xed: k=8; break;
case 0xdd: k=9; break;
case 0xbd: k=10;break;
case 0x7d: k=11;break;
case 0xee: k=12;break;
case 0xde: k=13;break;
case 0xbe: k=14;break;
case 0x7e: k=15;break;
}
}
}
}
void main(void)
{
unsigned char m=0;
unsigned char n=0;
while(1)
{
GetKey();//得到键值
m=k/10;//求出键值的十位
n=k&10;//求出键值的个位
P2=num[m];//P2口上的数码管显示键值的十位
P0=num[n];//P0口上的数码管显示键值的个位
}
}

51单片机录入:dycxin    责任编辑:dycxin 
  • 上一个51单片机:

  • 下一个51单片机: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    DS18B20温度传感器C51程序,…
    基于频谱分析的机电设备状态…
    AT89s8252单片机在3G基站控制…
    单片机实现智能荧光鉴伪
    智能盲人导行仪的设计与实现
    基于AT89C51型单片机的CAN总…
    STC单片机IO管脚毁坏动态自检…
    具备跳号跳频和跳址的nrf905…
    51单片机边沿触发中断响应时…
    8051单片机在线升级软件的方…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    EDA加油站|我要EDA网|山东电子网--东营市荣燕商贸有限公司版权所有! 站长:阿荣
    联系电话:0546-7870320,13371507828 电邮:51edacn@163.com
    山东东营西城济南路百祥电脑商城B302室 邮编:257000 鲁ICP备07018763号  鲁ICP备07000091号 鲁ICP备05003434号
    公司帐号:1615011209000037682 户名:东营市荣燕商贸有限公司 开户行:工行西城支行石油大学分理处