Контроллер ICP DAS i-7188XAD позволяет отображать необходимую информацию двумя способами: можно моргать светодиодом, что весьма кстати, когда необходимо отобразить, например, прием или передачу данных, а также имеется возможность индикации  при помощи дисплея из пяти сегментов.

Если в случае со светодиодом разработчики сделали все, что могли:

  • LedOn(); //включить светодиод;
  • LedOff(); //выключить светодиод;
  • LedToggle(); // Переключить состояние светодиода;

то в отношении дисплея можно немного упростить себе жизнь, так как для отображения данных используется всего несколько функций:

  • Show5DigitLed(int pos, int data); // Отобразить число в сегменте
  • Show5DigitLedWithDot(int pos, int data); // Отобразить число с точкой в сегменте
  • Show5DigitLedSeg(int pos, unsigned char data); // Отобразить свой символ в сегменте

причем все они позволяют отобразить символ только в одном сегменте, что не дает возможности отображать двузначные и более числа без доработок. Из интересного имеется также управление яркостью дисплея функцией Set5DigitLedIntensity(int mode), где mode - яркость в пределах от 1 до 15. Весь функционал доступен в документе MiniOS7 API Functions Reference Manual.

Предлагаемая доработка создает объект "экран", позволяет вводить числа от 1 до 5 знаков, начиная с необходимой позиции, добавлять свои символы, управлять точкой каждого сегмента, не изменяя данные в нем. При необходимости, можно расширить функционал класса без особого труда. Используется класс CString из одной из предыдущих статей.

Класс CLedSegment отвечает за хранение данных в одном сегменте, и для хранения каждого сегмента числа необходимо хранить числа в формате, подходящем для Show5DigitLedSeg():

unsigned char DIGITS[]=
    {
        0x7E,0x30,0x6D,0x79,
        0x33,0x5B,0x5F,0x70,
        0x7F,0x7B,0x77,0x1F,
        0x4E,0x3D,0x4F,0x47,
    };

 Плюс добавим немного своих символов:

enum SYMBOLS
    {
        SYMBOL_NULL=0x0, // Сегмент будет выключен
        SYMBOL_POINT=0x80, // Точка в углу сегмента
        SYMBOL_LINE=0x1, //  Линия/минус/дефис
        SYMBOL_P=0x67 // Латинская буква P
    };

Пустой сегмент определен также как 0x10, а минус как 0x11. При необходимости символы добавляются в массив DIGITS[]. Класс CLedScreen хранит все пять сегментов, позволяя обращаться к каждому в отдельности через методы. Конструктор класса содержит метод, инициализирующий дисплей:

CLedScreen()
       {
             Init5DigitLed(); // Инициализация дисплея
             ClearScreen();
       }

Если Вы хотите инициализировать дисплей в другом месте, эту строку следует перенести в это место. Методы Update() и Update(unsigned char pos) обновляют состояние либо всех сегментов, либо одного. До использования метода Update() изменения данных не отображаются на экране.

Пример: вывод аргумента main(int argc, char** argv):

#include "LEDSCR.H"

int main(int argc, char** argv)
{
    CLedScreen scr; //Инициализация в конструкторе
    CString s(argv[1]);
    scr.ShowDigit(s, 6-s.GetLenght());// Выравнивание по правому краю
    scr.Update();
    while(TRUE){/*работа*/};
    return 0;
}

Следующий фрагмент кода отображает или не отображает точку первого сегмента дисплея в зависимости от наличия сигнала на первом дискретном входе контроллера:

int main(int argc, char** argv)
{
    CLedScreen scr;
    
    while(TRUE)
    {
        int di_state=GetDi1();
        if(di_state)
            scr.GetSegment(1)->SetPoint(TRUE);
        else
            scr.GetSegment(1)->SetPoint(FALSE);
        scr.Update(1);
        DelayMs(100);
    }
    return 0;
}

 При слишком частом обращении к дисплею, контроллер может зависнуть. Информация добыта опытным путем и не претендует на истину, а что значит "слишком часто" наверняка сказать трудно, однако, все же стоит обратить на это внимание и, по возможности, не трогать дисплей без надобности.