矩阵键盘检测
---------------------------------------------------------------------------------
[实验要求]
依次按下4*4矩阵键盘上从第1到第20个键,同时在六位数码管上依次显示0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
说明:本实验板上数码管为共阴极。
静态数码管显示原理:这里就共阴极数码管显示原理进行讲解,一位数码管内一共有8个发光二极管,对共阴极来说其8个发光二极管的阴极在数码管内部全部接在一起,也就是“共阴”说法的来源,阳极是独立的,设计电路时一般把阴极接地,当我们从外部给任一个阳极加一个高电平时这个发光二极管就亮了,如果想要出一个8字,并且把右下角的小数点也点亮的话,那可以给8个阳极全总送高电平,想出几就给相对应的发光二极管送高电平,因此我们在显示数字的时候首先做的就是给0-9十个数字编好码,在要它亮什么数字的时候直接把这个编码送到它的阳极就行了。另外说一下,一般的数码管每一段亮至少需要10个毫安的电流,而单片机的IO口送不出如此大的电流,所以我们需要加数码管的驱动电路,可以用上拉电阻的方法,也可以使用专门的驱动芯片,本实验板使用的74HC573,它最大可以输出500毫安的电流,足够让数码管点亮了。
本实验板上的六位数码管上相同段(段指a,b,c,d,e,f,g,h)全部是接在一起的,其中每一个位(阴极)是独立的,所以在做静态显示的时候所有的数码管只能显示相同的数字,当然你可以控制显示几位,如果你让它们静态不同的数字那就得给每一个数码管加一套驱动电路了。但这样做是没有必要的,后面我们会讲到关于数码管动态显示原理。
下面给出本实验板共阴极数码管数字编码
矩阵键盘的四行分别与P3.0-P3.3连接,四列分别与P3.4-P3.7连接。
[实验目的]
学会矩阵键盘的检测,掌握数码管静态显示原理。
[硬件电路]
键盘电路见3
[源代码]
//4*4键盘检测程序,按下键后相应的代码显示在数码管上
#include<reg51.h>
sbit beep=P2^3; //蜂鸣器接口
sbit dula=P2^6; //控制数码管段选的锁存器锁存端
sbit wela=P2^7; //控制数码管位选的锁存器锁存端
unsigned char i=100;
unsigned char j,k,temp,key;
void delay(unsigned char i) //可自定义延时长短的延时函数
{ //当i=10时大约为10毫秒
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
unsigned char code
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; // 0-F编码
display(unsigned char num) //
显示子函数
{
P0=table[num]; //将第num个显示编码送P0口
dula=1; //一个下降沿将数据锁存
dula=0;
P0=0xc0; //位选通全部的数码管
wela=1; //一个下降沿将数据锁存
wela=0;
}
void main()
{
dula=0; //使两个锁存器不可直通
wela=0;
while(1) //进入检测总循环
{
P3=0xfe; //给P3.0送低电平,其余为高电平
temp=P3; //把P3口数据读回来
temp=temp&0xf0; //把P3口与11110000相与
if(temp!=0xf0) //如果有键按下刚一定不相等,于是进入//下一步检测
{
delay(10); //延时去抖动
if(temp!=0xf0) //再次判断是否有键按下
{
temp=P3; //判断为有,再次读P3口数据
switch(temp) //因为我们刚才是将第一行置的低
{ //在这里再判断是第几列
case 0xee: //如果temp=0xee则为第一行和第一列
key=0; //的交叉点,由此我们知道是矩阵键盘
break; //上的第一个键被按下,我们给key=0。
case 0xde: //以后依此类推
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0) //这段程序是检测按键是否被释放
{
temp=P3; //如果没有释放就一直等待并且
temp=temp&0xf0;
beep=0; //蜂鸣器一直响
}
beep=1; //释放后关闭蜂鸣器
display(key); //显示按下相应键值的数据
P1=0xfe; //将第一个发光二极管点亮(我写
} //程序的时候测试用的)
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xfc;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xf8;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xf0;
}
}
}
|