Секундомер до 10
Автор: Max09 • Октябрь 6, 2019 • Лабораторная работа • 279 Слов (2 Страниц) • 416 Просмотры
13. СЕКУНДОМЕР
Создаем секундомер, который считает до 10.
ПРИНЦИПИАЛЬНАЯ СХЕМА
[pic 1]
СКЕТЧ
#define FIRST_SEGMENT_PIN 2
#define SEGMENT_COUNT 7
byte numberSegments[10] =
{
0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110,
}; //префикс «0b» означает, что целое число за ним записано в двоичном коде. Единицами мы обозначим номера сегментов индикатора, которые должны быть включены для отображения арабской цифрой. Всего цифр 10, поэтому в массиве 10 чисел. Нам достаточно всего 1 байта = 8 бит для хранения комбинации сегментов для каждой из цифр
void setup()
{
for (int i = 0; i < 7; ++i)
pinMode(i + 2, OUTPUT);
}
void loop()
{
int number = (millis() / 1000) % 10; //определяем число, которое собираемся отображать. Пусть им будет номер текущей секунды, зацикленный на десятке
int mask = numberSegments[number]; //получаем код, в котором зашифрована арабская цифра
for (int i = 0; i < 7; ++i) //для каждого из 7 сегментов индикатора...
{
boolean enableSegment = bitRead(mask, i); //...определяем: должен ли он быть включён. Для этого считываем бит, соответствующий текущему сегменту «i». Истина — он установлен (1), ложь — нет (0)
digitalWrite(i + 2, enableSegment); //включаем/выключаем сегмент на основе полученного значения
}
}
ПОЯСНЕНИЯ К КОДУ
- Мы создали массив типа byte: каждый его элемент это 1 байт, который может принимать значения от 0 до 255.
- Символы арабских цифр закодированы состоянием пинов, которые соединены с выводами соответствующих сегментов: 0, если сегмент должен быть выключен, и 1, если включен.
- В переменную mask мы помещаем тот элемент массива numberSegments, который соответствует текущей секунде, вычисленной в предыдущей инструкции.
- В цикле for мы пробегаем по всем сегментам, извлекая с помощью встроенной функции bitRead нужное состояние для текущего пина, в которое его и приводим с помощью digitalWrite и переменной enableSegment.
- bitRead(x, i) возвращает boolean значение: i-ый бит справа в байте x.
...