/*
逐行扫描法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;
}
文章评论(0条评论)
登录后参与讨论