如何点亮一个灯?
点灯对初学者来说,应该是最基础的东西。简单来说,点亮一个灯光,就是控制高低电平,产生电势差,使有电流通过灯。
如何设置高低电平?
首先要学会看电路图,比如这样的一个电路:
这里我们要端口一个高电平,灯才会亮。
再看这个电路:
这里我们需要给它一个低电平才会亮。
两个对比一下,是不是能看到特点。端口一端接地了以后,另一端接高电平。端口如果接了高电平,那另一端你就给它接地。
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定时器的使用以及按键控制灯光。