当我第一眼看到这个板子和模块的时候,我就对这些吩咐的外设有所感悟,结合着基础任务的要求,直接可以将LED和按键进行一个联动,再次之前我们先实现已在呼吸灯的操作,因为在后续的功能实现用不到呼吸灯的效果指示。
有人要问了不应该先点灯吗?实际上对于本次的工程来说,这些操作都属于基本操作,所以我们先实现哪个并不重要,学习用的工程里面实际上对这些都已经进行了基础配置,我们主要学习一下用法。
呼吸灯是对板载LED的操作,并不是每一个脚都能配置为PWM:
GPIO25引脚是可以配置为PWM的。
呼吸灯实际上是定时器的PWM功能,通过不断修改占空比来实现无级变换的效果,我们看一下初始化的配置:
gpio_set_function(PICO_LED_PIN, GPIO_FUNC_PWM); led_slice_num = pwm_gpio_to_slice_num(PICO_LED_PIN); pwm_set_wrap(led_slice_num, 1000); pwm_set_chan_level(led_slice_num, PWM_CHAN_B, 1); pwm_set_clkdiv(led_slice_num,50); pwm_set_enabled(led_slice_num, true);
这里主要看一下你想设置怎么样的频率,后面主要就是对占空比的修改,使用pwm_set_chan_level(led_slice_num, PWM_CHAN_B, Value);注意Value的范围为0~1000。呼吸灯实际上就是0~1000~0这样的循环效果,我们暂定呼吸频率为2s,一呼一吸的时间间隔为2s。
DEV_Delay_ms(1); pwm_cnt++; if(pwm_cnt <=1000) LED_SET_PWM(pwm_cnt); else if(pwm_cnt > 1000 && pwm_cnt <=2000) LED_SET_PWM(2000-pwm_cnt); else pwm_cnt = 0;
效果参见成果视频的呼吸灯展示部分。
接下来我们就实现LED和按键的联动,这里主要实现的还是基础功能的学习,后续我们玩游戏还是需要用到按键的这里我们先体验一下案件的操作,为了方便观察,我们所有的按键都同时控制RGB-G的翻转。
我们先看一下按键都有哪些:
板载的BootSET按键,这个按键在程序运行的时候可以是一个用户按键,未上电的时候可以是个调试按键:
模块上面有4个按键:
再看一下控制的RGB-G,实际上对应的就是GP7:
基本上的硬件都了解清楚了,接下来我们看一下相关的软件操作,注意,工程中对应的引脚是不匹配的要改过来:
#define PIN_DIRECTION_KEY_A 12 #define PIN_DIRECTION_KEY_B 13 #define PIN_DIRECTION_KEY_X 14 #define PIN_DIRECTION_KEY_Y 15 #define PICO_LED_PIN 25 #define PICO_DIRECTION_R_PIN 6 #define PICO_DIRECTION_G_PIN 7 #define PICO_DIRECTION_B_PIN 8
不管现在用不用,先给LED和对应的KEY进行初始化:
void LED_init(){ gpio_init(PICO_LED_PIN); gpio_set_dir(PICO_LED_PIN, GPIO_OUT); gpio_init(PICO_DIRECTION_R_PIN); gpio_set_dir(PICO_DIRECTION_R_PIN, GPIO_OUT); gpio_init(PICO_DIRECTION_G_PIN); gpio_set_dir(PICO_DIRECTION_G_PIN, GPIO_OUT); gpio_init(PICO_DIRECTION_B_PIN); gpio_set_dir(PICO_DIRECTION_B_PIN, GPIO_OUT); LED_OFF(); RGB_OFF(PICO_DIRECTION_R_PIN); RGB_OFF(PICO_DIRECTION_G_PIN); RGB_OFF(PICO_DIRECTION_B_PIN); } void key_init(){ gpio_init (PIN_DIRECTION_KEY_A); gpio_set_dir(PIN_DIRECTION_KEY_A, GPIO_IN); gpio_set_pulls(PIN_DIRECTION_KEY_A,1, 0); gpio_init (PIN_DIRECTION_KEY_B); gpio_set_dir(PIN_DIRECTION_KEY_B, GPIO_IN); gpio_set_pulls(PIN_DIRECTION_KEY_B,1, 0); gpio_init (PIN_DIRECTION_KEY_X); gpio_set_dir(PIN_DIRECTION_KEY_X, GPIO_IN); gpio_set_pulls(PIN_DIRECTION_KEY_X,1, 0); gpio_init (PIN_DIRECTION_KEY_Y); gpio_set_dir(PIN_DIRECTION_KEY_Y, GPIO_IN); gpio_set_pulls(PIN_DIRECTION_KEY_Y,1, 0); }
然后就是按键和LED的联动了,四个按键控制RGB-G的翻转:
if(get_key(PIN_DIRECTION_KEY_A) == 1 || get_key(PIN_DIRECTION_KEY_B) == 1 || get_key(PIN_DIRECTION_KEY_X) == 1 || get_key(PIN_DIRECTION_KEY_Y) == 1){ LED_Toggle(PICO_DIRECTION_G_PIN); }
效果参见成果视频LED与按键联动部分。