这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【墨水屏电子书】Let'sDo第2期任务+过程贴+按键检测并亮灯

共8条 1/1 1 跳转至

【墨水屏电子书】Let'sDo第2期任务+过程贴+按键检测并亮灯

助工
2024-07-24 00:03:20     打赏

前言

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

硬件接线

   硬件上,墨水屏上有4个按键,分别为SWA,SWB,SWC,RESET。对应接线如下:

1.jpg

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

2.jpg

 因此软件需要做如下配置:

管脚功能说明
RUN(RESET)暂且认为是reset看芯片介绍,该脚定义为RUN,具体功能需查芯片手册才清楚
GPIO12(SWA)输入上拉按键A
GPIO13(SWB)输入上拉按键B
GPIO14(SWC)输入上拉按键C
GPIO25(Green LED)PWM 或 GPIO输出复杂点可做成呼吸灯效果,简单的可以做成亮灭效果。当作为GPIO输出时,高电平亮,低电平灭
代码修改

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上的绿灯亮,松开按键,绿灯灭。

未按下:

1.jpg

KeyA按下:

2.jpg

KeyB按下:

3.jpg

KeyC按下:

4.jpg







关键词: 墨水     电子书          过程     按键     亮灯    

专家
2024-07-24 08:09:40     打赏
2楼

不错啊


专家
2024-07-24 08:11:48     打赏
3楼

谢谢分享


高工
2024-07-24 08:56:59     打赏
4楼

一看就知道你是高手


专家
2024-07-24 09:53:58     打赏
5楼

使用的是哪款IDE?


高工
2024-07-24 11:15:37     打赏
6楼

谢谢分享


院士
2024-07-24 18:50:21     打赏
7楼

您这速度也太快了吧!


专家
2024-07-31 08:58:03     打赏
8楼

祝贺!加油!


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]