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


 
					
				
 
			
			
			
						
			 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

