您的位置:首页 > 其它

矩阵键盘——线反转法控制

2012-09-14 20:26 176 查看
 /*行线接P1.0-P1.3,列线接P1.4-P1.7。

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

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

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint  unsigned int

sbit P27=P2^7; //数码管最右端一位亮

sbit fmq=P3^6;     //蜂鸣器

uchar  key;

unsigned char code disp_code[]={

              0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

              0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};       //存放显示16位数字和“-”对应的十六进制数位

unsigned char code key_code[]={

              0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,

              0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};            //存放16个矩阵键盘按键的对应值

void delay1ms(uint i)

{

uchar j;

 while(i--)

 {

 for(j=0;j<115;j++)      //1ms基准延时程序

 {

  ;

 }

 

 

 }

 

}

void delay500us()

{

unsigned char j;

 for(j=0;j<57;j++)      //500us基准延时程序

 {

  ;

 }

}

 void beep()    //产生1KHZ频率声音的函数

{

     fmq=0;

    delay500us();

    fmq=1;

    delay500us();    

}

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

键盘扫描子函数

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

uchar  keyscan()

{

   uchar  scan1,scan2,keycode,j;      //scan1:行接线值,scan2:列接线值

   P1=0xf0;

   scan1=P1;

     delay1ms(20);                   //延时20ms

     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; //P1口写1 输入状态

   return (16);//"-"

}

main()

{

       uchar tt;

   P0 = 0xbf;

   P27 =0;            //数码管显示"-"

    P1 = 0xff;

   while(1)

   {

     P1=0xf0;

     if((P1&0xf0)!=0xf0){

     keyscan();

     P0=disp_code[key];

     for(tt=0;tt<200;tt++)

     {

     beep();

    

     }

     fmq=1;

     delay1ms(300);

     }

     

   }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delay x86