Динамическия индикация на семисегментных светодиодных дисплеях

Светомузыка music color

Проекты для радио любителей.

Динамическия индикация на семисегментных светодиодных дисплея

Читать дополнительно здесь



В индикации на семисегментных светодиодах есть свои преимущества и недостатки. К преимуществам это большой срок службы, яркость индикации. К недостаткам, необходимость нагрузки на контроллер, который в реальном масштабе времени, должен выполнять как минимум 2 задачи.

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

Принцип динамической индикации заключается в последовательном высвечивании на индикаторе каждой цифры в отдельности. Если в этом случаи скорость индикации превышает 50 Гц (на разряд), то человеческий глаз видит нормальное статическое изображение. Для хорошей индикации желательно устанавливать частоту в районе 100Гц.

Динамическая индикация организуется с применением прерываний. Частота прерываний определяется из варианта количества разрядов индикации (и качества). Например, если у нас 4 разряда индикации необходимо частоту прерываний выбрать 100*4=400Гц.

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

Например, организация точных прерываний на CCP модуле:
Тактовая частота 8мГц. Таймер тактируется частотой 2Мгц. Настраиваем предделитель на 8, получаем тактовую частоту на вход таймера 250 кГц. Для получения 400 Гц период прерываний необходимо в CCP модуле сделать предустановку числа 625.

T1CON = 0b00110001; // таймер включен, предделитель 8 мГц =(f/4) Timer 1:8 - 250 000 гц
// настройка модуля CCP2 - режим сравнения (формирует внутренние часы)
CCP2CON = 0b00001011;
CCPR2H = 0x02; // предустановка для прерываний в 400 герц --> для тактовой 8 мГц = 250000/400=0х0271)
CCPR2L = 0x71; //


Для получения прерываний от таймера TMP0 используем предустановку делителя на 16. При этом получим 2000000/16/256=488Гц. Это составить 122Гц на разряд. Или можно выбрать предделитель на 32, что составит 61 Гц, что тоже допустимо.

// настройка периода прерываний 400 Гц для этого используем таймер TMP0.
OPTION_REG = 0b00000011; //включить подтяг. резисторы, предделитель на WDT, коэф. 1:128

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

Т.к. не всегда существует возможность подключиться полностью к одному порту, программа сделана так, что можно использовать любые доступные выводы контроллера (естественно предварительно сконфигурировать). Программа не только управляет индикацией, она еще управляет всеми I/O портами. Это упрощает управление.

Программа индикации:
//==================Индикация==========================
//программа управления портами ввода/вывода микроконтроллера
//===================================================
void indic(void) //программа развертки индикацией
{
switch (reg_ind)
{
case 0 : // индикация 1 разряда
reg_ind = 1; // установить следующую индикацию
p_ind = ind_1; //
if(TOCHKA1==1)p_ind |= 0b10000000; // индикация дес.точки
if(RAZR1==1) // разряд должен мигать
{
if(B_MIG==1)p_ind &= 0b10000000; // мигание разряда
}
if(TOCHm1==1) // точка должна мигать
{
if(B_MIG==0)p_ind &= 0b01111111;
}
break;

case 1 : // индикация 1 разряда
reg_ind = 2; // установить следующую индикацию
p_ind = ind_2; //
if(TOCHKA2==1)p_ind |= 0b10000000; // индикация дес.точки
if(RAZR2==1) // разряд должен мигать
{
if(B_MIG==1)p_ind &= 0b10000000; // мигание разряда
}
if(TOCHm2==1) // точка должна мигать
{
if(B_MIG==0)p_ind &= 0b01111111;
}
break;

case 2 : // индикация 1 разряда
reg_ind = 3; // установить следующую индикацию
p_ind = ind_3; //
if(TOCHKA3==1)p_ind |= 0b10000000; // индикация дес.точки
if(RAZR3==1) // разряд должен мигать
{
if(B_MIG==1)p_ind &= 0b10000000; // мигание разряда
}
if(TOCHm3==1) // точка должна мигать
{
if(B_MIG==0)p_ind &= 0b01111111;
}
break;

case 3 : // индикация 1 разряда
reg_ind = 0; // установить следующую индикацию
p_ind = ind_4; //
if(TOCHKA4==1)p_ind |= 0b10000000; // индикация дес.точки
if(RAZR4==1) // разряд должен мигать
{
if(B_MIG==1)p_ind &= 0b10000000; // мигание разряда
}
if(TOCHm4==1) // точка должна мигать
{
if(B_MIG==0)p_ind &= 0b01111111;
}
break;
}


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

// чтение состояния регистра портов
d_PORTA = PORTA; //
d_PORTB = PORTB; //
d_PORTC = PORTC; //

// очистка битов состояний разрядов индикации сегментов 0, а разрядов катодов в 1
d_PORTA = (d_PORTA & CL_PA) | SE_PA; //
d_PORTB = (d_PORTB & CL_PB) | SE_PB;
d_PORTC = (d_PORTC & CL_PC) | SE_PC; //

// отключение индикации
/* PORTA = d_PORTA; //
PORTB = d_PORTB; //
PORTC = d_PORTC; //
*/
if(GAIN==0)// бит гашения индикации
{
// дешифрация символа привязка к выводам контроллера.
if(p_ind & 0b00000001) S_A;
if(p_ind & 0b00000010) S_B;
if(p_ind & 0b00000100) S_C;
if(p_ind & 0b00001000) S_D;
if(p_ind & 0b00010000) S_E;
if(p_ind & 0b00100000) S_F;
if(p_ind & 0b01000001) S_G;
if(p_ind & 0b10000000) S_H;
}
// выбор индикации разряда
if(reg_ind == 1) R1;
if(reg_ind == 2) R2;
if(reg_ind == 3) R3;
if(reg_ind == 0) R4;

// настройка портов управления
if(RELE1 == 1) UP1; // управлением реле
if(RELE2 == 1) UP2; // управлением реле
if(RELE3 == 1) UP3; // управлением реле
if(RELE4 == 1) UP4; // управлением реле
//загрузка портов
PORTA = d_PORTA; //
PORTB = d_PORTB; //
PORTC = d_PORTC; //
}
//------------------------------------------------------------------------

Её основные функции вывод любых сиволов на светодиодный дисплей в 4 разряда. Возможность зажигания в разрядах точек (в любой комбинации), мигание любого разряда и точки в любой комбинации. Управления портами ввода вывода (даже если они расположены в портах, используемых для динамической индикации).

Схема подключения для демонстрации работы программы.




Описание переменных и флагов.

// переменные испольуемые совместно с процедурой прерывания
// программа индикации
volatile char reg_ind,p_ind, // внутрение регистры программы
 ind_1,ind_2,ind_3,ind_4, //регистры индикации разрядов
 d_PORTA,d_PORTB,d_PORTC; //буферные регистры
volatile bit TOCHKA1,TOCHKA2,TOCHKA3,TOCHKA4,// флаги индикации десятичной точки
 TOCHm1,TOCHm2,TOCHm3,TOCHm4,//флаги мигания десятичной точки
 RAZR1,RAZR2,RAZR3,RAZR4,//флаги мигания разрядов
 GAIN, // бит гащения индикации
 RELE1,RELE2,RELE3,RELE4; // биты упраления портами
//регистры системных часов
volatile char tim10gc,tim2gc;
volatile bit B_MIG; //бит 2 герца. для эффектов мигания разрядов


Файлы для загрузки
версия MPLAB - V8.76
HI-TECH C Compiler for PIC18 MCUs (PRO Mode) V9.80
HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode) V9.83


Пример демо программы parag_76_01.с.
Схема подключения в pdf.



 


Украина, Днепропетровск