码迷,mamicode.com
首页 > 其他好文 > 详细

第8课 点亮第一个LED灯

时间:2018-10-23 15:41:23      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:style   src   按键   info   lse   .com   [1]   大循环   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灯

标签:style   src   按键   info   lse   .com   [1]   大循环   led灯   

原文地址:https://www.cnblogs.com/LiuFarrell/p/9836798.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!