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

Входы и опрос

В предыдущих главах мы в основном использовали выводы GPIO как выходы: включали и выключали светодиоды. Однако выводы GPIO можно настроить и как входы: тогда программа сможет считывать сигналы из внешнего мира, например нажатия кнопок или переключение тумблеров. В этой главе мы научимся считывать такие входные сигналы и делать с ними что-нибудь полезное.

Чтение состояния кнопок

На micro:bit v2 есть две физические кнопки, Button A и Button B, подключённые к выводам GPIO, настроенным как входы. Точнее, Button A подключена к выводу P0.14, а Button B — к выводу P0.23. (Это можно проверить по официальной таблице выводов.)

Чтение состояния входа GPIO сводится к проверке того, высокий ли уровень напряжения на выводе (3,3 В, логическая единица) или низкий (0 В, логический ноль). Каждая кнопка micro:bit подключена к выводу. Когда кнопка не нажата, вывод удерживается в высоком уровне; когда кнопка нажата, вывод удерживается в низком.

Теперь применим эти знания, чтобы считать состояние Button A: проверим, находится ли она в «низком» уровне (то есть нажата).

#![no_main]
#![no_std]

use cortex_m_rt::entry;
use embedded_hal::digital::InputPin;
use microbit::Board;
use panic_rtt_target as _;
use rtt_target::{rprintln, rtt_init_print};

#[entry]
fn main() -> ! {
    rtt_init_print!();
    let board = Board::take().unwrap();

    let mut button_a = board.buttons.button_a;
    let mut button_state = false;

    loop {
        if button_a.is_low().unwrap() {
            if !button_state {
                button_state = true;
                rprintln!("Button A pressed");
            }
        } else if button_state {
            button_state = false;
            rprintln!("Button A not pressed");
        }
    }
}

Мы в цикле смотрим на состояние кнопки и сообщаем каждый раз, когда оно меняется.