原创 逐行扫描法5*5矩阵按键程序

2008-4-17 16:35 3771 8 8 分类: MCU/ 嵌入式

/*
逐行扫描法5*5矩阵按键程序
行:P2.16~20
列:P2.25,P2.28~31
LPC2214
*/


#include "config.h"


#define Fosc            14745600                    //晶振频率
#define Fcclk           (Fosc * 4)                  //系统频率

#define RowOutput()  IO2DIR |= 0x001f0000
#define RowOutL()   IO2CLR |= 0x001f0000
#define ColInput()  IO2DIR &= 0x0dffffff


uint8 ScanPress(void)
{
 uint32 Press = IO2PIN;
 
 if((~Press)&0xf2000000)
   return (1);
 else
   return (0);
}


void PortInit( void )
{
 PINSEL0 = ( 0x1455 << 16 ) | ( 0x0005 )  ;  // 设置P0.0--P0.15引脚功能
 IO0DIR = ( 0x41 << 24 ) | ( 0xa8 << 16 ) | ( 0x80 << 8 ) | ( 0x65 )  ;  // 设置P0引脚方向
 PINSEL1 = ( 0x0540 << 16 ) | ( 0x0400 )  ;                             // 设置P0.16--P0.31引脚功能
 PINSEL2 = ( 0xf << 24 ) | ( 0x81 << 16 ) | ( 0x69 << 8 ) | ( 0x14 )  ;  // 设置P1-P2-P3引脚功能
 IO1DIR = ( 0x01 << 24 ) | ( 0xe6 << 16 ) | ( 0x00 << 8 ) | ( 0x00 ) ;  // 设置P1引脚方向
 IO2DIR = ( 0xf8 << 24 ) | ( 0x00 << 16 ) | ( 0x00 << 8 ) | ( 0x00 )  ;  // 设置P2引脚方向
 IO3DIR = ( 0x00 << 24 ) | ( 0x00 << 16 ) | ( 0x00 << 8 ) | ( 0x00 )  ;  // 设置P3引脚方向
}



void Delay_uS( uint32 us ) //以uS为延时单位
{
 uint32 CLK = ( Fcclk / 1000000 ) * us / 2 ;


 while ( CLK-- ) ; 
}



int main(void)
{
 uint16 kcol,krow,kvalue;


 PortInit();
 
  ColInput(); //输入
 RowOutput();
 RowOutL();
 
 while(1)
 {
  if(ScanPress())
  {
   Delay_uS(300);
   if(ScanPress())
   {
     for(i=0;i<5;i++)
     {
      ko = (~(0x01<      IO2SET |= (ko<<16);
      IO2CLR |= ((0x01<      ki = ((uint16)((~IO2PIN)>>16))&0xf200;
      if(ki) break; //if(ScanPress())
     }
     if(i<5)
     {
      kvalue1 = ki|i;
      if(kvalue1 != kvalue0)
      {
       SCom(0x15,0x01,kvalue1);//串行发送键值
       kvalue0 = kvalue1; 
      }
     }
     else
     {
      kvalue1 = 0;
     }
    }
    RowOutL();
   }
 }
 return 0;
}


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条