基础练习:利用nordic工程点灯

如何点亮一个灯?

点灯对初学者来说,应该是最基础的东西。简单来说,点亮一个灯光,就是控制高低电平,产生电势差,使有电流通过灯。

如何设置高低电平?

首先要学会看电路图,比如这样的一个电路:
在这里插入图片描述
这里我们要端口一个高电平,灯才会亮。
再看这个电路:
在这里插入图片描述
这里我们需要给它一个低电平才会亮。
两个对比一下,是不是能看到特点。端口一端接地了以后,另一端接高电平。端口如果接了高电平,那另一端你就给它接地。
ok,原理清楚了,那么程序上如何实现?

如何编写程序控制灯的电平?

简单来说,就是
1 找到对应的端口;
2 端口的配置初始化
3 给端口写入不同的电平形成通路;

先找到需要配置的端口,这个要看电路图来找:如上图,我们要控制的,10,17,18,这三个端口`


#define BOARD_LED1                        17
#define BOARD_LED2                       18   
#define LED                              10

接着初始化,配置这些管脚为输出

void LED_INIT(void)
{
	nrf_gpio_cfg_output(BOARD_LED2);
	nrf_gpio_cfg_output(BOARD_LED1);
	
	nrf_gpio_cfg_output(LED);
		
	
}

再接着写入电平

void led_on(void)
{

LED_INIT();
	nrf_gpio_pin_write(BOARD_LED2, 1);
	nrf_gpio_pin_write(BOARD_LED1, 1);
	nrf_gpio_pin_write(LED, 0);

}

ok,下面直接在主函数调用led_on(),就可以直接开灯了;
在这里插入图片描述

如何让灯交替闪烁?

简单来说可以通过延时函数,

void DELAY_mS(int delaytime)    						// 延时1ms
{
	int i,j;
	
	for(i=0;i<delaytime;i++)
		for(j=0;j<2400;j++);
}


void led_on(void)
{

	LED_INIT();
	nrf_gpio_pin_write(BOARD_LED2, 1);
	nrf_gpio_pin_write(BOARD_LED1, 1);
	nrf_gpio_pin_write(LED, 0);
	DELAY_mS(500;
	nrf_gpio_pin_write(BOARD_LED2, 0);
	nrf_gpio_pin_write(BOARD_LED1, 0);
	nrf_gpio_pin_write(LED, 1);
	DELAY_mS(500;
}

但是从单片机的资源使用角度,我们不推荐延时函数,而是更加优选定时器。

定时器与延时函数

它们两个的区别?
延时函数在执行过程中,单片机一直在循环之中,这期间不做其他的事,一直在这里停留,直至延时结束,这样的话就比较浪费资源。
而定时器定时的时候,单片机任然运行,定时器也在计数,定时时间到了之后,才产生中断,进而执行中断任务。
这次点亮设备的所有灯光

#ifndef _TEST_H_
#define _TEST_H_

#define BOARD_LED1                    17
#define BOARD_LED2                    18
#define LED10                         15
#define LED9                          16   
#define LED                            10
#define TESTon_PERIOD           APP_TIMER_TICKS(500)              //定时时间0.5S,结束后开灯
#define TESToff_PERIOD           APP_TIMER_TICKS(3000)              //定时时间3S,结束后关灯

void Createled_ontimer(void);
void Startled_ontimer(void);

void Createled_offtimer(void);
void Startled_offtimer(void);

void All_led_on(void);
void All_led_off(void);

#endif
#include "app_timer.h"
#include "nrf_log.h"
#include "nrf_gpio.h"
#include "user_test.h"
//#include "board_gpo.h"


//创建定时器
APP_TIMER_DEF(led_on);
APP_TIMER_DEF(led_off);


static void timer_led_onCallback(void *arg);
static void timer_led_offCallback(void *arg);
	
void LED_INIT(void)
{
	nrf_gpio_cfg_output(BOARD_LED2);
	nrf_gpio_cfg_output(BOARD_LED1);
	nrf_gpio_cfg_output(LED9);
	nrf_gpio_cfg_output(LED10);
	nrf_gpio_cfg_output(LED);
	
}


//LED_ON定时器
static void timer_led_onCallback(void *arg)
{
	UNUSED_PARAMETER(arg);
	
	NRF_LOG_INFO("on");
	LED_INIT();
	nrf_gpio_pin_write(BOARD_LED2, 1);
	nrf_gpio_pin_write(BOARD_LED1, 1);
	nrf_gpio_pin_write(LED9, 1);
	nrf_gpio_pin_write(LED10, 1);
	nrf_gpio_pin_write(LED, 0);
	
Startled_offtimer();

}
void Createled_ontimer(void)
{
	NRF_LOG_INFO("create");

	app_timer_create(&led_on,APP_TIMER_MODE_SINGLE_SHOT,timer_led_onCallback);

}
void Startled_ontimer(void)
{
	 NRF_LOG_INFO("start");
	
	app_timer_start(led_on,TESTon_PERIOD,NULL);

}
//LED_OFF定时器
static void timer_led_offCallback(void *arg)
{
	UNUSED_PARAMETER(arg);
	
	NRF_LOG_INFO("off");
	LED_INIT();
	nrf_gpio_pin_write(BOARD_LED2, 0);
	nrf_gpio_pin_write(BOARD_LED1, 0);
	nrf_gpio_pin_write(LED9, 0);
	nrf_gpio_pin_write(LED10, 0);
	nrf_gpio_pin_write(LED, 1);
	
	Startled_ontimer();


}
void Createled_offtimer(void)
{
	NRF_LOG_INFO("create");

	app_timer_create(&led_off,APP_TIMER_MODE_SINGLE_SHOT,timer_led_offCallback);

}
void Startled_offtimer(void)
{
	 NRF_LOG_INFO("start");
	
	app_timer_start(led_off,TESToff_PERIOD,NULL);

}
void All_led_on(void)
{

	nrf_gpio_pin_write(BOARD_LED2, 1);
	nrf_gpio_pin_write(BOARD_LED1, 1);
	nrf_gpio_pin_write(LED9, 1);
	nrf_gpio_pin_write(LED10, 1);
	nrf_gpio_pin_write(LED, 0);


}
void All_led_off(void)
{

	nrf_gpio_pin_write(BOARD_LED2, 0);
	nrf_gpio_pin_write(BOARD_LED1, 0);
	nrf_gpio_pin_write(LED9, 0);
	nrf_gpio_pin_write(LED10, 0);
	nrf_gpio_pin_write(LED, 1);
}



下一节讲一下nordic定时器的使用以及按键控制灯光。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值