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

来源:互联网 发布:intellij idea python 编辑:程序博客网 时间:2024/06/06 18:07
 /*行线接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);
     }
     
   }
}