按键的操作位置在于GPGCON,且应设置为00输入模式。
从GPGDAT中就检测状态为就能知道按键有没有按下
以下代码:
/***********************************************
Copyright (C), 2015-2016, xmetc Tech. Co., Ltd.
File name : led.c
Author : hjd
version : V1.0
Date : 2015-8-15
Description : led 模块的功能函数的实现
History :
1 Date 2015-8-15
Author hjd
Modification Init vision
*************************************************/
#include "key.h"
#include "2440addr.h"
/***********************************************
Function name : key_init
Description : 按键初始化
Input parameter : none
Return : none
Others : none
*************************************************/
void key_init( void)
{
volatile unsigned temp;
//GPGCON
temp =rGPGCON;
temp &= ~((0x3<<22)|(0x3<<14)|(0x3<<12)|(0x3<<10)|(0x3<<6)|(0x3));
rGPGCON = temp;
//GPGUP
temp =rGPGUP;
temp |= ((1<<11)|(1<<7)|(1<<6)|(1<<5)|(1<<3)|(1));
rGPGUP = temp;
}
/***********************************************
Function name : key_init
Description : 按键初始化
Input parameter : none
Return : none
Others : none
*************************************************/
int key_scan( void)
{
volatile unsigned temp;
temp = ~rGPGDAT;
temp &= (1<<11)|(1<<7)|(1<<6)|(1<<5)|(1<<3)|(1);
switch( temp)
{
case 1:
{
return KEY_1;
break;
}
case 1<<3:
{
return KEY_2;
break;
}
case 1<<5:
{
return KEY_3;
break;
}
case 1<<6:
{
return KEY_4;
break;
}
case 1<<7:
{
return KEY_5;
break;
}
case 1<<11:
{
return KEY_6;
break;
}
default:
return KEY_N;
break;
}
return KEY_N;;
}
/***********************************************
Function name : get_keyvalue
Description : 确认按键是否按下
Input parameter : none
Return : none
Others : none
*************************************************/
int get_keyvalue(void)
{
volatile unsigned temp;
unsigned int key = KEY_N;
if( key_scan() != KEY_N)
{
Delay_MS( 10);
if( key_scan() != KEY_N)
{
key = key_scan();
while( key_scan() != KEY_N);//防重复
}
}
return key;
}