新闻  |   论坛  |   博客  |   在线研讨会
4*4键盘测试程序
szyth | 2008-08-15 10:56:25    阅读:2108   发布文章

矩阵键盘的四行分别与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;

      }

    }

  }

}

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客