先找到原理图
K2——对应 GPX1_1
找到对应的
如led灯一样,设置输入
#define K2CON (volatile unsigned int *)0x11000c20
#define K2DAT (volatile unsigned int *)0x11000c24
//将gpx1_1设置为输入
*K2CON &= ~(0xf<<4);
但是按键有抖动
要按键消抖和松手检测
//如果返回0表示按键没有按下
//如果返回1表示案件按下了
int key_scan()
{
int flags=0;
//按键第一次按下
if(!(*K2DAT & (1<<1))){
delay_ms(50); //加延时
//第二次检测按键是否按下
if(!(*K2DAT & (1<<1))){
//松手检测
while(!(*K2DAT & (1<<1)));
flags=1;
}
}
return flags;
}
在主函数里面可以写这样:
int main()
{
int key_status = 0;
int led_status = 0;
//init all led
led_init();
key_init();
while(1){
key_status = key_scan();
if(key_status){
led_status = !led_status;
led_set_value(LED2,led_status);
}
}
return 0;
}
看K3按键——:
GPX1_2
#define K3CON (volatile unsigned int *)0x11000c20
#define K3DAT (volatile unsigned int *)0x11000c24
//将gpx1_2设置为输入
*K3CON &= ~(0XF<<8);
最后一个K4
GPX3_2:
K2控制led2代码:
#define LED2CON (volatile unsigned int *)0x11000c40
#define LED2DAT (volatile unsigned int *)0x11000c44
#define LED3CON (volatile unsigned int *)0x11000c20
#define LED3DAT (volatile unsigned int *)0x11000c24
#define LED4CON (volatile unsigned int *)0x114001e0
#define LED4DAT (volatile unsigned int *)0x114001e4
#define LED5CON (volatile unsigned int *)0x114001e0
#define LED5DAT (volatile unsigned int *)0x114001e4
#define K2CON (volatile unsigned int *)0x11000c20
#define K2DAT (volatile unsigned int *)0x11000c24
#define LED2 2
#define LED3 3
#define LED4 4
#define LED5 5
#define ON 1
#define OFF 0
void delay_ms(int z)
{
int x,y;
for(x=z;x>0;x--)
for(y=2500;y>0;y--);
}
void led_init()
{
//led2设置为输出
*LED2CON &= ~(0xf<<28);
*LED2CON |= (1<<28); //设置管脚为输出
//关闭led2
*LED2DAT &=~(1<<7); //关闭LED2
//led3设置为输出
*LED3CON &=~(0xf<<0);
*LED3CON |= (1<<0);
//关闭led3
*LED3DAT &=~(1<<0);
//led4设置为输出
*LED4CON &= ~(0xf<<16);
*LED4CON |= (1<<16);
//关闭led4
*LED4DAT &= ~(1<<4);
//led5设置为输出
*LED5CON &= ~(0xf<<20);
*LED5CON |= (1<<20);
//关闭led5
*LED5DAT &= ~(1<<5);
}
void led_set_value(int which,int status)
{
switch(which){
case LED2:status?(*LED2DAT|=(1<<7)):(*LED2DAT&=~(1<<7));
break;
case LED3:status?(*LED3DAT|=(1<<0)):(*LED3DAT&=~(1<<0));
break;
case LED4:status?(*LED4DAT|=(1<<4)):(*LED4DAT&=~(1<<4));
break;
case LED5:status?(*LED5DAT|=(1<<5)):(*LED5DAT&=~(1<<5));
break;
}
}
void led_set_blink(int which,int dms)
{
led_set_value(which,ON);
delay_ms(dms);
led_set_value(which,OFF);
delay_ms(dms);
}
void key_init()
{
//将gpx1_1设置为输入
*K2CON &= ~(0xf<<4);
}
//如果返回0表示按键没有按下
//如果返回1表示案件按下了
int key_scan()
{
int flags=0;
//按键第一次按下
if(!(*K2DAT & (1<<1))){
delay_ms(50); //加延时
//第二次检测按键是否按下
if(!(*K2DAT & (1<<1))){
//松手检测
while(!(*K2DAT & (1<<1)));
flags=1;
}
}
return flags;
}
int main()
{
int key_status = 0;
int led_status = 0;
//init all led
led_init();
key_init();
while(1){
key_status = key_scan();
if(key_status){
led_status = !led_status;
led_set_value(LED2,led_status);
}
}
return 0;
}