Контроллер 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;
}
При слишком частом обращении к дисплею, контроллер может зависнуть. Информация добыта опытным путем и не претендует на истину, а что значит "слишком часто" наверняка сказать трудно, однако, все же стоит обратить на это внимание и, по возможности, не трогать дисплей без надобности.