Обсуждаем контроллеры компании Atmel.
Ответить

Помогите с кодом на си для AVR (Atmega8)

Вт ноя 29, 2022 19:59:20

Добрый вечер всем кто тут!
Мужики помогите пожалуйста с кодом.
Хочу научить дисплей LCD1602A выводить наши буквы.
Уже 3 дня не получается с написанием функции для записи в CGRAM.
А потом вывода из неё результата.
Если с латиницей всё хорошо идёт то с нашим ну блин беда.
Прям упёрся в стену и всё!
Помогите кто знает как это делается.
Просто у кого есть время кто решал такие задачки и если не тяжело.
Спасибо!
Вложения
4.png
(66.98 KiB) Скачиваний: 45
3.png
(32.6 KiB) Скачиваний: 43
2.png
(37.35 KiB) Скачиваний: 44
1.png
(78.06 KiB) Скачиваний: 46

Re: Помогите с кодом на си для AVR (Atmega8)

Вт ноя 29, 2022 20:18:08

Модель дисплея в Протеусе может без проблем выводить "наши" буквы так же как и "ненаши". Откройте документацию на дисплей и посмотрите таблицу символов, вот они:
Изображение
а таблица перекодировки из ANSI вот такая:
Код:
const uint8_t ruscode[] = {0x41, 0xA0, 0x42, 0xA1, 0xE0, 0x45, 0xA3, 0xA4,
                          0xA5, 0xA6, 0x4B, 0xA7, 0x4D, 0x48, 0x4F, 0xA8,
                          0x50, 0x43, 0x54, 0xA9, 0xAA, 0x58, 0xE1, 0xAB,
                          0xAC, 0xE2, 0xAD, 0xAE, 0x62, 0xAF, 0xB0, 0xB1,

                          0x61, 0xB2, 0xB3, 0xB4, 0xE3, 0x65, 0xB6, 0xB7,
                          0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0x6F, 0xBE,
                          0x70, 0x63, 0xBF, 0x79, 0xE4, 0x78, 0xE5, 0xC0,
                          0xC1, 0xE6, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7};


Соответственно ф-ция вывода на дисплей такова:
Код:
/** ----------
 * @brief   Вывод символов на дисплей в строку.
 * @param line - номер строки (0, 1, 2 , 3)
 * @param pos - номер позиции (0 - 20)
 * @param *buf - буфер данных
 * @param size - число выводимых символов
 * @param transcode - запрос перекодировки
 */
void HD44780_Print(uint8_t line, uint8_t pos,
               char *buf, uint8_t size, uint8_t transcode)
{
   uint8_t addr;
   uint8_t ch;

   switch(line){
      case 0: addr = (DDRAM_ADDR | 0) + pos;    break;
      case 1: addr = (DDRAM_ADDR | 0x40) + pos; break;
      case 2: addr = (DDRAM_ADDR | 0x10) + pos; break;
      case 3: addr = (DDRAM_ADDR | 0x50) + pos; break;
   }

   /* установка начального адреса */
   WAIT();
   HD44780_IO_Write(addr, HD44780_CMDMODE);

   /* вывод символов */
   while(size--)
   {
      /* перекодировка по запросу */
      if(transcode)
      {
         switch(*buf){
         case 'А'...'Я': ch = ruscode[*buf - 'А'];
            break;
         case 'а'...'я': ch = ruscode[*buf - 'а' + 32];
            break;
         case 'Ё': ch = 0xA2;
            break;
         case 'ё': ch = 0xB5;
            break;
         default: ch = *buf;
            break;
         }
      }else
         ch = *buf;

      WAIT();
      HD44780_IO_Write(ch, HD44780_DATAMODE);
      buf++;
   }
}

Re: Помогите с кодом на си для AVR (Atmega8)

Вт ноя 29, 2022 22:26:37

Хочу научить дисплей LCD1602A выводить наши буквы.

