4- разрядный 7 сегментный индикатор

Всем привет. Сижу туплю, на макетке собирал схему для 7 сегментника из 2 разрядов все работало. А тут купил индикатор 4-х разрядный 7 сегментный KEM5461 с общим катдом. Пытаюсь вывести в любом из разрядов одну цифру, цифра отображается корректно, но сразу во всех сегментах. Что я делаю не так? Схема во вложении.

#define segmentA 2
#define segmentB 3
#define segmentC 4
#define segmentD 5
#define segmentE 6
#define segmentF 7
#define segmentG 8
#define segmentDP 9

#define DIGIT_1PIN 10  //(1)     //1234
#define DIGIT_2PIN 11  //(2)
#define DIGIT_3PIN 12  //(3)
#define DIGIT_4PIN 13  //(4)


int t1 = 1234;



void show_number(int num)  
{
  switch(num)
  {
    case 0:  
    digitalWrite(segmentA, HIGH); 
    digitalWrite(segmentB, HIGH); 
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, HIGH);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, LOW); 
    break;
    case 1:  
    digitalWrite(segmentA, LOW);  
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, LOW);  
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, LOW);
    digitalWrite(segmentG, LOW);
    break;
    case 2:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, LOW);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, HIGH);
    digitalWrite(segmentF, LOW);
    digitalWrite(segmentG, HIGH);
    break;
    case 3:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, LOW);
    digitalWrite(segmentG, HIGH);
    break;
    case 4:
    digitalWrite(segmentA, LOW);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, LOW);
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, HIGH);
    break;
    case 5:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, LOW);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, HIGH);
    break;
    case 6:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, LOW);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, HIGH);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, HIGH);
    break;
    case 7:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, LOW);
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, LOW);
    digitalWrite(segmentG, LOW);
    break;
    case 8:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, HIGH);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, HIGH);
    break;
    case 9:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, HIGH);
    break;
    default:
    digitalWrite(segmentA, LOW);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, HIGH);
    digitalWrite(segmentF, LOW);
    digitalWrite(segmentG, HIGH);
    break;
  }
}



void setup() {
  Serial.begin(9600);
  pinMode(segmentA, OUTPUT); 
  pinMode(segmentB, OUTPUT);
  pinMode(segmentC, OUTPUT);
  pinMode(segmentD, OUTPUT);
  pinMode(segmentE, OUTPUT);
  pinMode(segmentF, OUTPUT);
  pinMode(segmentG, OUTPUT);
  
  pinMode(DIGIT_1PIN, OUTPUT);
  pinMode(DIGIT_2PIN, OUTPUT);
  pinMode(DIGIT_3PIN, OUTPUT);
  pinMode(DIGIT_4PIN, OUTPUT);
}

void loop() {
       
  int a = t1 % 10;
            digitalWrite(DIGIT_1PIN,LOW);
            digitalWrite(DIGIT_2PIN,HIGH);
            digitalWrite(DIGIT_3PIN,LOW);
            digitalWrite(DIGIT_4PIN,LOW);
            show_number(a);
            delay(500);
            digitalWrite(DIGIT_1PIN,LOW);
            digitalWrite(DIGIT_2PIN,LOW);
            digitalWrite(DIGIT_3PIN,LOW);
            digitalWrite(DIGIT_4PIN,LOW);
            Serial.println(a);
 }

странная схема, зачем на выход транзистора вешать пин Ардуины?

1 лайк

Эта схема абсолютно не правильная. Наверно пин DG
от ардуины должен идти в базу транзистора, а коллектор на управление.

Все понял в чем косяк, базу транзистора через 1 кОм на МК, Эмиттер надо на индикатор, а коллектор на GND. Правильно?

нет, неправильно

2

У меня общий катод.

а потянет контроллер ток сегмента?

Ну если транзистор pnp, то правильно (но логику в программе инвертировать нужно), а если npn (как в схеме выше) - то дед все сказал - не правильно.

uint8_t segment[COMMON_MAX];

void led() {
  static uint8_t com;
  static uint8_t mask;

  switch (com) {                        //выключим все сегменты и включим один общий
    case 0: com1_on(); break;
    case 1: com2_on(); break;
    case 2: com3_on(); break;
  }
  for ( ; mask; mask <<= 1) {           //пропустим выключенные
    if (segment[com] & mask) {
      switch (mask) {                   //зажгём один
        case MASK_A: on(_A); break;
        case MASK_B: on(_B); break;
        case MASK_C: on(_C); break;
        case MASK_D: on(_D); break;
        case MASK_E: on(_E); break;
        case MASK_F: on(_F); break;
        case MASK_G: on(_G); break;
        case MASK_H: on(_H); break;
      }
      break;
    }
  }
  mask <<= 1;
  if (!mask) {
    mask = 1<<0;
    if (++com >= COMMON_MAX) 
      com = 0;
  }
}

