ЖКИ без контроллера
- Войдите на сайт для отправки комментариев
Доброго времени суток! В рамках наработки опыта решил попробовать запустить ЖКИ (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);
}
}
меандр то зачем? Если вы можете подавать на разные сегменты разные сигналы - просто подавайте на активные HIGH, а на неактивные LOW
А вообще - почитайте в гугле, что такое "динамическая индикация"
меандр то зачем? Если вы можете подавать на разные сегменты разные сигналы - просто подавайте на активные HIGH, а на неактивные LOW
Очередной случай "нифига не знаю, но кидаюсь советовать".
Как раз в этом выражается особенность управления ЖКИ. При подаче постоянного прямого напряжения сегменты деградируют и тухнут. поэтому необходимо менять направление протекания тока. Это связано с физикой процесса. Точнее не скажу, но знаю что жидкие кристаллы работают так.
Как раз в этом выражается особенность управления ЖКИ. При подаче постоянного прямого напряжения сегменты деградируют и тухнут
ок, тогда значит фигню сморозил, извиняйте
Если делаешь через регистр, то делай уж все пины, включая COM.
Хорошая идея, спасибо! Просто воткнул СОМ дисплея к выходу сдвигового регистра. Стало намного лучше. Какие-то помехи проскакивают, но это могут быть ошибки кода который я нее менял вовсе или ненадежный контакт. Буду разбираться дальше.
Проблема решилась. Спасибо всем участникам за помощь. Оказалось, что в китайской макетке перемычка по которой передавались данные держалась слабо что и приводило к невнятным результатам на дисплее.
Не нашел в интернете примеров работы с ЖКИ без контроллера под Ардуино так что приложу ниже код который работает. Выводит на разряде числа от 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); } } }Проблема решилась. Спасибо всем участникам за помощь. Оказалось, что в китайской макетке перемычка по которой передавались данные держалась слабо что и приводило к невнятным результатам на дисплее.
Истину говорят древние - все проблемы решаются с помощью паяльника и синей изоленты. А если они не решаются, то или мало изоленты или паяльник не включен в розетку.