找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机学习笔记(七)矩阵键盘

[复制链接]
跳转到指定楼层
楼主
ID:108531 发表于 2016-3-12 16:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验板采用4*4矩阵键盘,行信号分别为P1.0-P1.3,列信号分别为P1.4-P1.7
4*4矩阵键盘,LED显示所按的键
C语言源程序:
#include<reg52.h>//52单片机头文件包含
#define uint unsigned int //定义宏uint 为 unsigned int
#define uchar unsigned char //定义宏 uchar 为 unsigned char
sbit wei1=P2^0; //定义数码管第一位
uchar code table[]={0xC0,0xF9,0xA4,0xB0,
                        0x99,0x92,0x82,0xF8,
                        0x80,0x90,0x88,0x83,
                        0xC6,0xA1,0x86,0x8E};//共阳数码管码表
void delay(uint z);//延时函数声明
uchar keyscan();//键盘扫描程序声明
void desplay(uchar a);//数码管显示函数声明
void main()//主函数
{
  wei1=0;//置0打开数码管显示
  P0=table[0];//显示数字0
  while(1)//主循环开始
  {
    display(keyscan());//显示从键盘输入的数字
  }
}
void display(uchar a) //显示子程序
{
  P0=table[a];  //将码表值赋值给P0
}
uchar keyscan() //键盘输入子程序
{
  uchar num,temp; //定义无符号变量num,temp
  P1=0xfe;//11111110 将0xfe赋值给P1扫描第一行
  temp=P1;//P1赋值给temp
  temp=temp & 0xf0;//将temp的值与0xf0进行与运算
  while(temp!=0xf0)//判断第一行是否有键按下
  {
    delay(5);//延时5ms
    temp=P1;//将P1赋值给temp
    temp=temp & 0xf0;//将temp的值与0xf0进行与运算
    while(temp!=0xf0)//再次确认是否有键按下
    {
      temp=P1;//将P1赋值给temp
      switch(temp)//根据temp值确认选择的按键
      {
        case 0xee:num=0;//等于0xee(11101110) 第一行第一列则为0号按键
          break;//跳出switch语句
        case 0xde:num=1;//等于0xde(11011110) 第一行第二列则为1号按键
          break;//跳出switch语句
        case 0xbe:num=2;//等于0xde(10111110) 第一行第三列则为2号按键
          break;//跳出switch语句
        case 0x7e;num=3;//等于0xde(01111110) 第一行第四列则为3号按键
          break;//跳出switch语句
      }
      while(temp!=0xf0) //循环直到按键松开
      {
        temp=P1;//将P1赋值给temp
        temp=temp & 0xf0;//将temp进行与运算
      }
    }
  }
  P1=0xfd;//11111101 将0xfd赋值给P1扫描第二行
  temp=P1;//P1赋值给temp
  temp=temp & 0xf0;//将temp的值与0xf0进行与运算
  while(temp!=0xf0)//判断是否有键按下
  {
    delay(5);//延时5ms
    temp=P1;//将P1赋值给temp
    temp=temp & 0xf0;//将temp与0xf0进行与运算
    while(temp!=0xf0)//再次确认是否有键按下    
    {
      temp=P1;//将P1赋值给temp
      switch(temp)//根据temp的值进行选择
      {
        case 0xed:num=4;//等于0xed(11101101) 第二行第一列则为4号按键
          break;//跳出switch语句
        case 0xdd:num=5;//等于0xdd(11011101) 第二行第二列则为5号按键
          break;//跳出switch语句
        case 0xbd:num=6;//等于0xdd(10111101) 第二行第三列则为6号按键
          break;//跳出switch语句
        case 0x7d;num=7;//等于0xdd(01111101) 第二行第四列则为7号按键
          break;//跳出switch语句
      }
      while(temp!=0xf0)//判断按键是否松开
      {
        temp=P1;//将P1赋值给temp
        temp=temp & 0xf0;//将temp与0xf0进行与运算
      }
    }
  }
  P1=0xfb;//11111011 将0xfb赋值给P1扫描第三行
  temp=P1;//P1赋值给temp
  temp=temp & 0xf0;//将temp的值与0xf0进行与运算
  while(temp!=0xf0)//判断是否有键按下
  {
    delay(5);//延时5ms
    temp=P1;//将P1赋值给temp
    temp=temp & 0xf0;//将temp值与0xf0进行与运算
    while(temp!=0xf0)//判断是否有键按下
    {
      temp=P1;//将P1赋值给temp
      switch(temp)//根据temp的值进行选择
      {
        case 0xeb:num=8;//等于0xed(11101011) 第三行第一列则为8号按键
          break;//跳出switch语句
        case 0xdb:num=9;//等于0xed(11011011) 第三行第二列则为9号按键
          break;//跳出switch语句
        case 0xbb:num=10;//等于0xed(10111011) 第三行第三列则为10号按键
          break;//跳出switch语句
        case 0x7b;num=11;//等于0xed(01111011) 第三行第四列则为11号按键
          break;//跳出switch语句
      }
      while(temp!=0xf0)//判断按键是否松开
      {
        temp=P1;//将P1赋值给temp
        temp=temp & 0xf0;//将temp与0xf0进行与运算
      }
    }
  }

  P1=0xfd;//11110111 将0xf7赋值给P1扫描第二行
  temp=P1;//P1赋值给temp
  temp=temp & 0xf0;//将temp的值与0xf0进行与运算
  while(temp!=0xf0)//判断是否有键按下
  {
    delay(5);//延时5ms
    temp=P1;//将P1赋值给temp
    temp=temp & 0xf0;//将temp与0xf0进行与运算
    while(temp!=0xf0)//再次判断是否有键按下
    {
      temp=P1;//将P1赋值给temp
      switch(temp)//根据temp的值进行选择
      {
        case 0xe7:num=12;//等于0xe7(11100111) 第四行第一列则为12号按键
          break;//跳出switch语句
        case 0xd7:num=13;//等于0xd7(11010111) 第四行第二列则为13号按键
          break;//跳出switch语句
        case 0xb7:num=14;//等于0xb7(10110111) 第四行第三列则为14号按键
          break;//跳出switch语句
        case 0x77;num=15;//等于0x77(01110111) 第四行第四列则为15号按键
          break;//跳出switch语句
      }
      while(temp!=0xf0)//判断按键是否松开
      {
        temp=P1;//将P1赋值给temp
        temp=temp & 0xf0;//将temp与0xf0进行与运算
      }
    }
  }
  return num; //返回结果
}      
void delay(uint z) //延时函数 参数无符号整型z
{
  uint x,y; //定义无符号整型变量x,y
  for(x=z;x>0;x--)  //主循环循环z次
    for(y=110;y>0;y--);//子循环循环110次
}
//实验现象 按下矩阵键盘上的按键 数码管显示相应的数字

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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