Бесполезная трата временных ресурсов на подсчет символов, а потом еще и на вывод.Тем более если в буфере у вас находится не ноль, судя по картинке. Лучше уж тогда использовать
Код:
Lcd_send_buffer(unsigned char * buffs){ while (*buffs[i]){ Lcd_send_char(*buffs[i++]); } }
и буфер заполнять так
Код:
sprintf(buffer, "Out= %d/0", 1234);
Вроде так как то.Поправьте, если что не так.Пока нечем проверить
Вставлять то вставляет, только почему на экране появляются палочки?Получается это такой пользовательский символ выводится. И если это он, то получается, что такой функцией уже нельзя будет вывести пользовательский символ с адресом 0.Так выходит?
Заголовок сообщения: Re: WinAvr в вопросах и ответах
Добавлено: Сб сен 22, 2012 10:53:43
Открыл глаза
Зарегистрирован: Сб май 07, 2011 14:35:24 Сообщений: 53 Откуда: Россия
Рейтинг сообщения:0
Еще вначале эксперимента инициализировал буфер заправляя нулями специально, перед тем как использовать. Все 16 ячеек. Палочки так и оставались. И скорее всего
И если это он, то получается, что такой функцией уже нельзя будет вывести пользовательский символ с адресом 0.Так выходит?
Можно. Как адрес 8. У HD44780 пользовательсике символы в адресах 0..7 продублированы в 8..15, т.е. любой символ по адресу A Є {0..7} можно выводить по адресу A+8 и наоборот. Я только адресами 8..15 всегда и пользовался.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Lcd_send_buffer(unsigned char * buffs){ while (*buffs[i]){ Lcd_send_char(*buffs[i++]); } }
Оставить что-то одно. Или индексацию
Код:
Lcd_send_buffer(unsigned char * buffs){ unsigned char i = 0; while (buffs[i]) Lcd_send_char(buffs[i++]); }
или разименование
Код:
Lcd_send_buffer(unsigned char * buffs){ while (*buffs) Lcd_send_char(*buffs++); }
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Во, во точно так и нужно.Забыл как правильно.Хотя второй вариант мне кажется проще и по написанию и лишние переменные не нужно объявлять.Компилятор сам где нужно создаст.
Еще вначале эксперимента инициализировал буфер заправляя нулями специально, перед тем как использовать. Все 16 ячеек. Палочки так и оставались.
Может, имеет смысл прописать его пробелами вместо нулей?
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
Заголовок сообщения: Re: WinAvr в вопросах и ответах
Добавлено: Сб сен 22, 2012 20:44:25
Открыл глаза
Зарегистрирован: Сб май 07, 2011 14:35:24 Сообщений: 53 Откуда: Россия
Рейтинг сообщения:0
Можно конечно, но с условием что буфер в программе будет использоваться всего один раз. А иначе перед функцией sprintf это нужно будет делать каждый раз. Для этого удобнее всего написать отдельную функцию, в ней с помощью цикла заполнять буфер пробелами. Но стоит ли оно того.. Вроде как получается лишняя трата времени на заполнение неиспользуемых оставшихся ячеек, если строка в данный момент значительно короче.
Последний раз редактировалось rs39 Сб сен 22, 2012 20:51:28, всего редактировалось 2 раз(а).
Может, имеет смысл прописать его пробелами вместо нулей?
Да с нулями нормально, только не выводить что попало, если только не нужно затирать предыдущее изображение.
Я еще не добрался до своего дисплея, но собираюсь именно затирать вместо очистки дисплея. То есть хранить полный массив дисплея в буфере Мк.Пока вот не знаю чем это грозит.
Заголовок сообщения: Re: WinAvr в вопросах и ответах
Добавлено: Сб сен 22, 2012 20:57:47
Открыл глаза
Зарегистрирован: Сб май 07, 2011 14:35:24 Сообщений: 53 Откуда: Россия
Рейтинг сообщения:0
vitalik_1984 писал(а):
Цитата:
Я еще не добрался до своего дисплея, но собираюсь именно затирать вместо очистки дисплея.
Уточните пожалуйста, в каком смысле "затирать"? Просто писать данные в LCD поверх, либо все-же подавать на него какие то команды перед записью? У меня сейчас отладочная под рукой, могу попробовать.
Заголовок сообщения: Re: WinAvr в вопросах и ответах
Добавлено: Сб сен 22, 2012 21:32:28
Открыл глаза
Зарегистрирован: Сб май 07, 2011 14:35:24 Сообщений: 53 Откуда: Россия
Рейтинг сообщения:0
Ок ясно. Сейчас попробовал сделать. Из минусов пока ничего не заметил. А вот плюсы визуально есть. Не стало мерцания LCD, которое вероятнее всего происходило в момент LCD_Clear. Массив конечно приходится "чистить" (заполнять нулями, пробелами) всегда перред sprintf.
Я где то читал, что с помощью этой функции делать строку определенной длины с заполнением любыми символами.Только вот уже не помню как точно это все выглядит и где посмотреть можно. Кстати не нужно даже делать лишних движений сама функция sprintf в некоторых интерпретациях считает сколько в ней символов.И оставшееся можно дополнять пробелами.
но оказалось все правильно. Дело в том что sprintf в конце строки как правило ставит \0 - так вот этот ноль зараза все-равно отображается в конце строки на LCD, и догадайтесь с первого раза ввиде чего? Да, именно в виде 2-х вертикальных палочек
Да, забыл добавить комментарий к картинке. Нижнюю строку "Влажность" не берем в расче, т.к. это просто статичная переменная в прогмем, для наглядности. А вот верхняя с температурой - она и есть, формируемая sprintf
Уж проще запихать в эту ячейку пустой символ.Может более опытные мастера подскажут что как можно сделать?
Могу предложить вот что :сделать функцию вывода буфера через вывод единичного символа и достигнув нулевого символа заполнять дальше пробелами. Пока что с телефона подсиживаю так что кроме догадок ничего не могу предложить.
На мой взгляд, проще всего не выводить каждый раз весь буфер, а делать печать только того, что действительно изменилось. При выводе чисел проблема неполного стирания предыдущего значения решается легко - нужно указать функции sprintf минимальную ширину числа. Тогда, если число занимает меньше символов, функция добавляет пробелов. В одном заброшенном проекте я делал функцию, которая выводила информацию на экран от мобильника. В одном из параметров функции передавались битовые флаги, указывающие какой именно участок надо перерисовать. Это экономило кучу времени, да и мелькания не было.
_________________ А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Заголовок сообщения: Re: WinAvr в вопросах и ответах
Добавлено: Вс сен 23, 2012 21:55:19
Открыл глаза
Зарегистрирован: Сб май 07, 2011 14:35:24 Сообщений: 53 Откуда: Россия
Рейтинг сообщения:0
U235 писал(а):
При выводе чисел проблема неполного стирания предыдущего значения решается легко - нужно указать функции sprintf минимальную ширину числа. Тогда, если число занимает меньше символов, функция добавляет пробелов.
Да, пожалуй самый оптимальный вариант. Следуя ему поступил следующим образом: Зная сколько символов будет занято строкой, с учетом ширины числа (от 0 до 999 к примеру) задал в sprintf %3d, получилось 3, без учета символа завершения строки. Все ранее навешанные функции strlen, заполнения буфера - убрал. Буфер так-же инициализировал в 3 ячейки супротив 16. Функция очистки LCD тоже не нужна, т.к. длинна строки определена заранее(%3d). Итог - код без лишних наворотов, мерцания дисплея нет, результат отображения без мусора.
Рабочий образец кода:
Код:
unsigned char buffer[3]; ... val = 999; sprintf(buffer,"%3d",val); // Заполняем буфер результатом, символ окончания строки невсчет LCDGotoXY(0, 0); LCDstring(buffer,3);
Примечание: В языке C запись "t=%3d" LCD_CELSIUS_STR "C" даёт склеивание фрагментов строк в одну строку "t=%3d\x08C", но не нужно помнить, какой символ на каком номере и не будет проблем, если после \x08 идут опять цифры, в виде подстрок они точно не приклеятся к \x08
По поводу размера кода можно не беспокоиться, так как в библиотеке avr-libc функция sprintf сама сделана через порождение файлового объекта с флагами вывода в массив символов и с полнім набором va_start/vfprintf/va_end:
Код:
int sprintf(char *s, const char *fmt,...) { va_list ap; FILE f; int i;
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 67
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения