Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

LED-рулетка

Ну что ж, давайте построим «настоящее» приложение. Цель — получить вот такой дисплей с бегущими огоньками:

Работать с выводами светодиодов по отдельности довольно утомительно (особенно если, как здесь, нужны почти все), поэтому можно воспользоваться BSP-крейтом microbit-v2, о котором говорили ранее, и работать со светодиодным «дисплеем» MB2. Это выглядит так (examples/light-it-all.rs):

#![no_main]
#![no_std]

use cortex_m_rt::entry;
use embedded_hal::delay::DelayNs;
use microbit::{board::Board, display::blocking::Display, hal::Timer};
use panic_rtt_target as _;
use rtt_target::rtt_init_print;

#[entry]
fn main() -> ! {
    rtt_init_print!();

    let board = Board::take().unwrap();
    let mut timer = Timer::new(board.TIMER0);
    let mut display = Display::new(board.display_pins);
    let light_it_all = [
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1],
    ];

    loop {
        // Показываем light_it_all 1000 мс
        display.show(&mut timer, light_it_all, 1000);
        // снова очищаем дисплей
        display.clear();
        timer.delay_ms(1000_u32);
    }
}

Массив Rust light_it_all из примера содержит 1 там, где светодиод горит, и 0 там, где он выключен. Вызов show() принимает таймер, который код дисплея BSP использует для задержек, копию массива и время в миллисекундах, в течение которого показывается этот узор, прежде чем функция вернёт управление.