Библиотека для семисегментного индикатора с произвольным подключением выводов

Введение

Наконец то переделал свою старую библиотеку для семисегментного индикатора. Теперь она более функциональна и позволяет подключать индикатор к произвольным выводам микроконтроллера. Поддержку SPI убрал, чтобы не загромождать код. Если дойдут руки, то сделаю для SPI подключения отдельную библиотеку. 

Особенности библиотеки:

- предназначена для микроконтроллеров AVR,
- легко интегрируется в готовый проект,
- может использоваться с компиляторами IAR, GCC, CodeVision,

- поддерживает подключение к произвольным выводам микроконтроллера, 
- поддерживает индикаторы с общим катодом и с общим анодом, 
- поддерживает подключение индикаторов через различные буферы,
- позволяет подключать индикатор с количеством разрядов до 8,
- предоставляет возможность посегментной и поразрядной развертки.

Полная версия библиотеки дополнительно обеспечивает:

- вывод отрицательных чисел,
- вывод текстовых сообщений,
- функцию моргания любых разрядов индикатора,
- вывод на индикатор нескольких чисел в произвольное место. 

Состав библиотеки

indicator_2f.h - настройка параметров и подключения
indicator_2f.c - реализация функций
compiler_4.h - файл обеспечивающий поддержку трех компиляторов
port_macros.h - макросы виртуальных портов

Подключение к проекту

1. Копируем все файлы в папку проекта. 
2. Подключаем indicator_2f.c к проекту
3. Инклюдим заголовочный файл indicator_2f.h к сишному файлу, в котором будут использоваться функции библиотеки. 
4. Настраиваем параметры и подключение индикатора в файле indicator_2f.h
5. Прописываем в код вызов функций библиотеки индикатора

Настройка библиотеки индикатора

Настройка конфигурации состоит из следующих шагов.

1. Задаем количество цифр индикатора. Их может быть от 1 до 8.

#define IND_AMOUNT_NUM 4


2. Задаем тип развертки

#define IND_SCAN_SEGMENT 1


1 - посегментная развертка. За один цикл засвечиваются один сегмент всех разрядов.
0 - поразрядная развертка. За один цикл засвечиваются все сегменты одного разряда. 

Поразрядная развертка дает более компактный код, но частота обновления индикатора в этом случае будет зависеть от количества разрядов индикатора. 

3. Подключаем/отключаем функцию моргания

#define IND_USE_BLINK 1


0 – функция моргания не используется, 1 – функция моргания используется. В первом случае получается более компактный код.

4. Задаем период моргания

#define IND_DUR_BLINK 2000


Эта настройка определяет количество циклов, в течении которых моргающие разряды индикатора гаснут/горят. Один цикл – это время между вызовами функции обновления индикатора IND_Update().

5. Задаем куда подключены сегменты индикатора 

Настройки, которые можно менять, обозначены на рисунке красной рамкой. 


Первая строка - это конфигурация порта. Она задается в следующем формате: имя порта, буква порта, тип порта. Для настройки нужно менять только букву порта и его тип. 


Если порт виртуальный, то буква может быть произвольной. В случае реального порта указывается его реальная буква.

Типов порта два - _VIRT и _REAL. Порт считается виртуальным в двух случаях: если он состоит из выводов нескольких портов, если он состоит из выводов одного порта, но они располагаются не по порядку.

Если используется реальный порт, то указывается тип _REAL. Это создает более компактный код.

Далее идут настройки выводов. Они задаются в таком формате: буква реального порта, номер вывода порта, активный уровень.

C- буква порта, 0 - используемый вывод порта, _HI - высокий активный уровень.

Здесь стоит остановиться только на активном уровне вывода. Есть три значения этого параметра: _HI, _LOW, _NONE.

Правило установки уровня простое. Если для зажигания сегмента индикатора на выводе микроконтроллера нужно установить логическую единицу, то активный уровень этого вывода _HI. Если для зажигания сегмента на выводе должен быть ноль, то активный уровень этого вывода _LOW. Если вывод не используется, то параметр устанавливается как _NONE.