Покупаешь дисплей МЕЛТ или WINSTAR и не надо выносить себе мозг… к тому же 8 пользовательских символов (это максимум что можно записать) не позволят полноценно "писать" на кириллице… :dont_know:
Последний раз редактировалось VNS Вт ноя 29, 2022 22:30:07, всего редактировалось 1 раз.

Re: Помогите с кодом на си для AVR (Atmega8)

Вт ноя 29, 2022 22:29:01

Почему 8? Перед печатью загрузите недостающий символ и отобразите его. Потом другой и так далее. Максимум - да, их 8 . Но замените уже изображенные. Можно все, можно много. Даже можете рисовать псевдо-графики, а также псевдо-фигуры. Правда - медленнее, но куда мы торопимся... Печать на LCD концептуально медленная операция - статичных текстов больше.
Последний раз редактировалось veso74 Вт ноя 29, 2022 22:35:47, всего редактировалось 1 раз.

Re: Помогите с кодом на си для AVR (Atmega8)

Вт ноя 29, 2022 22:35:32

Почему 8?

1.png
(19.73 KiB) Скачиваний: 46

Re: Помогите с кодом на си для AVR (Atmega8)

Вт ноя 29, 2022 22:40:36

Максимальное количество вместе - да, 8, но ... вставляете новый символ, печатаете, вставляете на его место другой, печатаете ... до бесконечности, много символов.

Re: Помогите с кодом на си для AVR (Atmega8)

Вт ноя 29, 2022 22:43:40

но ... вставляете новый символ, печатаете, вставляете на его место другой, печатаете ... до бесконечности, много символов.

Предлагаете каждый раз перед выводом текста записывать новые символы? Это же мазохизм… :)) и так порой вывод надписей порой занимает много места в программе при больших меню, а если ещё и это делать, так вообще… :facepalm: хотя кто на что горазд… можно и так если скучно… :)

Re: Помогите с кодом на си для AVR (Atmega8)

Вт ноя 29, 2022 22:45:31

Только новые символы в знако-генераторе, конечно же. И псевдо-графики. Согласно приложению. Памяти совсем немного занимает, и в PIC собираются, и в ATmega, и в "бедных" ATtiny.
Последний раз редактировалось veso74 Вт ноя 29, 2022 23:06:33, всего редактировалось 1 раз.

Re: Помогите с кодом на си для AVR (Atmega8)

Вт ноя 29, 2022 23:06:13

Если использовать заглавные и прописные буквы, то придётся прописывать в итоге 47 символов… из своего непрофессионального опыта, это достаточно много… возможно у профессионалов это занимает мало места… спорить не стану… лично у меня при выводе много текста, программы становятся большими, а если использовать что-то подобное, то вообще выйдет за гранью… :))
Последний раз редактировалось VNS Вт ноя 29, 2022 23:09:40, всего редактировалось 1 раз.

Re: Помогите с кодом на си для AVR (Atmega8)

Вт ноя 29, 2022 23:08:53

Оффтоп: Вы отправляете литературное эссе каждый день в LCD1602? :) Мне не приходилось.

Однако вернемся к приложению LCD: вероятно только несколько слов, как параметры какого-то устройства, одно за другим, медленно, статично ...

Re: Помогите с кодом на си для AVR (Atmega8)

Вт ноя 29, 2022 23:26:07

Дело не в скорости вывода символов, а в увеличении программы при наличии расширенного меню, в котором будет много текста…
В общим я не утверждаю, что так у всех… но у меня происходит именно так… :) и если планируется обширное меню, то я выбираю дисплей с кириллицей, а не танцы с бубном… :))) в общим каждый выбирает своё… :beer:

Re: Помогите с кодом на си для AVR (Atmega8)

Вт ноя 29, 2022 23:31:31

А что страшного в том, чтобы шрифты во флеш-памяти МК хранить? Один шрифт в знакоместо 16х16 пикселей займет 33кБ (32кБ - данные + 1Б - ширина символа). Все 256 символов никому не нужны обычно, хватит нескольких знаков препинания, латинницы и кириллицы. Ну и зачастую хватит только верхнего регистра, получаем (26+10+33+30)*33=3267Б + 256Б на таблицу перекодировки. Итого: 3523Б. Т.е. в 4кБ можно вполне уложиться. Когда на МК от 16кБ флеша и больше, вообще 0 проблем на шрифт немного потратить.

