实验(五)键盘检测实验

一.实验目的、内容、仪器

实验目的:

  1. 了解并区分独立按键,矩阵按键,以及其它模块的按键。

  1. 编写键盘的相关算法,了解相关概念

实验内容:进行独立按键以及矩阵按键的测试实验

实验仪器:7SEG-MPX8-CC:八位数码管共阴极,74HC573:锁存器,74HC138:译码器,AT89C52:52单片机,RESPACK-8:排阻,BUTTON:按键、CAP:电容、CRYSTAL:晶振、RES:电阻

二.硬件原理

三.程序流程图

四.代码实现

#include <REGX52.H>
sbit LSA=P2^4;
sbit LSB=P2^3;
sbit LSC=P2^2;     
void Delay(unsigned int xms)
{
    unsigned char i, j;
    while(xms--)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
    }
}
unsigned char MatrixKey()
{
    unsigned char KeyNumber=0;

    P1=0xFF;
    P1_3=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
    
    P1=0xFF;
    P1_2=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
    
    P1=0xFF;
    P1_1=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
    
    P1=0xFF;
    P1_0=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
    
    return KeyNumber;
}



unsigned char KeyNum;
//数码管段码表

unsigned char a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//数码管显示子函数
void Nixie(unsigned char Location,Number)
{
    switch(Location)        //位码输出
    {
        case 1:LSA=1;LSB=1;LSC=1;break;
        case 2:LSA=1;LSB=1;LSC=0;break;
        case 3:LSA=1;LSB=0;LSC=1;break;
        case 4:LSA=1;LSB=0;LSC=0;break;
        case 5:LSA=0;LSB=1;LSC=1;break;
        case 6:LSA=0;LSB=1;LSC=0;break;
        case 7:LSA=0;LSB=0;LSC=1;break;
        case 8:LSA=0;LSB=0;LSC=0;break;
    }
    P0=a[Number];    //段码输出
    Delay(1);                //显示一段时间
    P0=0x00;                //段码清0,消影
}


void main()
{

    
    while(1)
    {
        KeyNum=MatrixKey();                //获取矩阵键盘键码
        
        
switch(KeyNum)
{

    case 1:
      LSA=1;LSB=1;LSC=1;
      P0=a[0];
        break;
case 2:
            LSA=1;LSB=1;LSC=0;
    P0=a[1];
        break;
case 3:
     LSA=1;LSB=0;LSC=1;
     P0=a[2];
        break;
case 4:
     LSA=1;LSB=0;LSC=0;
       P0=a[3];
        break;
case 5:
            LSA=0;LSB=1;LSC=1;
      P0=a[4];
          break;
case 6:
    LSA=0;LSB=1;LSC=0;
    P0=a[5];
        break;
case 7:
      LSA=0;LSB=0;LSC=1;
      P0=a[6];
        break;
case 8:
            LSA=0;LSB=0;LSC=0;
    P0=a[7];
        break;


    case 9:
      LSA=1;LSB=1;LSC=1;
      P0=a[8];
        break;
case 10:
            LSA=1;LSB=1;LSC=0;
    P0=a[9];
        break;
case 11:
     LSA=1;LSB=0;LSC=1;
     P0=a[10];
        break;
case 12:
     LSA=1;LSB=0;LSC=0;
       P0=a[11];
        break;
case 13:
            LSA=0;LSB=1;LSC=1;
      P0=a[12];
          break;
case 14:
    LSA=0;LSB=1;LSC=0;
    P0=a[13];
        break;
case 15:
      LSA=0;LSB=0;LSC=1;
      P0=a[14];
        break;
case 16:
            LSA=0;LSB=0;LSC=0;
    P0=a[15];
        break;


}

    }
}

五.实验步骤

(1)了解译码器的功能,以及动态显示原理

(2)搭建仿真电路,勾选debug,建立keil工程,选择单片机型号

(3)给工程创建源码文件,并以.c结尾,添加文件到源组里

(4)生成hex文件,点击魔术棒,在output中勾选Create HRX_File

(5)对代码进行编译,调试debug,点击USE,在下拉菜单里选中“Proteus VSM Monitor 一51 ”进行设置

(6)将程序导入到单片机中运行,双击单片机,选择生成的hex文件

(7)在keil中启动调试,开始运行,观察proteus中的电路

六.结果及讨论

行/列扫描:检测时,先送一行为低电平,其余几列全为高电平,然后立即轮流监测一次各列是否有低电平,若检测到某一列为低电平,我们便可以确认当前被按下的键是那一行那一列。

这个实验最难的其实是在代码方面,首先要理清思路,知道代码需要几个部分,其次便是一些知识的补充,像行列扫描,以及消影,这些名词以及对实验原理的了解。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值