ARDUINO VFD 20T202DA1J

Александр_Е

✩✩✩✩✩✩✩
12 Фев 2022
2
0
Доброго времени суток! Имеется в наличии VFD дисплей Samsung 20T202DA1J revE, 2х строчный, 20 знакомест в строчке, со стандартным 8-bit интерфейсом как и у LCD 1602, решил использовать его в своем проекте, начал разбираться, по даташиту он похож на HD44780 за небольшим исключением, подключил через PCF8574T к Arduino mega 2560 по I2C, использовал библиотеку LiquidCrystal_I2C, все работает замечательно за исключением яркости, на 1602 на третей пин приходит напряжения с подстроечника для регулировки контрастности, в моем дисплее эта нога висит в воздухе а яркость регулируется программно в момент инициализации дисплея, в байте Function set за это отвечают бит 0 и 1, в 1602 эти биты не используются и судя по яркости в них по умолчанию записаны единицы, в моем случае необходимо модифицировать библиотеку чтоб в момент инициализации в бит 0 и 1 записывались нули, отсюда и очень большая просьба, если кто может подсказать где и как ее модифицировать буду очень признателен, в СИ совсем не рублю, знаю Ассемблер, там в этом плане все просто, лет 16 назад писал много для PIC контроллеров в си особо не вникал, иногда делал вставки на си кусками из нета, на асм код ну очень большой, уже давно не занимался с мк а сейчас встала задача, не могу разобраться, для этих дисплеев только с ISP интерфейсом есть библиотека, пытался скрестить чупокабра получается:) ПОМОГИТЕ ОЧЕНЬ НАДО!!!🤯

IMG_20220213_001249.jpgIMG_20220213_001301.jpg
 

Sonya

✩✩✩✩✩✩✩
2 Июн 2020
38
3
www.cctvsp.ru
У меня похожий индикатор, но с названием Futaba, там тоже регулировка яркости осуществляется программно. Во вложении демка с возможностями. Там у меня подключение прямое, а не через I2C, но библиотека та же - LiquidCrystal. Думаю, разберётесь, как переделать под I2C.
Демка возможностей индикатора M204SD02A:
// include the library code:
#include <LiquidCrystal.h>
#include <OneWire.h>
OneWire ds(10);

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//               RS , E , D4 , D5 , D6 , D7
int i, j, n, m;


