前言
之前自己找到了PICO_Templte的工程,虽然能编译过,但是发现只要修改代码,便编译报错(提示修改的位置重定义,被重定义的部分属于库中的实现),只能暂时搁置。而官方资料开放后,发现开放的资料中的基础工程并不会出现之前出现的问题,可以使用。因此先从最简单的任务按键点灯入手,先把按键检测和LED亮灭功能实现。
硬件接线
硬件上,墨水屏上有4个按键,分别为SWA,SWB,SWC,RESET。对应接线如下:

pico板卡上有一个灯,其电路如下:

因此软件需要做如下配置:
main.c
static void system_init(void) {
extern void SystemCoreClockUpdate();
SystemCoreClockUpdate();
}
int main(void) {
char key = 0x00, key_new;
system_init();
LED_init();
key_init();
// main_EPD_test();
while (true) {
key_new = get_key();
if (key == key_new) {
continue;
}
key = key_new;
if (key) {
LED_ON();
} else {
LED_OFF();
}
}
return 0;
}my_key.c
由于GPIO硬件上并未接电容做硬件消抖,因此需考虑做软件消抖。软件消抖逻辑,其实很简单,检测到电平变化后,延时一段时间再去读,发现电平未发生新的变化,便可认为按键有效(若要严格,则持续检测管脚电平,发现电平变化后维持一段时间未变化,则认为按键状态平稳)。
#include "my_key.h"
#include "my_led.h" // for MY_DEV_Delay_ms()
void key_init() {
gpio_init(INKY_KEYA_PIN);
gpio_set_dir(INKY_KEYA_PIN, GPIO_IN);
gpio_set_pulls(INKY_KEYA_PIN, 1, 0);
gpio_init(INKY_KEYB_PIN);
gpio_set_dir(INKY_KEYB_PIN, GPIO_IN);
gpio_set_pulls(INKY_KEYB_PIN, 1, 0);
gpio_init(INKY_KEYC_PIN);
gpio_set_dir(INKY_KEYC_PIN, GPIO_IN);
gpio_set_pulls(INKY_KEYC_PIN, 1, 0);
}
char get_key() {
char key = 0x00, key1 = 0x00;
if (gpio_get(INKY_KEYA_PIN) == 0) {
key |= KEYA_MASK;
}
if (gpio_get(INKY_KEYB_PIN) == 0) {
key |= KEYB_MASK;
}
if (gpio_get(INKY_KEYC_PIN) == 0) {
key |= KEYC_MASK;
}
if (key) {
MY_DEV_Delay_ms(20); // delay for jillter
if (gpio_get(INKY_KEYA_PIN) == 0) {
key1 |= KEYA_MASK;
}
if (gpio_get(INKY_KEYB_PIN) == 0) {
key1 |= KEYB_MASK;
}
if (gpio_get(INKY_KEYC_PIN) == 0) {
key1 |= KEYC_MASK;
}
if (key1 == key) {
return key;
}
}
return 0x00;
}my_led.c#include "my_led.h"
#define USE_PWM 1
#if USE_PWM
uint my_slice_num;
void my_pwm_init() {
// PWM Config
gpio_set_function(PICO_LED_PIN, GPIO_FUNC_PWM);
my_slice_num = pwm_gpio_to_slice_num(PICO_LED_PIN);
pwm_set_wrap(my_slice_num, 1000);
pwm_set_chan_level(my_slice_num, PWM_CHAN_B, 1);
pwm_set_clkdiv(my_slice_num, 50);
pwm_set_enabled(my_slice_num, true);
}
void my_SET_PWM(uint16_t Value) {
if (Value < 0 || Value > 1000) {
// printf("DEV_SET_PWM Error \r\n");
} else {
pwm_set_chan_level(my_slice_num, PWM_CHAN_B, Value);
}
}
#endif
void LED_init() {
#if USE_PWM
my_pwm_init();
#else
gpio_init(PICO_LED_PIN);
gpio_set_dir(PICO_LED_PIN, GPIO_OUT);
#endif
}
void LED_ON() {
#if USE_PWM
my_SET_PWM(1000);
#else
gpio_put(PICO_LED_PIN, 1);
#endif
}
void LED_OFF() {
#if USE_PWM
my_SET_PWM(0);
#else
gpio_put(PICO_LED_PIN, 0);
#endif
}效果验证
当KeyA,KeyB,KeyC中有任意键按下时,pico上的绿灯亮,松开按键,绿灯灭。
未按下:

KeyA按下:

KeyB按下:

KeyC按下:

我要赚赏金