Re: Помогите с кодом на си для AVR (Atmega8)

Ср ноя 30, 2022 01:49:51

Оффтоп: Вы отправляете литературное эссе каждый день в LCD1602? :) Мне не приходилось.

Нет, зачем же… а вот ради интереса сможете на практике показать в виде прошивки для тини24 – вывод заглавных и прописных букв кириллицы в определённом порядке? Я бы составил ТЗ на такой случай, которое бы в моём исполнении ушло примерно 90% памяти МК… а вот интересно с Вашим подходом сколько уйдёт? И влезет ли вообще в данный МК… если откажитесь так как некогда заниматься ерундой, то я пойму… так что скажете? :)

ЗЫ у меня есть китаец 1602 с таким модулем (PCF8574)...

Хорошо бы его задействовать для проверки... :)

Re: Помогите с кодом на си для AVR (Atmega8)

Ср ноя 30, 2022 04:12:18

По моему уже было.
https://www.youtube.com/watch?v=pqv48FtHm0E
https://www.youtube.com/watch?v=bN-XRXLx88Y

Re: Помогите с кодом на си для AVR (Atmega8)

Ср ноя 30, 2022 05:24:00

Дело не в реализации… интересно сколько весит такая реализация? И если значительно много, то возникает вопрос, а зачем?

Re: Помогите с кодом на си для AVR (Atmega8)

Ср ноя 30, 2022 08:01:14

Максимальное количество вместе - да, 8, но ... вставляете новый символ, печатаете, вставляете на его место другой, печатаете ... до бесконечности, много символов.

а вы сами так делали, или теоретизируете?
насколько я знаю, как только вы обновили символ с кодом, предположим, 0х01, то на дисплее все позиции с этим кодом будут показывать обновленный символ, так что "до бесконечности" не выйдет - максимум 8 разных одновременно

Re: Помогите с кодом на си для AVR (Atmega8)

Ср ноя 30, 2022 11:37:43

Мужики. Давайте я скину библиотеку свою ( что я использую ) вы посмотрите её и может быть подскажете как мне в ней добавить функцию записи в CGRAM и вывода оттуда?

Добавлено after 2 minutes 47 seconds:
https://disk.yandex.ru/d/_GpvOVhqz-JXTA
вот ссылка на неё на диске.

Re: Помогите с кодом на си для AVR (Atmega8)

Ср ноя 30, 2022 12:29:34

Вроде ведь в этих экранах нет 2го кеша... т.е. если какой-то символ на экране взят из перезаписываемой области, то при перезаписи этой области он тоже изменится, даже если его не обновляли и из-за этого на экран не вывести более 8 различных не имеющихся в основной памяти символа... Это сильно усложняет и без того нелегкую с ним работу по выводу графики и нестандартных символов. Вроде так?
Поправьте, если не прав...

Re: Помогите с кодом на си для AVR (Atmega8)

Ср ноя 30, 2022 12:47:22

... не выйдет - максимум 8 разных одновременно

Да, Вы прав. Я неправильно понял (РУ-БГ). Максимум 8 НОВЫЕ символы одновременно в 32 символа на LCD1602. Однако это могут быть все буквы, если не перекрываются одновременно. А вот с тем, что на маленьком дисплее часто надписи в сокращенной форме, использование возможно без конфликтов. Лично избегаю кириллицы.

Re: Помогите с кодом на си для AVR (Atmega8)

Ср ноя 30, 2022 14:47:46

Так можно взять нормальный SPI'ный (а то и с параллельной шиной) экранчик, да гонять буфер. И шрифты будут свои — какие хочешь. А на МК с DMA вообще камень практически напрягать не нужно будет, чтобы экран обновить.
Ответить