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

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

Ср ноя 30, 2022 15:03:54

Попробуйте так

Код:
// в дефайны
const unsigned char updown_symbols[] = {
   0x04, 0x0e, 0x15, 0x04, 0x04, 0x04, 0x04, 0x00,
   0x04, 0x04, 0x04, 0x04, 0x15, 0x0e, 0x04, 0x00
};
#define LCD_CGRAM             6      /* DB6: set CG RAM address             */
...

  // в майн
  // загрузка знакогенератора (символы "стрелка вверх" и "стрелка вниз")
  LCDcommand((1<<LCD_CGRAM));
  for(a=0; a<16; a++) {
    LCDdata(updown_symbols[a]);
  }

  LCDdata(0); LCDdata(1); // вывод на экран загруженных стрелочек




Данный пример выдернул из рабочей поделки, грузит только 2 символа (стрелочки)
Но как писали коллеги выше, только 8 символов можно загрузить одновременно

ps

и вроде как, если биты порта идут по порядку, в библиотеке это место:

Код:
if ((i&1)==1)
{
   DPORT|=(1<<DB0);
}
i=i>>1;

if ((i&1)==1)
{
   DPORT|=(1<<DB1);
}
i=i>>1;

if ((i&1)==1)
{
   DPORT|=(1<<DB2);
}
i=i>>1;

if ((i&1)==1)
{
   DPORT|=(1<<DB3);
}
i=i>>1;

if ((i&1)==1)
{
   DPORT|=(1<<DB4);
}
i=i>>1;

if ((i&1)==1)
{
   DPORT|=(1<<DB5);
}
i=i>>1;

if ((i&1)==1)
{
   DPORT|=(1<<DB6);
}
i=i>>1;

if ((i&1)==1)
{
   DPORT|=(1<<DB7);
}


можно вполне заменить на:
Код:
   DPORT = i;

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

Ср ноя 30, 2022 15:20:15

aleksey chilov, написание/исправление чужого кода - это работа в 3 раза больше: сначала программист-помощник должен понять, как Вы написал метод, например. по pdf, потом что Вы пропустили или накосячили, в-третьих: с Ваши уже сделани готовые функции программист-помощник должен написать новые функции. Лучше всего находите свой пропуск самостоятельно :).

Что я вижу: Вы загружаете букву 'Д' в ячейку 0 в CGRAM. ОК.
Второе: Вызовите знак 'Д'. А компилятор еще не знает, что это 'Д'. Он знает, что есть data в ячейка 0.
На более позднем этапе, если необходимо, в другой функции свяжете ячейку 0 с 'Д'.

Вместо LCDstring("Д", 3, 0) попробуйте LCDdata(uint8_t(0)); 'Д' должен загореться.
---
И вопрос: в стремлении к универсальности: действительно ли Вам нужны все эти функции для работы с LCD-дисплеем? Обнаружил, что для "малых" и "средних" МК лучше всего подходит конкретное написание, без универсальности.
Последний раз редактировалось veso74 Ср ноя 30, 2022 15:30:29, всего редактировалось 4 раз(а).

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

Ср ноя 30, 2022 15:24:12

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

Я не знаю Си, :dont_know: потому могу только на словах рассказать как записывается пользовательский символ… :) ну а как его выводить на экран, так это как и все остальные символы согласно указанного адреса… обычно применяют два способа вывода символа на экран:
1 указывают непосредственно адрес знака.
2 компилятор сам подставляет адрес знака согласно кодировке ASCII.

Второй способ применяется когда в программе символ указан в кавычках (к примеру "D") и тогда компилятор в место символа вставляет соответствующий код ASCII, это будет $44 (68)… в дисплее стандартные символы латиницы соответствуют кодам ASCII, но чтобы выводить и иные символы, то лучше указывать непосредственно адрес напрямую… то есть если записали допустим пользовательский символ Ж по адресу $00 то чтобы его вывести на экран, необходимо указывать непосредственно этот адрес $00 где непосредственно находится данный символ… ежели написать в кавычках данный символ ("Ж"), то компилятор подставит соответствующий код ASCII, а это соответственно будет $86 (134)… в индикаторе по данному адресу (если память полностью задействована) окажется другой знак, но в большинстве случаях по данному адресу ничего нет и тогда на экран будет выведен как бы пробел (нет символа)…

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

