ЖКИ без контроллера

Allu_Zef
Offline
Зарегистрирован: 11.02.2020

Доброго времени суток! В рамках наработки опыта решил попробовать запустить ЖКИ (4 разряда) без контроллера с помощью ардуины. Почитал информацию по основам управления. Выглядит просто - на СОМ выводы подается меандр заданной частоты, а на сегменты которые должны зажечься - противофазный меандр. Соответственно синфазный для не активных сегментов. В рамках опыта собрал на макетке схему для одного разряда и решил попробовать переключать значения. В голову пришла идея просто выводить через сдвиговый регистр значения нужной цифры и переключать на инвертированные в зависимости от уровня СОМ сигнала. Для начала решил что 50 Гц это то, с чем без проблем справится контроллер. Но код упорно отказывается работать. А сигнал данных на сдвиговом регистре упорно рассинхронизируется с сигналом СОМ. Даже попытка просто вывести одно заданное число не увенчалась успехом. Код прилагаю ниже. Буду благодарен за помощь и указание на ошибки. 

//Пин подключен к ST_CP входу 74HC595
int Latch = 10;
//Пин подключен к SH_CP входу 74HC595
int Clock = 9;
//Пин подключен к DS входу 74HC595
int Data = 12;
//Пин D2 подключен к COM входу ЖКИ
int COMpin = 13;
// Переменная отсчета секунд
unsigned int sec0 = 0;
unsigned int sec = 0;
unsigned long t1,t2 = 0;
unsigned int n = 0;
int val = 0;
byte flag1,flag2 = 0;
//   Цифры                                             0                  1                    2                 3                     4                    5                       6                   7                 8                   9
volatile byte numbSerial[10] =    {0b11111100, 0b01100000, 0b11011010,  0b11110010, 0b01100110,  0b10110110,  0b10111110, 0b11100000, 0b11111110,  0b11110110};
volatile byte numbReverse[10]= {0b00000011, 0b10011111, 0b00100101, 0b00001101, 0b10011001, 0b01001001, 0b01000001, 0b00011111, 0b00000001, 0b00001001};
void setup() {
   //устанавливаем режим OUTPUT
  pinMode(Latch, OUTPUT);
  pinMode(Clock, OUTPUT);
  pinMode(Data, OUTPUT);
  pinMode(COMpin, OUTPUT);
}
void loop() {
  // Меандр 50Гц на выходе COMpin
    digitalWrite (COMpin, LOW);
  while(1)
  {
    t2=micros();
    if ((t2-t1)>=20000)
    {
     digitalWrite (COMpin, LOW);
     t1=t2;
    }
    else
    {
      if ((t2-t1)>=10000)
      {
        digitalWrite (COMpin, HIGH);
      }
    }
    val = digitalRead(COMpin);
    if (val==HIGH)
    {
      flag2 = 0;
      if (!flag1)
      {
        digitalWrite(Latch, LOW);
        //Записываем значение из массива numbReverse
        shiftOut(Data, Clock, LSBFIRST, numbReverse[1]);
        digitalWrite(Latch, HIGH);
        flag1 = 1;
        digitalWrite (2, LOW);
      }
    }
    else
    {
      flag1 = 0;
      if (!flag2)
      {
        digitalWrite(Latch, LOW);
        //Записываем значение из массива numbSerial
        shiftOut(Data, Clock, LSBFIRST, numbSerial[1]);
        digitalWrite(Latch, HIGH);
        flag2 = 1;
        digitalWrite (2, HIGH);
      }
    }
    //защелкнуть данные, установить пин Latch
    digitalWrite(Latch, HIGH);
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

меандр то зачем? Если вы можете подавать на разные сегменты разные сигналы - просто подавайте на активные HIGH, а на неактивные LOW

А вообще - почитайте в гугле, что такое "динамическая индикация"

rkit
Offline
Зарегистрирован: 23.11.2016

b707 пишет:

меандр то зачем? Если вы можете подавать на разные сегменты разные сигналы - просто подавайте на активные HIGH, а на неактивные LOW

Очередной случай "нифига не знаю, но кидаюсь советовать".

Allu_Zef
Offline
Зарегистрирован: 11.02.2020

Как раз в этом выражается особенность управления ЖКИ. При подаче постоянного прямого напряжения сегменты деградируют и тухнут. поэтому необходимо менять направление протекания тока. Это связано с физикой процесса. Точнее не скажу, но знаю что жидкие кристаллы работают так. 

b707
Offline
Зарегистрирован: 26.05.2017

Allu_Zef пишет:

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

ок, тогда значит фигню сморозил, извиняйте

rkit
Offline
Зарегистрирован: 23.11.2016

Если делаешь через регистр, то делай уж все пины, включая COM.

Allu_Zef
Offline
Зарегистрирован: 11.02.2020

Хорошая идея, спасибо! Просто воткнул СОМ дисплея к выходу сдвигового регистра. Стало намного лучше. Какие-то помехи проскакивают, но это могут быть ошибки кода который я нее менял вовсе или ненадежный контакт. Буду разбираться дальше. 

Allu_Zef
Offline
Зарегистрирован: 11.02.2020

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

Не нашел в интернете примеров работы с ЖКИ без контроллера под Ардуино так что приложу ниже код который работает. Выводит на разряде числа от 0 до 9 каждую секунду. Может кому-то поможет.

//Пин подключен к ST_CP входу 74HC595
int Latch = 10;
//Пин подключен к SH_CP входу 74HC595
int Clock = 9;
//Пин подключен к DS входу 74HC595
int Data = 12;
//Пин подключен к COM
int COM = 13;
// Переменные отсчета секунд
unsigned int sec0 = 0;
unsigned int sec = 0;
//Переменные задающие частоту управляющего меандра
unsigned long t1,t2 = 0;
//Текущее отображаемое число 
unsigned long n = 0;
//   Коды цифр                       0            1          2           3            4         5           6           7            8           9
volatile byte numbSerial[10] = {0b11111100, 0b01100000, 0b11011010, 0b11110010, 0b01100110, 0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11110110};
// Инвертированные значения кодов цифр
volatile byte numbReverse[10]= {0b00000011, 0b10011111, 0b00100101, 0b00001101, 0b10011001, 0b01001001, 0b01000001, 0b00011111, 0b00000001, 0b00001001};
void setup() {
   //устанавливаем режим OUTPUT
  pinMode(Latch, OUTPUT);
  pinMode(Clock, OUTPUT);
  pinMode(Data, OUTPUT); 
  pinMode(COM, OUTPUT);
}
void loop() {
  sec = millis(); 
        //Отсчет секунд с момента запуска программы
        if ((sec-sec0)>=1000) 
        {
          n=n+1;
          sec0=sec;
        }
            if (n>=10)
            {
              n=0;
            }
              // Генерация частоты на СОМ выводы
              t2 = micros();
                // Разность t2-t1 задает период сигнала
                if ((t2-t1)>=20000)
                  {
                    digitalWrite(COM, LOW);
                   t1=t2;
                    digitalWrite(Latch, LOW);
                      //Записываем значение из массива numbReverse
                      shiftOut(Data, Clock, LSBFIRST, numbSerial[n]);
                      digitalWrite(Latch, HIGH);
                  }
            else
              {
                // Тут задается скважность. В данном случае 50%
                if ((t2-t1)>=10000)
                {
                  digitalWrite(COM, HIGH);
                  digitalWrite(Latch, LOW);
                      //Записываем значение из массива numbSerial
                      shiftOut(Data, Clock, LSBFIRST, numbReverse[n]);
                      digitalWrite(Latch, HIGH);
                }
              }
            }

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Allu_Zef пишет:

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

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