В этом эксперименте мы создаем секундомер, который считает до 10.
p130_seven_segment_counter.ino
#define FIRST_SEGMENT_PIN 2#define SEGMENT_COUNT 7 // префикс «0b» означает, что целое число за ним записано в// в двоичном коде. Единицами мы обозначим номера сегментов// индикатора, которые должны быть включены для отображения// арабской цифры. Всего цифр 10, поэтому в массиве 10 чисел.// Нам достаточно всего байта (англ. byte, 8 бит) для хранения// комбинации сегментов для каждой из цифр.byte numberSegments[10] = { 0b01000000, 0b11110101, 0b10100010, 0b10100001, 0b10010101, 0b10001001, 0b10001000, 0b11100101, 0b10000000, 0b10000001}; void setup(){ for (int i = 0; i < SEGMENT_COUNT; ++i) pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);} void loop(){ // определяем число, которое собираемся отображать. Пусть им // будет номер текущей секунды, зацикленный на десятке int number = (millis() / 1000) % 10; // получаем код, в котором зашифрована арабская цифра int mask = numberSegments[number]; // для каждого из 7 сегментов индикатора... for (int i = 0; i < SEGMENT_COUNT; ++i) { // ...определяем: должен ли он быть включён. Для этого // считываем бит (англ. read bit), соответствующий текущему // сегменту «i». Истина — он установлен (1), ложь — нет (0) boolean enableSegment = bitRead(mask, i); // включаем/выключаем сегмент на основе полученного значения digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment); }}byte: каждый его элемент это 1 байт, 8 бит, может принимать значения от 0 до 255. mask мы помещаем тот элемент массива numberSegments, который соответствует текущей секунде, вычисленной в предыдущей инструкции.for мы пробегаем по всем сегментам, извлекая с помощью встроенной функции bitRead нужное состояние для текущего пина, в которое его и приводим с помощью digitalWrite и переменной enableSegmentbitRead(x, n) возвращает boolean значение: n-ный бит справа в байте x