Чт дек 01, 2022 16:52:22

Добрый вечер участникам!
Снова прошу пощи.
Как вывести русский символ я уже понял.
А вот как вывести строку из двухмерного массива ну ни как не получается.
Что-то делаю не так.
Подсобите пожалуйста кому не сложно.
Фотки кода который используется я приложил.
Не могу функцию LCD_string переточить для вывода из массива кириллицы. :shock:

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

Чт дек 01, 2022 17:10:49

А.. чо, это новая тема? А где та, предыдущая то? Я там как раз выкладывал таблицу перекодировки из ANSI в раскладку дисплея.

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

Чт дек 01, 2022 17:12:23

... Как вывести русский символ я уже понял.

Расскажите и нам, пожалуйста. Нам тоже интересно. Иначе смысла в форумах нет (как ето уже писал в другом сообщении).

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

Чт дек 01, 2022 17:45:27

У меня LCD без кириллицы.

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

Чт дек 01, 2022 18:43:14

Способы, комментариях были для кириллицы в LCD без кириллицы.
Последний раз редактировалось veso74 Пт дек 02, 2022 04:31:03, всего редактировалось 1 раз.

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

Чт дек 01, 2022 19:25:09

А что за функция WAIT(); ????

Добавлено after 2 minutes 9 seconds:
Что она выполняет?

Добавлено after 5 minutes 30 seconds:
_delay() или что значит ждать????

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

Чт дек 01, 2022 19:55:56

Это макрос. В зависимости от того, используется ли ножка RW (чтение/запись) дисплея или нет, вызывается либо чтение дисплея до тех пор, пока бит BF не уйдет, либо если RW-ножка не используется, то в WAIT стоит небольшая задержка для того, чтобы в дисплей не писалось быстрее, чем он может принимать. На практике - 43 мкс минимум для всех команд и данных кроме двух.
В принципе, если МК работает медленно, на 8 МГц, то можно не использовать задержек, там и так всё уложится.

Да, но это был код для дисплея С КИРИЛЛИЦЕЙ! А раз в вашем дисплее её нет, то он не подойдет. Вернее, подойдет только в части вывода латиницы.

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

Чт дек 01, 2022 22:45:05

Смотря где массив строки расположен.
Или это стандартные сообщения из ПЗУ или специальный раздел "подставной строки" в ОЗУ.
У АВРок разное обращение к таким массивам...
:roll:

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

Пт дек 02, 2022 04:27:04

aleksey chilov, в поисках фрагмента кода, который Вы предоставили, я наткнулся вероятно на авторскую страницу кода. Можете найти информацию полезной. В приведенном примере LCD дисплей печатает массив кириллических букв.

Библиотека на СИ, для LCD дисплеев на базе процессора HD44780, для микроконтроллеров AVR
Перед использованием функции LCDline_of_flash, нужно фо флеш память вклинить например такую строку в конце не забываем символ 0 вставить, иначе эта функция
выведет на дисплей всю флеш память МК.

const uint8_t text[] PROGMEM = {0x20,0xA8,0x70,0xB8,0xB3,0x65,0xBF,0x20,0xE3, 0x65,0xBF,0xBA,0x61,0x21,0};//Привет детка!

Потом эту строку из флеша выводим на LCD так:
LCDline_of_flash(text,0,1);//В позицию 0,1 на русском выведется Привет детка!, если твой LCD поддерживает русские символы.

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

Пт дек 02, 2022 19:23:18

