Четырехразрядные семисегментные индикаторы рассчитаны на работу динамическом режиме (динамическая индикация), в этих индикаторах все одноименные сегменты во всех разрядах замкнуты между собой. Как правило у таких индикаторов 12 выводов: 4 вывода разрядов и 8 выводов для сегментов и запятых. Существуют две разновидности индикаторов: с общим анодом и с общим катодом.
Для нормальной работы каждый разряд работает при помощи транзисторного ключа, сегменты как правило подключаются на прямую к микроконтроллеру (если ток потребления большой, то так же применяют транзисторные ключи).
Рассмотрим применение таких индикаторов совместно с платформой Arduino. Микроконтроллер должен обеспечивать непрерывную работу динамической индикации, для этого необходимо чтобы работа индикатора была синхронизирована таймером. В этом режиме на работу индикатора не будет влиять основной цикл программы.
Ниже показана схема подключения индикатора с общим катодом к плате Arduino Nano (Uno).
byte i,mass[4],pd; int data; void setup(){ DDRD = 0B11111111; // весь порт D как OUTPUT | D0...D7 DDRB = 0B00001111; // PB0...PB3 как OUTPUT | D8...D11 cli(); // запретить прерывания /// TIMER2 TCCR2A = 0;TCCR2B = 0; // сбросить регистры в ноль OCR2A = 20; // регистр сравнения TCCR2B |= (1 << CS22)|(1 << CS20)|(1 << WGM22);// предделитель на 1024,включить CTC режим > сброс таймера по совпадению TIMSK2 |= (1 << OCIE2A); // включить прерывание по совпадению таймера sei(); // разрешить прерывания } void loop(){ data++; delay(100); } void seg(){ ////// функция сегментов switch(mass[i]){ // ABCDEFGP case 0: PORTD = 0b11111100|pd;break; // 0 AAAAA case 1: PORTD = 0b01100000|pd;break; // 1 F B case 2: PORTD = 0b11011010|pd;break; // 2 F B case 3: PORTD = 0b11110010|pd;break; // 3 GGGGG case 4: PORTD = 0b01100110|pd;break; // 4 E C case 5: PORTD = 0b10110110|pd;break; // 5 E C case 6: PORTD = 0b10111110|pd;break; // 6 DDDDD case 7: PORTD = 0b11100000|pd;break; // 7 case 8: PORTD = 0b11111110|pd;break; // 8 case 9: PORTD = 0b11110110|pd;break; // 9 }} void cif(){ ///// функция разрядов //// int data преобразуем в массив mass[] mass[0]=data/1000; mass[1]=data/100%10; mass[2]=data/10%10; mass[3]=data%10; switch(i){ // pd - запятая case 3: mass[0];PORTB = 0x01;pd=0;seg();break; case 2: mass[1];PORTB = 0x02;pd=0;seg();break; case 1: mass[2];PORTB = 0x04;pd=1;seg();break; case 0: mass[3];PORTB = 0x08;pd=0;seg();break; }i++;if(i>3){i=0;}} ISR(TIMER2_COMPA_vect){cif();} /// функция прерывания
В цикле loop() необходимо передать число int переменой data, для отображения числа на индикаторе.
Положение или наличие запятой определяется переменной pd:
case 3: mass[0];PORTB = 0x01;pd=0;seg();break; case 2: mass[1];PORTB = 0x02;pd=0;seg();break; case 1: mass[2];PORTB = 0x04;pd=1;seg();break;// запятая в третьем разряде case 0: mass[3];PORTB = 0x08;pd=0;seg();break;
Этот скетч подходит для любого четырехразрядного семисегментного индикатора с общим катодом.
Для упрощения скетча я написал небольшую библиотеку LED_4x7.zip, добавлена регулировка яркости индикатора и возможность выводить различные символы.
Тестовый скетч
#include <LED4x7.h> void setup(){ led_timer(); } void loop(){ led_setInt(256,3,1, 27,-1,-1,-1); // int 0...9999, положение запятой 0...3, яркость 0...10 /* последние 4 цифры: -1 не выводить 10 пусто 11 A 12 b 13 C 14 c 15 d 16 E 17 F 18 P 19 u 20 U 21 - 22 нижнее = 23 верхнее = 24 r 25 нижнее o 26 верхнее o 27 t */ delay(1000); }
В скетче используются всего две функции, первая функция led_timer() расположена в функции setup(), а вторая led_setInt(256,3,1, 27,-1,-1,-1) расположена в цикле loop().
Пример использования функции led_setInt():
led_setInt(256,3,1, 27,-1,-1,-1)
- 256 — число выводимое на индикатор
- 3 — положение запятой (0 — нет запятой)
- 1 — яркость индикатора от 0 до 10
- 27 — выводит знак t в старшем разряде
- -1 — не выводить знаки
#include <LED4x7.h> void setup(){ led_timer(); } void loop(){ led_setInt(2400,0,3, -1,-1,26,13); delay(5000); }
достался семисегментный двустрочный индикатор с китайского ампервольтметра, у него всего 9 выводов. В сети ничего не нашел как его подключать, може у вас что-то есть?
еще
На него ни чего нет, попробуйте подать 5В через 200 Ом на выводы и GND