原创 LPC2368网络板DIY——FastGPIO 调试记录(四)

2008-6-13 18:31 4623 7 9 分类: MCU/ 嵌入式

LPC2368GPIO可以配置为low speed high speed 两种模式,PORT0PORT1默认为low speed模式,PORT2,PORT3, PORT4只能工作在high speed模式。特别要注意的是在外围器件的时序要求比较严格的情况下对IO口的操作,最好不要用对IOXSETIOXCLR中的对应位置一的模式,因为对IOXSETIOXCLR操作,写入的值不会立即反映在芯片的管脚上,这种情况下最好直接对IOXPIN直接写入。


如:


          FIO2PIN0 = 0x80;


即可立即改变P2.7的状态。


LPC2368 GPIO的另一个优点是操作比较灵活,一个32BIT的积存器可以按 double word(32), Word16位), Byte8位)的方式来操作。


下面的程序是我用FAST GPIO 来做按键扫描的例子


系统中有四个按键,每个按键可以有Single Click单击, Double click双击, LongTime Click长击,三种属性。并且用一个8bit的整型来表示按键的返回值。Bit4Bit7表示按键代码,


Bit0Bit3表示按键的属性。


按键编码如下:


                     #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;


  }


}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户413815 2009-12-29 14:06

你好! 我的2478的P0和P1用作普通IO口可以操作,但P0.1.2.3.4用作FastIO时全不好使,程序如下: PINSEL2 &= 0x00000000; PINSEL3 &= 0x00000000; FIO1DIR |= 0xFFFFFFFF; while (1) { FIO1MASK = 0x00000000; FIO1PIN = 0x00000000; FIO1MASK = 0xFFFFFFFF; delayMs(0,200); FIO1PIN = 0xFFFFFFFF; FIO1MASK = 0xFFFFFFFF; delayMs(0,200); } 望指点!多谢

用户586647 2009-10-9 14:52

谢谢楼主分享哈!

用户4861 2009-5-30 10:18

谢谢楼主分享

用户175098 2009-4-9 16:58

学习一下,多谢分享。PID程序PWM输出的要改成继电器输出的程序要怎样改?PID计算出来的值应该怎样来控制继电器。

用户175098 2009-4-6 21:31

学习一下,多谢分享

用户1364249 2009-3-3 21:46

学习看看,说不定有帮助

用户1328398 2008-6-14 09:27

博主真是能人啊~羡慕,什么时候我要能达到这样的水平就好了
相关推荐阅读
用户97533 2008-06-20 18:34
还有几块空板,想送给有意用LPC2368的网友,交个朋友
还有几块空板,想送给有意用LPC2368的网友,交个朋友,优先考虑南京的朋友, 因为本人现在南京, 让俺们共同努力, 一齐进步! ...
用户97533 2008-06-14 10:07
上传已调试好的源程序,原理图
上传源程序和板子原理图请点击下载。原理图是POWERLOIGC格式的。...
用户97533 2008-06-13 19:01
LPC2368网络板DIY——RTC 调试记录(七)
       RTC的使用,首先要设置RTC的时钟源,2368可以有两种方式,1 使用PLL 分频得到32.768K的时钟,2 直接用外部32.768的晶体,不知NXP为何搞这两种方式,个人认为可能是...
用户97533 2008-06-13 18:51
LPC2368网络板DIY——CSTN 调试记录(六)
        CSTN屏的大小是 162X132,6.5K色,我用的是8位并行的传输模式,点亮一个点需要两个发送周期。先送高字节,再送低字节。在调试的时候发现,图片的颜色老是不对,CSTN的驱动时序...
用户97533 2008-06-13 18:43
LPC2368网络板DIY——I2C PCF8574 调试记录(五)
调试完了FAST GPIO,开始进入I2C接口调试,主要实现对PCF8574的控制,整个程序是个状态机,I2C 中断服务程序根据不同的状态确定下一步要做的事情。首先确定8574的地址,由于原理图上我接...
EE直播间
更多
我要评论
2
7
关闭 站长推荐上一条 /3 下一条