Конвертер кириллицы для текстовых дисплеев МЭЛТ

Тема в разделе "Глядите, что я сделал", создана пользователем NosefU, 30 ноя 2014.

  1. NosefU

    NosefU Нерд

    Поскольку вывод кириллицы на дисплеях производства МЭЛТ - задача не совсем тривиальная (см пример), мной была разработана небольшая программка, конвертирующая текст в понятный дисплею набор кодов, который останется передать функции lcd.print().
    [​IMG]
    Написана программа на Delphi, код полностью комментирован. В прилагаемом архиве лежат исходники и готовая к употреблению программа. Вирусов нет.
    Таким образом программа поддерживает кириллицу (русский, украинский и белорусский), латиницу и некоторый набор знаков (всю кодовую таблицу не проверял).

    Надеюсь, программа окажется кому-то полезной.

    Скачать .exe с исходниками можно по этой ссылке
    Скачать только .exe можно по этой ссылке
    (сюда почему-то файлы не прикрепляются)
    Текст исходника c комментариями на Pastebin

    [​IMG]
    [​IMG]
     
    Последнее редактирование: 30 ноя 2014
    null, DrProg, Salk и ещё 1-му нравится это.
  2. Alex19

    Alex19 Гуру

    Полезная вещь.

    Давно было дело, когда воевал с данным монитором.
    Вот код, который использовал, но только для Русского языка.

    Код (Text):

    int const rusKeysArraySize = 80; // Переменная размер массива для отображения символов на русском
    // Массив для отображения символов на русском
    char rusKeys[rusKeysArraySize] = {
      'а','б','в','г','д','е',
      'ё','ж','з','и','й','к',
      'л','м','н','о','п','р',
      'с','т','у','ф','х','ц',
      'ч','ш','щ','ъ','ы','ь',
      'э','ю','я',
      'А','Б','В','Г','Д','Е',
      'Ё','Ж','З','И','Й','К',
      'Л','М','Н','О','П','Р',
      'С','Т','У','Ф','Х','Ц',
      'Ч','Ш','Щ','Ъ','Ы','Ь',
      'Э','Ю','Я',' ','.',',',
      ':',
      '0','1','2','3','4','5',
      '6','7','8','9'
    };

    // Массив кодов для отображения символов на русском стр. 0
    char* rusCodeKeys[rusKeysArraySize] = {
      "\x61", // a
      "\xB2", // б
      "\xB3", // в
      "\xB4", // г
      "\xE3", // д
      "\x65", // е
      "\xB5", // ё
      "\xB6", // ж
      "\xB7", // з
      "\xB8", // и
      "\xB9", // й
      "\xBA", // к
      "\xBB", // л
      "\xBC", // м
      "\xBD", // н
      "\x6F", // о
      "\xBE", // п
      "\x70", // р
      "\x63", // с
      "\xBF", // т
      "\x79", // у
      "\xE4", // ф
      "\x78", // х
      "\xE5", // ц
      "\xC0", // ч
      "\xC1", // ш
      "\xE6", // щ
      "\xC2", // ъ
      "\xC3", // ы
      "\xC4", // ь
      "\xC5", // э
      "\xC6", // ю
      "\xC7", // я
      "\x41", // А
      "\xA0", // Б
      "\x42", // В
      "\xA1", // Г
      "\xE0", // Д
      "\x45", // Е
      "\xA2", // Ё
      "\xA3", // Ж
      "\xA4", // З
      "\xA5", // И
      "\xA6", // Й
      "\x4B", // К
      "\xA7", // Л
      "\x4D", // М
      "\x48", // Н
      "\x4F", // О
      "\xA8", // П
      "\x50", // Р
      "\x43", // С
      "\x54", // Т
      "\xA9", // У
      "\xAA", // Ф
      "\x58", // Х
      "\xE1", // Ц
      "\xAB", // Ч
      "\xAC", // Ш
      "\xE2", // Щ
      "\xAD", // Ъ
      "\xAE", // Ы
      "\x08", // Ь
      "\xAF", // Э
      "\xB0", // Ю
      "\xB1", // Я
      "\x20", // Пробел
      "\x2E", // .
      "\x2C", // ,
      "\x3A", // :
      "\x30", // 0
      "\x31", // 1
      "\x32", // 2
      "\x33", // 3
      "\x34", // 4
      "\x35", // 5
      "\x36", // 6
      "\x37", // 7
      "\x38", // 8
      "\x39" // 9
    };

    // Массив кодов для отображения символов на русском стр. 1
    char* rusCodeKeysSec[rusKeysArraySize] = {
      "\xE0", // a
      "\xE1", // б
      "\xE2", // в
      "\xE3", // г
      "\xE4", // д
      "\xE5", // е
      "\xB8", // ё
      "\xE6", // ж
      "\xE7", // з
      "\xE8", // и
      "\xE9", // й
      "\xEA", // к
      "\xEB", // л
      "\xEC", // м
      "\xED", // н
      "\xEE", // о
      "\xEF", // п
      "\xF0", // р
      "\xF1", // с
      "\xF2", // т
      "\xF3", // у
      "\xF4", // ф
      "\xF5", // х
      "\xF6", // ц
      "\xF7", // ч
      "\xF8", // ш
      "\xF9", // щ
      "\xFA", // ъ
      "\xFB", // ы
      "\xFC", // ь
      "\xFD", // э
      "\xFE", // ю
      "\xFF", // я
      "\xC0", // А
      "\xC1", // Б
      "\xC2", // В
      "\xC3", // Г
      "\xC4", // Д
      "\xC5", // Е
      "\xA8", // Ё
      "\xC6", // Ж
      "\xC7", // З
      "\xC8", // И
      "\xC9", // Й
      "\xCA", // К
      "\xCB", // Л
      "\xCC", // М
      "\xCD", // Н
      "\xCE", // О
      "\xCF", // П
      "\xD0", // Р
      "\xD1", // С
      "\xD2", // Т
      "\xD3", // У
      "\xD4", // Ф
      "\xD5", // Х
      "\xD6", // Ц
      "\xD7", // Ч
      "\xD8", // Ш
      "\xD9", // Щ
      "\xDA", // Ъ
      "\xDB", // Ы
      "\xDC", // Ь
      "\xDD", // Э
      "\xDE", // Ю
      "\xDF", // Я
      "\x20", // Пробел
      "\x2E", // .
      "\x2C", // ,
      "\x3A",  // :
      "\x30", // 0
      "\x31", // 1
      "\x32", // 2
      "\x33", // 3
      "\x34", // 4
      "\x35", // 5
      "\x36", // 6
      "\x37", // 7
      "\x38", // 8
      "\x39" // 9
    };

    void setup()
    {
      Serial.begin(9600);
    }

    void loop()
    {
      WriteOnLedGetRusText("Нажмите старт");
      delay(1000);
    }

    // Пишем по русски, на Led мониторе
    void WriteOnLedGetRusText(String text)
    {
      int const iBufferLength = text.length()+1;
      char cBuffer[iBufferLength];
      text.toCharArray(cBuffer, iBufferLength);

      for (int i=0; i < iBufferLength-1; i++)
      {
        int keyArray = -1;
        for (int ia=0; ia < rusKeysArraySize; ia++)
        {
          if (rusKeys[ia] == cBuffer[i])
          {
            keyArray = ia;
            ia = rusKeysArraySize;
          }
        }

        if (keyArray == -1)
        {
          // Ошибка
          //Serial.println(cBuffer[i]);
        }
        else
        {
          //lcd.print(rusCodeKeys[keyArray]);
        }
      }
    }
     
    В документации 2 страницы с кодами символов, а вот какая, когда используется уже не припомню. Иногда работал rusKeys, иногда rusCodeKeysSec:). Особо не разбирался, если не будет работать, поменяйте в коде rusKeys на rusCodeKeysSec.

    С мониторами МЭТЛ, у меня не сложилось, очень плохая подсветка. Плохо видно из далека. Но если не далеко все нормально.

    Ваша программа, будет полезна, для хранения теста, например на флешке. Код выше, для динамического написания текста.
     
    Последнее редактирование: 30 ноя 2014
    ИгорьК и NosefU нравится это.
  3. Megakoteyka

    Megakoteyka Оракул Модератор

  4. Alex19

    Alex19 Гуру

    У меня такое же сообщение.
     
  5. NosefU

    NosefU Нерд

    Хром возомнил себя антивирусом... Похвально, но криво реализовано. Да и проблема не нова. Даже на антивирусы ругается.
    Прикрепил к первому посту отчет вирустотала о проверке архива с исходниками, и ссылку на .exe без исходников.

    Когда появляется такое сообщение - переходите в Хроме в Загрузки, жмёте отмеченные пункты:
    [​IMG]
     
  6. NosefU

    NosefU Нерд

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

    Спасибо за функцию, утащил себе, если вы не против)

    В моем случае (я не стал с массивами колдовать) функция, если не находит кода для символа, возвращает его как есть. По-умолчанию экран работает с нулевой страницей знакогенератора, на которую я и ориентировался. В шапку добавил ссылку на pastebin с исходником
     
  7. Salk

    Salk Гик

    Круто, у меня спокойно качается, и ESET Nod не ругается, а вот Win 8 при запуске программы пишет: атятятя, осторожно, может быть бяка с вирусом. Но можно принудительно запустить. Классная вещь, думаю многим пригодится, кто захочет сэкономить время. Я пользовался такой таблицей и в ручную вбивал все символы
    http://files.amperka.ru/datasheets/MT-16S2H.pdf
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Возможно, http://rghost.ru/ просто засветился на распространении бяки и попал в черный список.

    И раз уж речь пошла о вирусах. Когда я писал на дельфях, был забавный вирус, который находил на компе каталог с установленной дельфи и правил один из .pas файлов, который используется во всех проектах. В итоге любая программа, скомпилированная на зараженном компе (даже если сам вирус уже был вылечен), содержала в себе заразу. Восстановление файла решало проблему. Весело было.

    А зачем столько if ... else, чем case не угодил?
     
    Последнее редактирование: 30 ноя 2014
  9. NosefU

    NosefU Нерд

    Вин8, как и семерка, ругается на всё скачанное даже из локалки, если оно не подписано сертификатом доверенного корневого центра.

    Начал писать на лазарусе (как раз через кейс), но у него вскрылся косяк с кириллицей: ord любого кириллического символа возвращает 208. Обнаружил я это, когда почти всё было готово. Думал обойти через if...else, но и тут меня ждала засада: в подпрограммы вместо символов передается то же самое. Мигрировал на делфи, но переписывать обратно стало уже влом, поэтому оставил так. Может, когда-нибудь я этот кусок перепишу по-человечески, но пока он работает и есть не просит
     
  10. Alex19

    Alex19 Гуру

    Конечно, не против:).
     
  11. MaxPower

    MaxPower Нуб

    Большое спасибо за программу!