////////////////////////////////////////////////////////////////////
// initialize display
// 3rd parameter is a string containing some needed russian characters from "БГДЖЗИЙЛПУФЦЧШЩЬЪЫЭЮЯ"
// up to 16 letters, but recommended not more than 8, anyway, i can use 16 on my lcd :)
////////////////////////////////////////////////////////////////////
static byte addon_letters[16];
void init_rus(const char* letters_use )
{
  // custom characters
  static byte letters[][8]   = {
    { B11111, B10000, B10000, B11111, B10001, B10001, B11111, B00000 },//Б
    { B11111, B10000, B10000, B10000, B10000, B10000, B10000, B00000 },//Г
    {  B00000, B01111, B01001, B01001, B01001, B01001, B11111, B10001 },//Д
    {  B01010, B00000, B11111, B10000, B11110, B10000, B10000, B11111 }, //Ё
    { B10101, B10101, B10101, B01110, B10101, B10101, B10101, B00000 },//Ж
    { B01110, B10001, B00001, B00110, B00001, B10001, B01110, B00000 },//З
    { B10001, B10001, B10011, B10101, B11001, B10001, B10001, B00000 },//И
    { B10101, B10101, B10011, B10101, B11001, B10001, B10001, B00000 },//Й
    { B00111, B01001, B10001, B10001, B10001, B10001, B10001, B00000 },//Л
    { B11111, B10001, B10001, B10001, B10001, B10001, B10001, B00000 },//П
    { B10001, B10001, B10001, B01111, B00001, B10001, B01110, B00000 },//У
    {  B00000, B01110, B10101, B10101, B10101, B01110, B00100, B00100 },//Ф
    { B10001, B10001, B10001, B10001, B10001, B10001, B11111, B00001 },//Ц
    { B10001, B10001, B10001, B01111, B00001, B00001, B00001, B00000 },//Ч
    {  B00000, B10101, B10101, B10101, B10101, B10101, B10101, B11111 },//Ш
    { B10101, B10101, B10101, B10101, B10101, B10101, B11111, B00001 },//Щ
    {  B00000, B10000, B10000, B10000, B11110, B10001, B10001, B11110 },//Ь
    { B11000, B01000, B01110, B01001, B01001, B01001, B01110, B00000 },//Ъ
    { B10001, B10001, B10001, B11101, B10101, B10101, B11101, B00000 },//Ы
    {  B00000, B11110, B00001, B00001, B01111, B00001, B00001, B11110 },//Э
    { B10111, B10101, B10101, B11101, B10101, B10101, B10111, B00000 },//Ю
    { B01111, B10001, B10001, B01111, B10001, B10001, B10001, B00000 },//Я
  };
  static char chars[] = {'Б', 'Г', 'Д', 'Ё', 'Ж', 'З', 'И', 'Й', 'Л', 'П', 'У', 'Ф', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ъ', 'Ы', 'Э', 'Ю', 'Я'};
  static byte empty[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
  int index = 0, cl = sizeof(chars) / sizeof(char), i, j, symb;
  memset(addon_letters, 0, sizeof(addon_letters));
  for ( j = 0; j < strlen(letters_use) && j < 16; j++ )
    lcd.createChar(j, empty);

  for ( j = 0; j < strlen(letters_use) && j < 16; j++ )
  {
    symb = -1;
    for ( i = 0; i < cl; i++ ) if ( chars[i] == letters_use[j] ) {
        symb = i;
        addon_letters[index] = letters_use[j];
        break;
      }
    if ( symb != -1 ) {
      lcd.createChar(index, letters[symb]);
      index++;
    }
  }
}
////////////////////////////////////////////////////////////////////
// print russian chars
////////////////////////////////////////////////////////////////////
void print_rus(char *str) {
  static char rus_letters[] =   {'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я' };
  static char trans_letters[] = {'A', 0x80, 'B', 0x92, 0x81, 'E', 0xCB, 0x82, 0x83, 0x84, 0x85, 'K', 0x86, 'M', 'H', 'O', 0x87, 'P', 'C', 'T', 0x88, 0xA2, 'X', 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x62, 0x8F, 0xAC, 0xAD};
  int lcount = sizeof(rus_letters) / sizeof(char), i, j;
  for ( i = 0; i < strlen(str); i++ )
  {
    if ( byte(str[i]) == 208 ) continue; // 208 ignore
    int found = 0;
    for (j = 0; j < 16; j++) if ( addon_letters[j] != 0 && byte(str[i]) == byte(addon_letters[j]) ) {
        lcd.write(j);
        found = 1;
        break;
      }
    if (!found) for (j = 0; j < lcount; j++) if ( byte(str[i]) == byte(rus_letters[j]) ) {
          lcd.write(trans_letters[j]);
          found = 1;
          break;
        }
    if (!found) lcd.write(byte(str[i]));
  }
}
void print_rus(int x, int y, char *str) {
  lcd.setCursor(x, y);
  print_rus(str);
}
////////////////////////////////////////////////////////////////////



static byte degree[8] = { B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 };// Значок градуса

void setup() {
  lcd.begin(20, 4); // Задаём режим работы индикатора: 4 строки по 20 символов

  lcd.command(1);  //очистка дисплея  команда 4-4-1
  lcd.command(12);  // включить дисплей
  // Команды не нужны, работает без них

  init_rus("ДЭШЩФЬЁ"); // Загружаем нужные символы в программируемые ячейки (максимум 8 символов)
  lcd.createChar(7, degree);
  print_rus(0, 0, "ТЕМПЕРАТУРА:20.6 С");
  print_rus(0, 1, "1234567890()+-={}[]/");
  print_rus(0, 2, "АБВГДЕЁЖЗИЙКЛМНОПРСТ");
  print_rus(0, 3, "УФХЦЧШЩЪЫЬЭЮЯ");
  lcd.setCursor(19, 3);
  lcd.write(0xa4);

}

void loop() {
  //-----------------
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  //delay(750);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1] << 8) + data[0];
  Temp = Temp >> 4;
  //                lcd.setCursor(12,0);
  //                lcd.print(Temp);
  //                lcd.write(7);
  //                lcd.print("C  ");
  //-----------------

  for (m = 1; m < 5; m++)
  {
    for (n = 1; n < 4; n++)
    {
      lcd.command(0b00011100);   //команда 4-4-5 подвигаем весь экран вправо
      delay(100);
    }
    for (n = 1; n < 4; n++)
    {
      lcd.command(0b00011000);    //команда 4-4-5 подвигаем весь экран влево
      delay(100);
    }
  }

  delay(1500);
  for (n = 1; n < 5; n++)
  {
    lcd.command(0b00001000);   //команда 4-4-4 выключим дисплей
    delay(100);
    lcd.command(0b00001100);   //команда 4-4-4 включим дисплей
    delay(100);
  }

   delay(1500);

    for (n=1;n<3;n++){

    lcd.command(0b00101101);  //команда 4-4-6  установка яркости 75%
    delay(200);
    lcd.command(0b00101110);  //команда 4-4-6  установка яркости 50%
    delay(200);
    lcd.command(0b00101111);  //команда 4-4-6  установка яркости 25%
    delay(200);
    lcd.command(0b00101110);  //команда 4-4-6  установка яркости 50%
    delay(200);
    lcd.command(0b00101101);  //команда 4-4-6  установка яркости 75%
    delay(200);
    lcd.command(0b00101100);  //команда 4-4-6  установка яркости 100%
    delay(200);
    }
    delay(1000);

//    lcd.command(0b00000001);   //очистка дисплея
//    delay(100);

  lcd.command(0b00001101);   // Мигающий прямоугольник (команда 4-4-4)
  for (n = 0; n < 20; n++)
  {
                  lcd.setCursor(n,0);
    delay(200);
  }
  lcd.command(0b00001110);   // Курсор (команда 4-4-4)
  for (n = 0; n < 20; n++)
  {
                  lcd.setCursor(n,1);
    delay(200);
  }
  lcd.command(0b00001111);   // Курсор и мигающий прямоугольник (команда 4-4-4)
  for (n = 0; n < 20; n++)
  {
                  lcd.setCursor(n,2);
    delay(200);
  }
    lcd.command(0b00001100);   // Курсор выключен (команда 4-4-4)
    delay(200);

}
 

Александр_Е

✩✩✩✩✩✩✩
12 Фев 2022
2
0
Огромное спасибо! буду вникать, я думаю что разберусь, тоже есть желание напрямую подключить, i2c у меня в комплекте с 1602 был, пришлось разобрать, на контроллере портов свободных много. завтра попробую. сегодня уже все в корпус собрал, при дневном свете практически невидно, в темноте огонь!IMG_20220213_183611.jpg