標(biāo)題: 按鍵按下去 有個(gè)什么信號 MCU怎么知道的 [打印本頁]

作者: jiely20131023    時(shí)間: 2013-10-24 16:15
標(biāo)題: 按鍵按下去 有個(gè)什么信號 MCU怎么知道的
2013-10-24 14:41 上傳
下載附件 (94.58 KB)




可切換1X4按鍵和4X4按鍵在AT89S52上的原理圖


//1X4按鍵程序

#include "reg51.h"
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char      //定義unsigned char 為 uchar
#define uint  unsigned int

#define keyport  P3                              //lcd忙檢測標(biāo)志
#define disport  P0
uchar key,temp;
uchar code dis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};
sbit f1=P3^0;
sbit f2=P3^1;
sbit f3=P3^2;
sbit f4=P3^3;

/***************一微秒延時(shí)子程序******************/
void delayus(uint delay){
while(delay--);
}
/***************一毫秒延時(shí)子程序******************/
void delayms(uint delay){
while(delay--)
  delayus(149);
}

void main()
{
P2=0x04;
if(!f1)
disport=dis[1];
if(!f2)
disport=dis[2];
if(!f3)
disport=dis[3];
if(!f4)
disport=dis[4];

}

//4X4按鍵程序


#include "reg51.h"
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char      //定義unsigned char 為 uchar
#define uint  unsigned int

#define keyport  P3                              //lcd忙檢測標(biāo)志
#define disport  P0
uchar key,temp;
uchar code dis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};

/***************一微秒延時(shí)子程序******************/
void delayus(uint delay){
while(delay--);
}
/***************一毫秒延時(shí)子程序******************/
void delayms(uint delay){
while(delay--)
  delayus(100);
}
/******************************************************/
uchar getkey()
{

  keyport=0xef;                                //掃描第三列
temp=keyport;
if(temp!=0xef)
{delayms(10);
  temp=keyport;
   if(temp!=0xef)
  while((keyport&0x0F)!=0x0F) ;
switch(temp)
   {
    case 0xee: key=0;break;
    case 0xed: key=1;break;
    case 0xeb: key=2;break;
    case 0xe7: key=3;break;
    }
         return key;        //返回鍵值
}


keyport=0xdf;                               //掃描第一列
temp=keyport;
if(temp!=0xdf)
{delayms(10);
  temp=keyport;     
   if(temp!=0xdf)
   while((keyport&0x0f)!=0x0f) ;  


switch(temp)
   {
    case 0xde: key=4;break;
    case 0xdd: key=5;break;
    case 0xdb: key=6;break;
    case 0xd7: key=7;break;
   
           }
         return key;         //返回鍵值
}


  keyport=0xbf;                               //掃描第二列
temp=keyport;
if(temp!=0xbf)
{delayms(10);
  temp=keyport;
   if(temp!=0xbf)
   while((keyport&0x0F)!=0x0F) ;   
switch(temp)
   {
    case 0xbe: key=8;break;
    case 0xbd: key=9;break;
    case 0xbb: key=10;break;
    case 0xb7: key=11;break;
    }
  return key;         //返回鍵值

  }


  keyport=0x7f;                                //掃描第三列
temp=keyport;
if(temp!=0x7f)
{delayms(10);
  temp=keyport;
   if(temp!=0x7f)
   while((keyport&0x0F)!=0x0F) ;
switch(temp)
   {
    case 0x7e: key=12;break;
    case 0x7d: key=13;break;
    case 0x7b: key=14;break;
    case 0x77: key=15;break;
    }
         return key;        //返回鍵值
}

  }

void main()
{
EA = 0;
while(1)
{
disport=dis[getkey()] ;
P2=0x04;
}
}






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1