查看文章 |
矩阵键盘的四行分别与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; } } } }
|
本文引用通告地址:http://szyth.spaces.eepw.com.cn/articles/trackback/item/33112