В этом эксперименте мы выводим на семисегментный индикатор количество нажатий на кнопку (единицы).
p140_seven_segment_clicker.ino
#define DATA_PIN 13 // пин данных (англ. data)
#define LATCH_PIN 12 // пин строба (англ. latch)
#define CLOCK_PIN 11 // пин такта (англ. clock)
#define BUTTON_PIN 10
int clicks = 0;
boolean buttonWasUp = true;
byte segments[10] = {
0b01000000, 0b11110101, 0b10100010, 0b10100001, 0b10010101,
0b10001001, 0b10001000, 0b11100101, 0b10000000, 0b10000001
};
void setup()
{
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
// считаем клики кнопки, как уже делали это раньше
if (buttonWasUp && !digitalRead(BUTTON_PIN)) {
delay(10);
if (!digitalRead(BUTTON_PIN))
clicks = (clicks + 1) % 10;
}
buttonWasUp = digitalRead(BUTTON_PIN);
// для записи в 74HC595 нужно притянуть пин строба к земле
digitalWrite(LATCH_PIN, LOW);
// задвигаем (англ. shift out) байт-маску бит за битом,
// начиная с младшего (англ. Least Significant Bit first)
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[clicks]);
// чтобы переданный байт отразился на выходах Qx, нужно
// подать на пин строба высокий сигнал
digitalWrite(LATCH_PIN, HIGH);
}
LOW
на latch pin (вход STcp микросхемы), затем передать данные, а затем отправить HIGH
на latch pin, после чего на соответствующих выходах 74HC595 появится переданная комбинация высоких и низких уровней сигнала.shiftOut(dataPin, clockPin, bitOrder, value)
. Функция ничего не возвращает, а в качестве параметров ей нужно сообщить LSBFIRST
(least significant bit first) — начиная с младшего, или MSBFIRST
(most significant bit first) — начиная со старшего,shiftOut()
и как управлять порядком их передачи?shiftOut()
отправлять биты, начиная со старшего, и измените код так, чтобы счетчик по-прежнему показывал арабские цифры.