LC75853 — ЖКИ драйвер (Arduino)

Как правило у многих радиолюбителей в наличии имеются небольшое количество различных панелей управления и плат индикации от старых магнитол, которые содержат ЖК индикаторы. Зачастую такие индикаторы содержат большое кол-во не нужных элементов которые отнимают полезную площадь ЖК индикатора, но тем не менее такие индикаторы можно применить в различных радиолюбительских проектах.

Более подробно про работу ЖКИ можно узнать из http://rcl-radio.ru/?p=131856.

В этой статье речь пойдет о ЖК драйвере LC75853, от том как с ним работать и о его особенностях.

ЖК драйвер LC75853 может применяться с различными ЖК индикаторами работающими в режиме 1/2-bias и 1/3-bias. При работе с ЖК драйвером LC75853 следует учитывать, что все ЖК индикаторы разные, у них может быть разное кол-во выводов, кол-во сегментов, порядковый номер сегментов, такие индикаторы могут содержать сегментные группы в виде матрицы для вывода символов или содержать определенное кол-во сегментов в группе для вывода цифр или символов. Поэтому создать какой то универсальный код управления таким драйвером не возможно. Но благодаря этой статье Вы сможете адаптировать предложенный код управления драйвером под свой ЖК дисплей.

ЖК драйвер LC75853 может управлять до 126 сегментами ЖК индикатора, так же имеет 4 цифровых выхода общего назначения, ЖК драйвер LC75853 так же содержит порт подключения клавиатуры (до 30 кнопок).

 

В данной статье будет рассмотрено только управление 126 сегментами ЖК индикатора.

Управление драйвера LC75853 3-Wire, то есть сигнал разрешения или запрета, синхронизирующие импульсы и данные.

Отправка данных разделена на три байта, сначала в первом байте передается адрес микросхемы 8 бит, далее 42 бит данных для 42 сегментов индикатора, далее 14 бита управления (Control data), которые содержат адрес байта (DD).

После отправки первого байта аналогично передается второй и третий байт, но вместо битов управления передается 14 бит заполненных нулями (Fixed data) и далее адреса байт (DD).

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

Так как в драйвер LC75853 необходимо передавать 3 байта данных по 42 бит, а платформа Arduino позволяет за раз передавать только 32 бита, то каждый 42 битный байт я разделил на два по 21 биту. В итоге необходимо передать 6 байт по 21 биту.

Ниже показан скетч, который включает все сегменты индикатора на 5 секунд, а далее по порядку включает по одному сегменту индикатора выводя номер соответствующего бита в монитор порта. Это даем Вам возможность легко и просто определить какой бит относится к тому или иному сегменту индикатора.

#define DELAY 1000

#define CE  3
#define CL  4
#define DI  2

long t=0b100000000000000000000;

void setup(){
  Serial.begin(9600);
  pinMode(CE, OUTPUT);
  pinMode(CL, OUTPUT);
  pinMode(DI, OUTPUT);
  digitalWrite(CE,LOW);
  digitalWrite(CL,LOW);
  delay(200);
  write_byte(0,0,0,0,0,0);
  }
  /*
  b1 1                   21
   0b111111111111111111111 
  b2 22                  42
   0b111111111111111111111  
  b3 43                  63
   0b111111111111111111111  
  b4 64                  84
   0b111111111111111111111 
  b5 85                  105
   0b111111111111111111111 
  b6 106                 126
   0b111111111111111111111    
   */

void loop(){
  write_byte(0b111111111111111111111,0b111111111111111111111, 0b111111111111111111111,0b111111111111111111111, 0b111111111111111111111,0b111111111111111111111);
  delay(5000);

  for(int j=0;j<=20;j++){
    write_byte(t>>j,0,0,0,0,0);
    Serial.print(t>>j,BIN); Serial.print("  bit "); Serial.println(j+1);
    delay(DELAY);
    }
    for(int j=0;j<=20;j++){
    write_byte(0,t>>j,0,0,0,0);
    Serial.print(t>>j,BIN); Serial.print("  bit "); Serial.println(j+22);
    delay(DELAY);
    }  
    for(int j=0;j<=20;j++){
    write_byte(0,0,t>>j,0,0,0);
    Serial.print(t>>j,BIN); Serial.print("  bit "); Serial.println(j+43);
    delay(DELAY);
    }   
    for(int j=0;j<=20;j++){
    write_byte(0,0,0,t>>j,0,0);
    Serial.print(t>>j,BIN); Serial.print("  bit "); Serial.println(j+64);
    delay(DELAY);
    }   
    for(int j=0;j<=20;j++){
    write_byte(0,0,0,0,t>>j,0);
    Serial.print(t>>j,BIN); Serial.print("  bit "); Serial.println(j+85);
    delay(DELAY);
    } 
for(int j=0;j<=20;j++){
    write_byte(0,0,0,0,0,t>>j);
    Serial.print(t>>j,BIN); Serial.print("  bit "); Serial.println(j+106);
    delay(DELAY);
    }                
  }

void write_byte(long b1, long b2, long b3, long b4, long b5, long b6){
     write_addr();
     write_21(b1);
     write_21(b2);
     write_conf(0b00000000000100);
     write_addr();
     write_21(b3);
     write_21(b4);
     write_conf(0b00000000000001);
     write_addr();
     write_21(b5);
     write_21(b6);
     write_conf(0b00000000000010);    
  }   


void write_addr(){
     digitalWrite(CE,LOW);delayMicroseconds(10);
   for(int i = 7; i >= 0; i--){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (0x42 >> i) & 1); 
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CL,LOW);
     digitalWrite(CE,HIGH);
     delayMicroseconds(10);
  } 

 void write_21(long bb){
  for(int i = 20;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (bb >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
  }  
   
void write_conf(long data_conf){
    for(int i = 13;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (data_conf >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CE,LOW);delayMicroseconds(10);
  }

Вывод монитора порта

Для каждого сегмента (бита) отводится время показа в 1 секунду, но если этого времени будет мало, то его можно увеличить изменив параметр:

#define DELAY 1000

После того как Вы получили положение всех сегментов, необходимо ими правильно управлять, пример как это можно сделать описано в http://rcl-radio.ru/?p=131856.

 

 

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=633

Даташит — http://rcl-radio.ru/wp-content/uploads/2024/04/san_lc75853ne-smd.pdf

курс Линукс для начинающих

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

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