LPC2368的GPIO可以配置为low speed 和high speed 两种模式,PORT0,PORT1默认为low speed模式,PORT2,PORT3, PORT4只能工作在high speed模式。特别要注意的是在外围器件的时序要求比较严格的情况下对IO口的操作,最好不要用对IOXSET,IOXCLR中的对应位置一的模式,因为对IOXSET,IOXCLR操作,写入的值不会立即反映在芯片的管脚上,这种情况下最好直接对IOXPIN直接写入。
如:
FIO2PIN0 = 0x80;
即可立即改变P2.7的状态。
LPC2368 GPIO的另一个优点是操作比较灵活,一个32BIT的积存器可以按 double word(32位), Word(16位), Byte(8位)的方式来操作。
下面的程序是我用FAST GPIO 来做按键扫描的例子
系统中有四个按键,每个按键可以有Single Click单击, Double click双击, LongTime Click长击,三种属性。并且用一个8bit的整型来表示按键的返回值。Bit4—Bit7表示按键代码,
Bit0—Bit3表示按键的属性。
按键编码如下:
#define K1_Click 0x11
#define K1_DoubleClick 0x12
#define K1_LongTimeClick 0x13
#define K2_Click 0x21
#define K2_DoubleClick 0x22
#define K2_LongTimeClick 0x23
#define K3_Click 0x41
#define K3_DoubleClick 0x42
#define K3_LongTimeClick 0x43
#define K4_Click 0x41
#define K4_DoubleClick 0x42
#define K4_LongTimeClick 0x43
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
按键扫描程序如下:
INT8U KeyScan(void)
{
OS_CPU_SR cpu_sr;
INT8U encode = 0;
INT32U osclk;
if(K1==0 || <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />K2==0 || K3==0 || K4==0)
{
OSTimeDly(20); //avoid the Key stroke skew
if(K1==0)
encode |= KEY1_Encode;
if(K2==0)
encode |= KEY2_Encode;
if(K3==0)
encode |= KEY3_Encode;
if(K4==0)
encode |= KEY4_Encode;
if(GetKey(encode)==1)
return NoKey;
else // key is still pressed
{
OS_ENTER_CRITICAL();
osclk = OSTime;
OS_EXIT_CRITICAL();
while(GetKey(encode)==0) //wait for KEY Released
{
OSTimeDly(10);
OS_ENTER_CRITICAL();
if(OSTime-osclk>=3000) // if the Key is LongTime click
encode |= LongTime_Click;
OS_EXIT_CRITICAL();
}
if((encode & 0x0f)==LongTime_Click)
return encode;
else
{
OS_ENTER_CRITICAL();
osclk = OSTime;
OS_EXIT_CRITICAL();
while(GetKey(encode)==1)
{
OSTimeDly(10);
OS_ENTER_CRITICAL();
if(OSTime-osclk>300) //if key doesn't response in 300mS
encode |= Single_Click; //key will be judge as Single Click
OS_EXIT_CRITICAL();
if((encode & 0x0F)==Single_Click)
break;
}
if((encode & 0x0F)==Single_Click)
return encode;
else
{
while(GetKey(encode)==0)
OSTimeDly(10);
return encode | Double_Click; //key response in 300mS will be judge
//as Double Click event
}
}
}
}
else
{
OSTimeDly(20);
return NoKey;
}
}
用户413815 2009-12-29 14:06
用户586647 2009-10-9 14:52
用户4861 2009-5-30 10:18
用户175098 2009-4-9 16:58
用户175098 2009-4-6 21:31
用户1364249 2009-3-3 21:46
用户1328398 2008-6-14 09:27