原创 玩转GPIO之LPC2136中IOPIN的别样功能

2012-6-19 22:03 2533 15 15 分类: 消费电子

原创作品,转载请注明

作者:潇湘-,自动化大三(索漫科技linux驱动班学员)

一、目的

       在LPC2136下,研究IOPIN置高电平与IOSET置高电平的区别。

二、缘由

       在一系列实验时我发现,IOPIN寄存器在IODIR寄存器设置好方向后,也能实现输入和输出高低电平。和IOSET有所区别的是IOSET置高电平后要用IOCLR清除,而IOPIN只需要在变量赋值时重新覆盖即可。

三、实验过程

大家可以用小灯程序做个实验

在我的开发板中小灯的引脚如下图所示1.jpg

故做如下实验

用IOPIN寄存器时

#define LED1  1<<16

#define LED2  1<<17

#define LED3  1<<18

#define LED4  1<<19

/****************************************************************************

* 名称:initSystem()

* 功能:初始化IO

****************************************************************************/

void initSystem(void)

{

 

    IO1DIR = LED1|LED2|LED3|LED4;//设置方向 

    IO1SET = LED1|LED2|LED3|LED4 ;//高电平使灯灭

}     

 

 

/****************************************************************************

* 名称:main()

* 功能:初始化led,并实现led4闪烁的效果。

****************************************************************************/

int main(void)

{  

    initSystem();  

     while(1)

    {       

 

     IO1PIN = LED1|LED2|LED3  ;//123灯灭,4灯亮

       delay(40);

       IO1PIN = LED1|LED2|LED3|LED4 ;//1234灯全灭

      delay(40);  

  }  

    return 0;

}

       由此可见,用IOXPIN寄存器时发现LED4在闪烁,说明当把变量赋给IOXPIN寄存器时可以刷新

用IOSET寄存器时

int main(void)

{  

    initSystem();  

     while(1)

    {       

    IO1SET = LED1|LED2|LED3;

       delay(40);  

       IO1SET= LED1|LED2|LED3|LED4 ;

       delay(40);

  }  

    return 0;

}

发现LED4灯没有闪烁,说明IOXSET寄存器必须要IOCLR置一才能消去高电平。

 

下面请看数据手册中IOSET和IOCLR的解释

 

2.jpg

 

四、思考

        数据手册告诉了我们。但是我发现IOPIN寄存器不只个状态寄存器,它也有别样的功能。程序在一定程度上可以简化,原来程序中,IOSET和IOCLR需要一起作用,如今只需要IOPIN一个寄存器就能解决了。

2012年6月19日

                                             写于上海.松江

            
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
15
关闭 站长推荐上一条 /3 下一条