Здравствуйте форумчане опять!
Блин ну ни как!
Научился выводить по 1-й букве.
Где-то прочитал где-то под смотрел что-то изменил и вроде выводит
Русские символы но только по 1-му.
А вот как зарядить функцию чтоб я мог в неё предать допустим номера массива и
чтоб она прописала все 64 бита в CGRAM 0x00-0x07 а потом вытащить ну вообще не вариант!
Ни как! всё сыпется всё валится компилятор скоро нах*й меня начнёт по Русски посылать!
Вопрос, как сделать функцию?
Пример кода. Можно организовать? Хоть посмотреть как это правильно делают...

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

Пт дек 02, 2022 20:14:49

Возможно, стоит потренироваться передавать массив в функцию, прочитав вначале в книжке Кернигана "Язык программирования Си" как это делается.
Допустим имеем маасив байтов char array[10], и нам их надо передать в функцию.
Запишем функцию так:
Код:
void Function(char *input)
{
   /* всё, мы приняли указатель на массив *input, теперь можем работать с ним */
   Write(*input); // отправляем в функцию Write первый байт принятого массива
   input++;  // передвигаем указатель на следующий байт массива   
   Write(*input); // отправляем второй байт массива
    input++;  // передвигаем указатель на следующий байт
   /* и так дальше. Можем сделать это в цикле for от 0 до числа байт принятого массива */
}

А можно записать немного иначе, вот так:
Код:
void Function(char *input)
{
   /* а тут с указателем можем работать через индексы как с обычным массивом: */
   Write(input[0]);
   Write(input[1]);
   Write(input[2]);
     /* или в цикле for */
}

И передаем массив в функцию, имя массива служит его адресом:
Код:
Function(array);

а если хотим передать в функцию массив не с его начала, а с некоторого энного элемента, надо прямо указать адрес этого элемента через его индекс:
Код:
Function(&array[2]);  // передать массив, начиная с третьего элемента (индекс 2)

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

Пт дек 02, 2022 20:25:46

Ну это уже ближе к теме!
Спасибо. Сейчас над этим подумаю.

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

Вс дек 04, 2022 13:32:18

Добрый день!
Как можно переписать функцию чтоб выводить строку?
Я там пробовал но не получается.
Посмотрите видео пожалуйста.
https://disk.yandex.ru/i/2k4sZP3Rzrh99Q
https://disk.yandex.ru/i/guyTx3f12I4l2g
Видео яндекс диск.

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

Вс дек 04, 2022 15:00:37

охренеть! чтобы разобраться с кодом надо видео смотреть!

Добавлено after 2 minutes 10 seconds:
если строка s, а функция вывода символа put, то функция вывода строки будет такой: while(*s) put(*s++);

Добавлено after 1 minute 34 seconds:
видео не смотрел

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

Вс дек 04, 2022 15:23:34

видео не смотре

А зря! Там был раскрыт секрет "как сделать невидимой инфо на дисплее" :)))

Вообще же, работа с текстовой строкой аналогична работе с массивом при передаче его в фукнцию. Потому как текстовая строка в Си представляет собой массив элементов типа char. Чтобы понять, как это все работает, нужно прочитать в книжке про арифметику указателей и про работу с ними вообще.
А дисплей-двухстрочник сам по себе имеет механизм автоинкремента позиции выводимого символа и ему не надо вручную указывать новую позицию.

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

Вт дек 06, 2022 07:52:23

Доброе утро всем!
Я тут чутка почитал и накалякал вот такое.
Подскажите имеет ли право на жизнь вот эта конструкция?
Ожидается что она будет из массива пререписывать щт 1-го до 8-ми байт
в CGRAM для дальнейшего вывода слов на LCD 1602.



void stroka_rus(uint8_t (*text)[uint8_t line])
{
LCDcommand(0x40);
Busy_flag();
CPORT|=(1<<RS);
for (uint8_t i=0;i<text;i++)
{
Send_byte(i);
for(uint8_t k=0;k<line;k++);
Send_byte(k);
}
CPORT&=~(1<<RS);
LCDdata(text[line]);
}

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

Вт дек 06, 2022 07:57:32

А это вообще скомпилироваться могёт?
Ответить