專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

C51單片機(jī)的3*3矩陣鍵盤程序

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2013年11月02日   【字體:

#include <reg51.h>
#include<dis.h>
/**延時1**/    //用于消抖
void delay1(void)
{uchar i;
 for(i=0;i<200;i++);
 }

/****延時2**********/
 void delay2(void)
{
  uchar i,j,s;
  for(i=250;i>0;i--)
  for(j=250;j>0;j--)
  for(s=5;s>0;s--);
}
/****串口初使化****/
void chuankou_init(void)
{
 TMOD=0X20;   //定時器1,方式2,8位計數(shù)器   
 SCON=0x40;   //方式1,而不允許接收
 PCON=0X00;   //波特率不翻倍 
 TH1=0xf4;         //11.0592晶振,somd=0,波特率9600,初值=0xfa.應(yīng)用sst89E564,已經(jīng)倍頻
 TL1=0xf4;
 TR1=1;         //啟動定時器1
}
/**鍵盤掃描函數(shù)**/
uchar keyscan(void)
{
  uchar code_h;     //行掃描值
  uchar code_l;     //列掃描值
  P1=0xf8;      //P1.0-P1.2發(fā)全0,P1.3-P1.5發(fā)1,準(zhǔn)備讀列狀態(tài)
  if((P1&0Xf8)!=0Xf8)  //如果P1.3-P1.5不全為1,可能有鍵按下
   {
    delay1();    //消抖
 if((P1&0xf8)!=0xf8)   //重讀列位,若還是不全為1,定有鍵按下
  {
   code_h=0xfe;   //P1.0為0。開始行掃描
   while((code_h&0x08)!=0x00)   //判斷是否為最后一行,若不是,繼續(xù)掃描
    {
     P1=code_h;       //P1口輸出行掃描值
  if((P1&0Xf8)!=0Xf8)     //如果P1.3-P1.5不全為1,該行有鍵按下
   {
    code_l=((P1&0xf8)|0x07);    //保留P3-p5位,低3位為1,作為列值
    return((~code_h)+(~code_l)); //鍵編碼=行掃描值+列掃描值,返回主程序
    }
   else         //該行無鍵按下,行掃描值左移,掃描下一行
  code_h=((code_h<<1)|0x01);
  }
   }
 }
   return(0);      //無鍵按下,反回0

 }
 /**主函數(shù)**/
 void main(void)
{
 uchar key;
 chuankou_init();      //串口初使化
 while(1)
  {
   key=keyscan();      //調(diào)用鍵盤掃描函數(shù),返回的鍵值送變量key
   switch(key)
     {  
   case 0x0a:SBUF=0X00;delay2();break;  
      case 0x11:SBUF=0x05;delay2();break;
      case 0x12:SBUF=0x04;delay2();break;
      case 0x14:SBUF=0x03;delay2();break;
      case 0x22:SBUF=0x01;delay2();break;
      case 0x24:SBUF=0x02;delay2();break;
      case 0x21:SBUF=0x06;delay2();break;
   case 0x0c:break;
   case 0x05:break;
     
      default:break;
     }
   }
}     

關(guān)閉窗口

相關(guān)文章