原创 4×4矩阵键盘键值数码管显示(查表)

2008-10-23 20:19 2753 6 6 分类: MCU/ 嵌入式

点击看大图

行线接P1.4-P1.7,列线接P1.0-P1.3。

*************************************************************************

功能:

根据扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。

开机时,数码管显示“-”。

当键按下时,数码管显示按下键的键值,蜂鸣器响一声。

*************************************************************************

         
********************************************************************
*                                                                  *
* 功能:                                                           *
* 根据扫描键盘返回的键值编码查键值编码表,从而得到键值送数码管显示 *
* 开机时,数码管显示“-”。                                       *
* 当键按下时,数码管显示按下键的键值,蜂鸣器响一声。               *
*                                                                  *
*******************************************************************/



以下为回复后可浏览的内容:

#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

sbit BEEP = P3^7;                  //蜂鸣器驱动线

uchar  key;

unsigned char code disp_code[]={
              0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
              0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};

unsigned char code key_code[]={
              0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,
              0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77 };

/**********************************************************

  延时子函数

**********************************************************/
void delayms(uint ms)
{
   uchar t;
   while(ms--)
   {
     for(t = 0; t < 120; t++);
   }
}

/**********************************************************

  x*0.14MS 延时子函数

**********************************************************/
void delay0(uchar x)    
{
   uchar i;
   while(x--)
   {
     for (i = 0; i<13; i++) {;}
   }
}

/**********************************************************

  蜂鸣器驱动子函数

**********************************************************/
void beep()
{
  uchar i;
  for (i=0;i<180;i++)
  {
    delay0(5);
    BEEP=!BEEP;       //BEEP取反
  }
   BEEP="1";            //关闭蜂鸣器
   delayms(250);      //延时    
}

/**********************************************************

键盘扫描子函数

**********************************************************/
uchar  keyscan()
{
   uchar  scan1,scan2,keycode,j;

   P1=0xf0;
   scan1=P1;
   if((scan1&0xf0)!=0xf0)           //判键是否按下
   {
     delayms(30);                   //延时30ms
     scan1=P1;
     if((scan1&0xf0)!=0xf0)         //二次判键是否按下
     {
        P1=0x0f;
        scan2=P1;
        keycode=scan1|scan2;         //组合成键编码

        for(j=0;j<=15;j++)
        {
           if(keycode== key_code[j])  //查表得键值
           {
              key=j;
              return(key);
           }
        }
     }
   }
   else  P1=0xff;

   return (16);
}

/**********************************************************

  判键是否按下子函数

**********************************************************/
void  keydown()
{  
   P1=0x0f;
   if((P1&0x0f)!=0x0f)
   {
     keyscan();
     P0=disp_code[key];
     beep();
   }
}

/**********************************************************

主函数

**********************************************************/
main()
{
   P0 = 0xbf;
   P2 = 0x7f;            //数码管显示"-"
    P1 = 0xff;

   while(1)
   {
     keydown();    
   }
}

/*********************************************************/
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条