|   Войти

Подключение 7-сегментного дисплея к Arduino. Часть 2.

В прошлой статье было показано, как подключить 7-сегментный дисплей к контроллеру Arduino, а также была продемонстрирована программа, которая последовательно выводит числа от 0 до 9 на дисплей с помощью функции show. Как вы увидели, эта функция оказалась очень громоздкой, а код слишком длинным. Рассмотрим, как можно упростить программу.

Каждый сегмент имеет всего два состояния: включен или выключен, поэтому для хранения информации о его состоянии требуется всего один бит. Всего есть 7 сегментов и одна точка, значит для хранения информации о выводимой цифре нужно 8 бит памяти. Поскольку 8 бит - это 1 байт, для хранения информации о цифре потребуется 1 байт памяти. Каждый бит в байте будет отвечать за свой сегмент. Для хранения, например, цифры 3, конфигурация бит в байте будет следующей:

Чтобы записать двоичное число в Arduino IDE используется префикс «0b». Таким образом двоичное число, содержащее конфигурацию бит для вывода на дисплей цифры 3, будет записано, как 0b01001111.

Поскольку цифр 10, нам нужны 10 конфигураций для каждой цифры. Удобно эти конфигурации записать в массив из 10 элементов. Подробнее о массивах можно прочитать ЗДЕСЬ. Создадим и определим такой массив. Назовем его bm:

byte bm[10] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00100111, 0b01111111, 0b01101111};

В этом массиве элемент с индексом 0 соответствует цифре 0, элемент с индексом 1 - цифре 1 и т.д. до 9.

Чтобы прочитать нужный бит из числа, отвечающего за конфигурацию для требуемой цифры, нам понадобится функция bitRead(). Синтаксис этой функции следующий:

bitRead(x, n)

где x - переменная с которой нужно считать бит, а n - номер бита в этой переменной.

Таким образом, для того, чтобы определить включен ли сегмент A, например для цифры 3, мы должны взять элемент массива bm с индексом 3 и прочитать из нее бит №0 (самый правый бит, младший бит) bitRead(bm[3], 0), для сегмента B - бит №1 bitRead(bm[3], 1), С - бит №2 bitRead(bm[3], 2) и т.д. Самый старший 8-й бит (бит №7) отвечает за точку.

Изменим программу из предыдущего урока. Она приобретет следующий вид:

Как видим, количество строк кода в функции show уменьшилось в 100 раз (было 100, стало 1), но работает она точно так же. В этой единственной строке мы пробегаем с помощью переменной i по всем 8 битам элемента массива bm (от 0 до 7) и на ножку, номер которой на 4 больше, чем номер бита (мы подключили дисплей к ножкам с номерами, начинающимися с 4), подаем значение, которое выдает функция bitRead - 0 или 1. В результате, сегмент либо загорается, либо нет - в зависимости от конфигурации, записанной в данном элементе массива.