73 lines
1.8 KiB
C
73 lines
1.8 KiB
C
|
#include "pico/stdlib.h"
|
||
|
#include "hardware/gpio.h"
|
||
|
#include "hardware/pwm.h"
|
||
|
|
||
|
#define STEPS 50
|
||
|
#define ANIMATION_DELAY 1
|
||
|
|
||
|
// AAA
|
||
|
// F B
|
||
|
// GGG
|
||
|
// E C
|
||
|
// DDD o (DP)
|
||
|
|
||
|
// order: A B C D E F G DP
|
||
|
const uint8_t LED_PINS[] = {15, 14, 16, 19, 18, 12, 13, 17};
|
||
|
|
||
|
// I probably could make each pattern byte
|
||
|
const bool DIGITS[12][8] = {
|
||
|
{1, 1, 1, 1, 1, 1, 0, 1}, // 0
|
||
|
{0, 1, 1, 0, 0, 0, 0, 1}, // 1
|
||
|
{1, 1, 0, 1, 1, 0, 1, 1}, // 2
|
||
|
{1, 1, 1, 1, 0, 0, 1, 1}, // 3
|
||
|
{0, 1, 1, 0, 0, 1, 1, 1}, // 4
|
||
|
{1, 0, 1, 1, 0, 1, 1, 1}, // 5
|
||
|
{1, 0, 1, 1, 1, 1, 1, 1}, // 6
|
||
|
{1, 1, 1, 0, 0, 0, 0, 1}, // 7
|
||
|
{1, 1, 1, 1, 1, 1, 1, 1}, // 8
|
||
|
{1, 1, 1, 1, 0, 1, 1, 1}, // 9
|
||
|
{0, 0, 0, 0, 0, 0, 1, 0}, // -
|
||
|
{0, 0, 0, 0, 0, 0, 0, 1}, // .
|
||
|
};
|
||
|
|
||
|
void initialize_display() {
|
||
|
for (int i=0; i<8; i++) {
|
||
|
//gpio_init(LED_PINS[i]);
|
||
|
//gpio_set_dir(LED_PINS[i], GPIO_OUT);
|
||
|
//gpio_put(LED_PINS[i], true);
|
||
|
gpio_set_function(LED_PINS[i], GPIO_FUNC_PWM);
|
||
|
pwm_set_gpio_level(LED_PINS[i], STEPS);
|
||
|
|
||
|
uint8_t slice_num = pwm_gpio_to_slice_num(LED_PINS[i]);
|
||
|
pwm_set_wrap(slice_num, STEPS);
|
||
|
pwm_set_enabled(slice_num, true);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void display_digit(int digit) {
|
||
|
for (int i=0; i<8; i++) {
|
||
|
pwm_set_gpio_level(LED_PINS[i], DIGITS[digit][i] ? 0 : STEPS);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void display_animate(int from, int to) {
|
||
|
int delta[9];
|
||
|
for (int i=0; i<8; i++) {
|
||
|
delta[i] = DIGITS[to][i] - DIGITS[from][i];
|
||
|
}
|
||
|
|
||
|
for (int step=0; step<=STEPS; step++) {
|
||
|
|
||
|
for (int i=0; i<8; i++) {
|
||
|
if (delta[i] == 0) continue;
|
||
|
if (delta[i] == 1) {
|
||
|
pwm_set_gpio_level(LED_PINS[i], STEPS-step);
|
||
|
}
|
||
|
if (delta[i] == -1) {
|
||
|
pwm_set_gpio_level(LED_PINS[i], step);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sleep_ms(ANIMATION_DELAY);
|
||
|
}
|
||
|
}
|