GPIO 按键控制LED
硬件上电后P0_26、P1_31引脚被3v电源拉高,按键KEY1、KEY2按下后引脚又被拉低。
以P0_26为例,其中 LPC_GPIO0的寄存器FIOPIN的第26bit状态值开机时为1,按键按下后又变为0.
#include "LPC17xx.h"
void delay(unsigned int i)
{
unsigned int n;
while(i>1)
{
for(n=655535; n>1; n--);
i--;
}
}
unsigned char key_scan(void)
{
unsigned int val;
unsigned char key,i;
key = 0;
val = LPC_GPIO0->FIOPIN;
if((val&1<<26)==0)
{
key+=1;
}
key=key<<1;
val = LPC_GPIO1->FIOPIN;
if((val&1<<31)==0)
{
key+=1;
}
switch(key)
{
case 0x00:
i=0;
break;
case 0x01:
i=1;
break;
case 0x02:
i=2;
break;
}
return i;
}
void key_init(void)
{
// key1 P0_26 key2 P1_31
LPC_GPIO0->FIODIR3 = 0x00; // P0_26 as input
LPC_GPIO1->FIODIR3 = 0x00; // P1_31 as input
}
void led_init(void)
{
LPC_GPIO2->FIODIR0 = 0x0f; //p2_0 p2_1 p2_2 p2_3 as output
LPC_GPIO2->FIOCLR0 = 0x0f; // 4 gpios output low
}
int main()
{
unsigned char val;
uint32_t i;
SystemInit();
key_init();
led_init();
while(1)
{
val= key_scan();
delay(1);
if(val == 0) //no key push down led off
LPC_GPIO2->FIOSET0 = 0x0f;
if(val ==1) // push key2 down led on
{
LPC_GPIO2->FIOCLR0 = 0x0f;
delay(200);
}
if(val == 2) //key1 push down leds flashing
{
for(i=0;i<4;i++)
{
LPC_GPIO2->FIOCLR = 1<<i;
delay(10);
}
LPC_GPIO2->FIOSET0 = 0x0f;
delay(10);
}
}
}