@Green это что за код?

Кто, когда и при каких обстоятельствах задаёт начальное значение переменной mask, описанной в строке №5, до её первого использования в строке №12?

Первый проход пропускаем. А уже потом задаём mask.

Понятно, а при первом проходе цикл в строке №12 работает как Бог пошлёт - что б всем веселее было :slight_smile:

Ага.) При первом проходе цикл вообще не будет выполняться.

Перерисовал схему, исправил на физическом уровне. Стало все отображаться как надо.

Код ниже рабочий, выводит цифры по разрядам:

#define segmentA 2
#define segmentB 3
#define segmentC 4
#define segmentD 5
#define segmentE 6
#define segmentF 7
#define segmentG 8
#define segmentDP 9

#define DIGIT_1PIN 10  //(1)     //1234
#define DIGIT_2PIN 11  //(2)
#define DIGIT_3PIN 12  //(3)
#define DIGIT_4PIN 13  //(4)


int t1 = 9876;
int time_delay = 3;


void show_number(int num)  
{
  switch(num)
  {
    case 0:  
    digitalWrite(segmentA, HIGH); 
    digitalWrite(segmentB, HIGH); 
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, HIGH);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, LOW); 
    break;
    case 1:  
    digitalWrite(segmentA, LOW);  
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, LOW);  
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, LOW);
    digitalWrite(segmentG, LOW);
    break;
    case 2:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, LOW);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, HIGH);
    digitalWrite(segmentF, LOW);
    digitalWrite(segmentG, HIGH);
    break;
    case 3:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, LOW);
    digitalWrite(segmentG, HIGH);
    break;
    case 4:
    digitalWrite(segmentA, LOW);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, LOW);
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, HIGH);
    break;
    case 5:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, LOW);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, HIGH);
    break;
    case 6:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, LOW);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, HIGH);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, HIGH);
    break;
    case 7:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, LOW);
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, LOW);
    digitalWrite(segmentG, LOW);
    break;
    case 8:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, HIGH);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, HIGH);
    break;
    case 9:
    digitalWrite(segmentA, HIGH);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, HIGH);
    break;
    default:
    digitalWrite(segmentA, LOW);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, HIGH);
    digitalWrite(segmentE, HIGH);
    digitalWrite(segmentF, LOW);
    digitalWrite(segmentG, HIGH);
    break;
  }
}



void setup() {
  Serial.begin(9600);
  pinMode(segmentA, OUTPUT); 
  pinMode(segmentB, OUTPUT);
  pinMode(segmentC, OUTPUT);
  pinMode(segmentD, OUTPUT);
  pinMode(segmentE, OUTPUT);
  pinMode(segmentF, OUTPUT);
  pinMode(segmentG, OUTPUT);
  
  pinMode(DIGIT_1PIN, OUTPUT);
  pinMode(DIGIT_2PIN, OUTPUT);
  pinMode(DIGIT_3PIN, OUTPUT);
  pinMode(DIGIT_4PIN, OUTPUT);
}

void loop() {
       
  int a = t1 / 1000;
  int b = t1 % 1000/100;
  int c = t1 % 100/10;
  int d = t1 % 10;
  
            digitalWrite(DIGIT_1PIN,HIGH);
            digitalWrite(DIGIT_2PIN,LOW);
            digitalWrite(DIGIT_3PIN,LOW);
            digitalWrite(DIGIT_4PIN,LOW);
            show_number(a);
            delay(time_delay);
            digitalWrite(DIGIT_1PIN,LOW);
            digitalWrite(DIGIT_2PIN,HIGH);
            digitalWrite(DIGIT_3PIN,LOW);
            digitalWrite(DIGIT_4PIN,LOW);
            show_number(b);
            delay(time_delay);
            digitalWrite(DIGIT_1PIN,LOW);
            digitalWrite(DIGIT_2PIN,LOW);
            digitalWrite(DIGIT_3PIN,HIGH);
            digitalWrite(DIGIT_4PIN,LOW);
            show_number(c);
            delay(time_delay);
            digitalWrite(DIGIT_1PIN,LOW);
            digitalWrite(DIGIT_2PIN,LOW);
            digitalWrite(DIGIT_3PIN,LOW);
            digitalWrite(DIGIT_4PIN,HIGH);
            show_number(d);
            delay(time_delay);
            digitalWrite(DIGIT_1PIN,LOW);
            digitalWrite(DIGIT_2PIN,LOW);
            digitalWrite(DIGIT_3PIN,LOW);
            digitalWrite(DIGIT_4PIN,LOW);

}

2 лайка

А так?

Какой классный пост! Просто видно как ТС растет просто прелесть, молодец!

Ничего вы не понимаете. Главное же, что код рабочий!)
ТС, а ещё на семисегментных индикаторах буквы отображают… Тогда уж точно без спойлера не обойтись.)

1 лайк