第8课 点亮第一个LED灯

Posted Liu_Farrell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第8课 点亮第一个LED灯相关的知识,希望对你有一定的参考价值。

8.1 点亮LED

硬件连接图,

 

由硬件图可知,当175引脚GPIO[0]输出为0时,LED点亮,当GPIO[0]输出为1时,LED就熄灭,GPIO寄存器的基地址为0x8000d000,下图为用到的几个寄存器的偏移地址

 

首先,选中GPIO引脚,

*((unsigned short *)(0x8000d000+0x00)) = 0x5555;

*((unsigned short *)(0x8000d000+0x04)) = 0x5555;

然后,GPIO[0]作为输出,其余的引脚置为输入。

*((unsigned short *)(0x8000d000+0x08)) = 0xfffe;

读取当前GPIO的状态,避免在后续操作中改变GPIO的状态,导致其他的问题,

unsigned short val;

val = *((unsigned short *)(0x8000d000+0x10));

最后,在输出寄存器里,将GPIO[0]置为0,具体为将GPIO当前的状态和0xfffe相与,就会将GPIO[0]置为0了,而其他引脚保持不变。并将改变后的值写入GPIO输出寄存器。

*((unsigned short *)(0x8000d000+0x0c)) = (val&0xfffe);

如果要熄灭LED,只需将最后一句换为:

*((unsigned short *)(0x8000d000+0x0c)) = (val|0x0001);

点亮LED的完整程序如下:

 

给该程序编写一个Makefile文件,可以借用第二课的hello程序的Makefile文件,修改一下,

 

接下来下载到开发板运行一下,

 

 

8.2 按键控制LED的亮灭

由硬件图可知,当按键按下的时候,GPIO[1]引脚的状态为1,当按键松开的时候,GPIO[1]引脚的状态为0,通过读取GPIO[1]引脚的状态就可以知道按键是否按下,通过一个while大循环,不断检测按键的状态。如果按键被按下,就改变一次当前led的状态。具体程序如下:

#include <stdio.h>

 

void GPIO_Init(void);

void led_on(unsigned short val);

void led_off(unsigned short val);

 

void main()

{

      

       unsigned short val;

       unsigned short flag=0;

       GPIO_Init();

      

       while(1)

       {

              val= *((unsigned short *)(0x8000d000+0x10));

              if( (val & 0x02) == 0x02 )

              {

                     if(flag==0)

                     {

                            led_on(val);

                            flag=1;

                     }

                     else

                     {

                            led_off(val);

                            flag=0;

                     }                          

              }

             

       }

 

}

 

void GPIO_Init(void)

{

       *((unsigned short *)(0x8000d000+0x00)) = 0x5555;

       *((unsigned short *)(0x8000d000+0x04)) = 0x5555;

       *((unsigned short *)(0x8000d000+0x08)) = 0xfffe;  

}

 

void led_on(unsigned short val)

{

       *((unsigned short *)(0x8000d000+0x0c)) = (val&0xfffe);

}

 

void led_off(unsigned short val)

{

       *((unsigned short *)(0x8000d000+0x0c)) = (val|0x0001);

}

8.3 总结

这一课主要是编程的内容,问题不难,一般都是嵌入式入门的第一个程序——点亮发光二极管,通过这一课,对操作寄存器来控制引脚的状态大体有了一些理解。同时也学到了一些嵌入式c语言和标准c语言之间的差异。

以上是关于第8课 点亮第一个LED灯的主要内容,如果未能解决你的问题,请参考以下文章

《树莓派项目实战》

用C语言编写,单片机控制LED灯并用定时器延时,每隔一秒使LED依次点亮,8 个灯

使用Keil4新建一个51单片机工程,将第一个LED灯点亮。

2016.12.12 点亮第一个LED灯

Linux下点亮第一个LED灯

BlinkLED 点亮第一个LED灯