找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10240|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机矩阵键盘检测程序-详细注释

[复制链接]
跳转到指定楼层
楼主
ID:75005 发表于 2015-3-21 16:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int
uchar table[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xBF};
       //0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,-的显示码
sbit BEEP = P3^7;         //蜂鸣器驱动线
uchar disp_buf;            //显示缓存
uchar  temp;   //暂存器
uchar  key;               //键顺序吗
/********以下是延时函数********/
void Delay_ms(uint xms)   
{
uint i,j;
for(i=xms;i>0;i--)        //i=xms即延时约xms毫秒
  for(j=110;j>0;j--);
}
/*********以下是蜂鸣器响一声函数********/
void  beep()
{
  BEEP=0;       //蜂鸣器响
  Delay_ms(100);
  BEEP=1;           //关闭蜂鸣器
  Delay_ms(100);   
}
/********以下是矩阵按键扫描函数********/
void  MatrixKey()
{
P1=0xff;   
P1=0xef;    //置第1行P1.4为低电平,开始扫描第1行
temp=P1;    //读P1口按键
temp=temp & 0x0f;   //判断低4位是否有0,即判断列线(P1.0~P1.3)是否有0
if (temp!=0x0f)   //若temp不等于0x0f,说明有键按下
{
  Delay_ms(10);  //延时10ms去抖  
  temp=P1;   //再读取P1口按键
  temp=temp & 0x0f;  //再判断列线(P1.0~P1.3)是否有0
  if (temp!=0x0f)  //若temp不等于0x0f,说明确实有键按下
  {
   temp=P1;   //读取P1口按键,开始判断键值
   switch(temp)
   {
    case 0xee:key=0;break;
    case 0xed:key=1;break;
    case 0xeb:key=2;break;
    case 0xe7:key=3;break;
   }
   temp=P1;   //将读取的键值送temp
   beep();   //蜂鸣器响一声
   disp_buf =table[key]; //查表求出键值对应的数码管显示码,送显示缓冲区disp_buf
   temp=temp & 0x0f;  //取出列线值(P1.0~P1.3)
   while(temp!=0x0f)  //若temp不等于0x0f,说明按键还没有释放,继续等待
   {
    temp=P1;  //若按键释放,再读取P1口
    temp=temp & 0x0f;// 判断列线(P1.0~P1.3)是否有0
   }
  }
}
P1=0xff;
P1=0xdf;     //置第2行P1.5为低电平,开始扫描第2行
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
  Delay_ms(10);
  temp=P1;
  temp=temp & 0x0f;
  if (temp!=0x0f)
  {
   temp=P1;
   switch(temp)
   {
    case 0xde:key=4;break;
    case 0xdd:key=5;break;
    case 0xdb:key=6;break;
    case 0xd7:key=7;break;
   }
   temp=P1;
   beep();
   disp_buf =table[key];
   temp=temp & 0x0f;
   while(temp!=0x0f)
   {
    temp=P1;
    temp=temp & 0x0f;
   }
  }
}
P1=0xff;
P1=0xbf;      //置第3行P1.6为低电平,开始扫描第3行
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
  Delay_ms(10);
  temp=P1;
  temp=temp & 0x0f;
  if (temp!=0x0f)
  {
   temp=P1;
   switch(temp)
   {
    case 0xbe:key=8;break;
    case 0xbd:key=9;break;
    case 0xbb:key=10;break;
    case 0xb7:key=11;break;
   }
   temp=P1;
   beep();
   disp_buf=table[key];
   temp=temp & 0x0f;
   while(temp!=0x0f)
   {
    temp=P1;
    temp=temp & 0x0f;
   }
  }
}
P1=0xff;
P1=0x7f;     //置第4行P1.7为低电平,开始扫描第4行
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
  Delay_ms(10);
  temp=P1;
  temp=temp & 0x0f;
  if (temp!=0x0f)
  {
   temp=P1;
   switch(temp)
   {
    case 0x7e:key=12;break;
    case 0x7d:key=13;break;
    case 0x7b:key=14;break;
    case 0x77:key=15;break;
   }
   temp=P1;
   beep();
   disp_buf =table[key];
   temp=temp & 0x0f;
   while(temp!=0x0f)
   {
    temp=P1;
    temp=temp & 0x0f;
   }
  }
}
}
/********以下是主函数********/
main()
{
P0=0xff;           //置P0口
P2=0xff;           //置P2口  
   disp_buf=0xBF;  //开机显示"-"符号
   while(1)
   {
    MatrixKey();  //调矩阵按键扫描函数
  P0 = disp_buf;    //键值送P0口显示
     Delay_ms(2);  //延时2ms
     P2 = 0x7f;  //打开第8只数码管
  }
}  



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表