"); //-->
矩阵键盘的四行分别与P3.0-P3.3连接,四列分别与P3.4-P3.7连接。数码管为共阴极。静态数码管显示原理:这里就共阴极数码管显示原理进行讲解,一位数码管内一共有8个发光二极管,对共阴极来说其8个发光二极管的阴极在数码管内部全部接在一起,也就是“共阴”说法的来源,阳极是独立的,设计电路时一般把阴极接地,当我们从外部给任一个阳极加一个高电平时这个发光二极管就亮了,如果想要出一个8字,并且把右下角的小数点也点亮的话,那可以给8个阳极全总送高电平,想出几就给相对应的发光二极管送高电平,因此我们在显示数字的时候首先做的就是给0-9十个数字编好码,在要它亮什么数字的时候直接把这个编码送到它的阳极就行了。另外说一下,一般的数码管每一段亮至少需要10个毫安的电流,而单片机的IO口送不出如此大的电流,所以我们需要加数码管的驱动电路,可以用上拉电阻的方法,也可以使用专门的驱动芯片74HC573,它最大可以输出500毫安的电流,足够让数码管点亮了。
//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;
}
}
}
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。