Четырехразрядный семисегментный индикатор (Arduino)

Четырехразрядные семисегментные индикаторы рассчитаны на работу динамическом режиме (динамическая индикация), в этих индикаторах все одноименные сегменты во всех разрядах замкнуты между собой. Как правило у таких индикаторов 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);
  }

Comments

  1. достался семисегментный двустрочный индикатор с китайского ампервольтметра, у него всего 9 выводов. В сети ничего не нашел как его подключать, може у вас что-то есть?

Добавить комментарий

Войти с помощью: