В этом примере, мы рассмотрим вывод форматированной даты на семисегментный дисплей, на базе драйвера MAX7219(далее просто - дисплей MAX7219).

        Текущую дату мы конечно же будем считывать из модуля DS1302, и выводить на дисплей в формате День-Месяц-Год. Итак, если вы уже ознакомились с предыдущими шагами по подключению и работе с модулем DS1302, а также ознакомились с функционалом библиотек iarduino_RTC.h и LedControl.h, то можно двигаться далее, загружайте нижеследующий скетч в плату Arduino. Если возникли какие то сомнения - то можете предварительно ознакомиться с предшествующими шагами:

       Листинг скетча. Вывод форматированной даты на дисплей MAX7219.

/*Подключаем библиотеки*/
#include "LedControl.h"
#include "iarduino_RTC.h"

/*Дисплей MAX7219*/
/*Константы для пинов подключения*/
#define DATA_IN 13
#define CLK 12
#define LOAD_CS 11

#define NUM_DEV 1
#define DISP_ADDR 0

/*Часовой модуль DS1302*/
/*Константы для пинов подключения*/
#define RTC_DAT 8
#define RTC_CLK 7
#define RTC_RST 6
/*
  Подключение дисплея MAX7219 производим в
  соответствии с нижеследующей таблицей
  Arduino [Pin 13] -> Max7219 [DataIn]
  Arduino [Pin 12] -> Max7219 [CLK]
  Arduino [Pin 11] -> Max7219 [LOAD]

  Далее, ниже создаём объект Display класса LedControl
  с указанием пинов подключения, константа NUM_DEV говорит
  о том сколько устройств будет подключено каскадом по шине SPI
  в данном случае - всего одно, это дисплей MAX7219
*/
LedControl Display = LedControl(DATA_IN, CLK, LOAD_CS, NUM_DEV);

/*
  Создаём объект time класса iarduino_RTC
  с указанием пинов подключения
*/
iarduino_RTC time(RTC_DS1302, RTC_RST, RTC_CLK, RTC_DAT);

/*Строка выводимая на дисплей*/
byte StrMessage[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
/*Массив закодированных цифр от 0 до 9*/
byte Digits[10] = {0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B, 0x5F, 0x70, 0x7F, 0x7B};

void setup()
{
  /*Выводим дисплей из спящего режима*/
  Display.shutdown(DISP_ADDR, false);
  /*Устанавливаем яркость свечения сегментов*/
  /*Доступные значения от 0 до 15*/
  Display.setIntensity(DISP_ADDR, 8);
  /*Очищаем дисплей*/
  Display.clearDisplay(DISP_ADDR);
  /*Выводим значение даты на дисплей*/
  getDate();
}

void loop()
{
  //Здесь пример использования фукции setRow()
  //Display.setRow(DISP_ADDR, 2, Digits[5] ^ 0x80);
  //Здесь пример использования фукции setDigit()
  //Display.setRow(DISP_ADDR, 2, 5, true);
}

/*Получаем дату из модуля DS1302*/
void getDate()
{
  /*Инициализация модуля DS1302*/
  /*и, получение значений даты/времени*/
  time.begin();
  /*Единицы лет*/
  StrMessage[0] = Digits[time.year % 10];
  /*Десятки лет*/
  StrMessage[1] = Digits[time.year / 10];
  /*Далее просто отрисовка цифры 20*/
  StrMessage[2] = Digits[0];
  StrMessage[3] = Digits[2];
  /*Единицы месяцев*/
  StrMessage[4] = Digits[time.month % 10] ^ 0x80;
  /*Десятки месяцев*/
  StrMessage[5] = Digits[time.month / 10];
  /*Единицы дней*/
  StrMessage[6] = Digits[time.day % 10] ^ 0x80;
  /*Десятки дней*/
  StrMessage[7] = Digits[time.day / 10];

  /*Отрисовать массив StrMessage на дисплей*/
  for(int Rank = 0; Rank < 8; Rank ++)
    Display.setRow(DISP_ADDR, Rank, StrMessage[Rank]);
}

 

        Вот так в общем то выглядит отображение форматированной даты на дисплее MAX7219. Формат даты, как уже было сказано, выводится в последовательности День-Месяц-Год, через зажигание десятичной точки.

        Очень кстати, будет разъяснить, как происходит зажигание десятичной точки при использовании функции setRow(). В статье подключение дисплея на базе драйвера MAX7219, был приведен пример вывода цифр на дисплей при помощи функции setDigit(), там же было сказано как зажечь десятичную точку в выбранном знакоместе дисплея. Немного повторим это описание:

 

Display.setDigit(Disp_Addr, Rank, Digit, Point);

где:

  • Disp_Addr - Адрес устройства на шине SPI(В нашем случае равен 0)
  • Rank - выбранное знакоместо, в котором будет выведена цифра
  • Digit - цифра, которую надо вывести на дисплей
  • Point - если этот аргумент равен false - то гасим точку, если true - то зажигаем

 

        Теперь пример использования функции setRow(), чтобы вывести предварительно закодированный символ или цифру с зажиганием десятичной точки нужно применить операцию логического умножения ( ^ 0x80 ) на код этой цифры(или символа), как это выглядит:

 

Display.setRow(Disp_Addr, Rank, Symb ^ 0x80) //Выводим символ или цифру и зажигаем точку

либо

Display.setRow(Disp_Addr, Rank, Symb) //Выводим символ или цифру без зажигания точки

где :

  • Disp_Addr - Адрес устройства на шине SPI(В нашем случае равен 0)
  • Rank - выбранное знакоместо, в котором будет выведен символ
  • Symb - предварительно закодированный символ, либо цифра

 

        Примеры зажигания десятичной точки при помощи функции setDigit() и setRow(), как это выглядит на дисплее:

 

 

        Как видите, две функции с различающимся функционалом дадут нам одинаковый результат. Но всё же, в дальнейшей работе, для отрисовки значений на дисплее MAX7219 мы будем использовать функцию setRow(). На этом этапе с выводом даты мы разобрались, далее нас ждет не менее интересный шаг - вывод текущего времени на дисплей MAX7219. Также, мы познакомимся с возможностями библиотеки TimerOne.h, в дальнейшем мы будем применять её очень активно.