6. Задаем куда подключены разряды индикатора

Настройки, которые можно менять, обозначены на рисунке красной рамкой.

 


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


Для работы с портами используются макросы виртуальных портов, на которых я уже делал библиотеку для LCD. Если что-то непонятно в их настройках, почитайте соответствующий материал - "виртуальные порты".

Использование библиотеки

void IND_Init(void) - функция инициализации. Настраивает порты ввода вывода, инициализирует внутренние переменные. Эта функция должна вызываться первой, например, в начале main`a.

void IND_OutSym(char *str, uint8_t pos) – записывает в буфер индикатора строку символов. Принимает указатель на строку (*str) и позицию первого символа (pos). Символы, которые может отобразить индикатор, определены в файле indicator_2f.c в массиве sym[]. Можно добавлять в этот массив свои символы.

Пример:

IND_OutSym(“cod”, 1);


void IND_OutUint(uint16_t value, uint8_t comma) – преобразует беззнаковое 16-и разрядное число (value) и записывает его в буфер индикатора. Число отображается на индикаторе, начиная с первого разряда. Также эта функция принимает номер разряда (comma), в котором будет гореть десятичная точка.

void IND_OutInt(int16_t value, uint8_t comma) – преобразует 16-и разрядное число со знаком (value) и записывает его в буфер индикатора. В первом разряде индикатора отображается знак числа. Также эта функция принимает номер разряда (comma), в котором будет гореть десятичная точка.

void IND_OutUintFormat(uint16_t value, uint8_t comma, uint8_t firstPos, uint8_t lastPos) - преобразует беззнаковое 16-и разрядное число (value) и записывает его в буфер индикатора в заданые позиции (firstPos, lastPos). Также эта функция принимает номер разряда (comma), в котором будет гореть десятичная точка.

void IND_OutIntFormat(int16_t value, uint8_t comma, uint8_t firstPos, uint8_t lastPos) - преобразует беззнаковое 16-и разрядное число со знаком (value) и записывает его в буфер индикатора в заданые позиции (firstPos, lastPos). Знак числа отображается в первой заданной позиции (firstPos). Также эта функция принимает номер разряда (comma), в котором будет гореть десятичная точка.

void IND_BlinkMask(uint8_t value) – задает маску (value), которая определяет моргающие разряды индикатора. Каждый бит маски соответствует одному разряду индикатора: нулевой бит – это первый разряд, первый бит – второй и так далее. Единица в маске – разряд моргает, ноль – не моргает.

Пример:

//задаем моргание 1, 2, 3, 4 разрядов индикатора
IND_BlinkMask (0x0f); 
…
//ни один из разрядов не моргает
IND_BlinkMask (0x00); 


void IND_Update(void) - функция обновляющая информацию на индикаторе. Эта функция должна периодически вызываться с частотой > 25* N. Где N - количество разрядов или сегментов индикатора, в зависимости от типа развертки. Вызов этой функции можно поместить в прерывание какого-нибудь таймера. В идеале ее нужно сделать встраиваемой, то есть описать прерывание таймера в файле indicator_2l.c и поместить в него код этой функции. Также можно вызывать эту функцию из основного цикла по сигналу таймера.

ВАЖНО! Если в прерываниях и в основном цикле программы выполняется работа с портами ввода-вывода, которые используются индикатором, то нужно обеспечивать атомарность этих операций

Файлы

Облегченная версия библиотеки

IND-driver-2l-IAR.rar
IND-driver-2l-winavr.rar

Полная версия библиотеки

IND-driver-2f-IAR.rar
IND-driver-2f-winavr.rar

П.С: Об ошибках пишите в комментариях или 
вконтакте. Я ее, конечно, проверил, но косяки могут быть. А вообще получилось неплохо. 

У вас недостаточно прав для комментирования.