前言
之前自己找到了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按下: