一.实验目的、内容、仪器
实验目的:
了解并区分独立按键,矩阵按键,以及其它模块的按键。
编写键盘的相关算法,了解相关概念
实验内容:进行独立按键以及矩阵按键的测试实验
实验仪器: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中的电路
六.结果及讨论
行/列扫描:检测时,先送一行为低电平,其余几列全为高电平,然后立即轮流监测一次各列是否有低电平,若检测到某一列为低电平,我们便可以确认当前被按下的键是那一行那一列。
这个实验最难的其实是在代码方面,首先要理清思路,知道代码需要几个部分,其次便是一些知识的补充,像行列扫描,以及消影,这些名词以及对实验原理的了解。