LCD1602 выравнивание по правому краю значения
- Войдите на сайт для отправки комментариев
Ср, 03/08/2022 - 21:42
Значение меняется от нуля и может быть до 5 знаков со знаком как + так и -. Очищаю область на все 5 знаков (с учетом знаков + и -) и потом через кучу if-ов определяю с какого положения начинать выводить число, чтобы последний символ был самым правым (крайним).
Вопрос в том, можно ли как-то по проще это реализовать?
Выводить наоборот, начиная с правого края
Выводить наоборот, начиная с правого края
Выводить наоборот, начиная с правого края
Поцифрово?
Кстати, это хороший вариант. Всего один цикл.
Странно, когда с динамической индикацией разбирался так и делал, а сейчас что-то и не подумал даже )))
СПАСИБО!!!
Выводить наоборот, начиная с правого края
Поцифрово?
преобразовать в строку и посимвольно
Выводить наоборот, начиная с правого края
Поцифрово?
преобразовать в строку и посимвольно
Ну и зачем стек? Точно так же с хвоста. Только в строку - это лишнее
ua6em, ты чего сегодня так жжёшь то? Знак «%» ни о чем не говорит?)))
ua6em, ты чего сегодня так жжёшь то? Знак «%» ни о чем не говорит?)))
стековые операции для меня святое, как никак в РД две тысячи были насыпом и отведённое время жизни два часа)))
При чем тут стек вообще? Речь о числах. Ладно, пофиг.
printf запрещён по причине дискредитации армии?
Ни в коем разе, никогда не использовал. Можно пример printf с выравниванием по правому краю?
По умолчанию все выводимые значения выравниваются по правому краю: если ширина поля больше выводимого значения, оно будет выровнено по правому краю поля. Чтобы установить выравнивание по левому краю, нужно поставить знак «минус» сразу после знака %. Например, спецификация формата %-10.2f обеспечит выравнивание вещественного числа с двумя десятичными знаками в 10-символьном поле по левому краю.
----------
snprintf лупит в строку, которую потом в обычный lsd.print сгрузить можно.
Проще некуда.
Если число отрицательное, взвожу об этом флаг, а само число умножаю на -1. Вывожу число на экран:
Ну и если флаг об отрицательном числе взведен, то потом еще вывожу в позиции cursorPos "-".
Как то так:
char *topRow[17];
int myVal=325;
sprintf(topRow,"myVal= %5d",myVal);
lcd.setCursor(0,0);
lcd.print(topRow);
%5d выделит под значение 5 знаков , которые будут выравнивается по правому краю.
%05d , забьет пустоту слева (если число меньше 5 знаков) нулями.
Остальное сам пропишешь.
Если число отрицательное, взвожу об этом флаг, а само число умножаю на -1. Вывожу число на экран:
Ну и если флаг об отрицательном числе взведен, то потом еще вывожу в позиции cursorPos "-".
printf/sprintf решают проблему со знаком за тебя
Я не отказываюсь от решения с участием printf/sprintf, просто надо по изучать...
Птамать, что там изучать-то? Не хочешь sprint разворачивать, заводишь унутре функции преобразования буфер, заведомо больше требуемого, преобразуешь туда слева направо, потом считаешь, какая длина получилась. После этого из буфера копируешь в результирующую строку справа налево (с конца к началу) стока символов, скока получилось. Отдаёшь. Результирующую строку предварительно надо забить пробелами во всю длину
паматри здесь
https://github.com/DetSimen/TM1637/blob/master/TM1637.cpp
функцию
там 4 символа в дисплее, цифры выравниваются вправо, строки - влево
ПыСы Пидец, ты тугой. :)))
Сам ты Наташа )))
Красивое решение:
Не так ли?
Только по сравнению с моим решением через цикл while () отжирает дополнительно 2кб флэш-памяти. А мне это место нужно, у меня Atmega8....
А ежель так:
sprintf
А ежель так:
В контроллер не загружал (вечером попробую), при компиляции флеш-память на уровне что и с циклом while(), всего на 10 байт больше - приемлемо. Спасибо!
sprintf
#19
А ежель так:
В контроллер не загружал (вечером попробую), при компиляции флеш-память на уровне что и с циклом while(), всего на 10 байт больше - приемлемо. Спасибо!
Попробовал. Отличный вариант, его и оставлю. Спасибо!
А завтра захочется LCD подключить к PIC-у или другому... И пиши по новой.
к PIC-у можно тока LSD подключить.
"Чойта"?) Если по нормальному, то и менять ничего не надо. Без ++ только.
к PIC-у можно тока LSD подключить.
софтовый i2c на пике не катит?
Нинаю, я с ними плотно не работал. Но впечатление осталось как от Motorola 68010, плювацца хотелось. :)
софтовый i2c на пике не катит?
Даже на многих старинных PIC16 уже присутствует железный I2C.
Нинаю, я с ними плотно не работал. Но впечатление осталось как от Motorola 68010, плювацца хотелось. :)
ну не знаю, на нём сделаны очень многие серьёзные железки...
PS
Набор инструкций значительно более «ортогонален», чем у многих процессоров, появившихся как ранее (как i8080), так и после (как семейство x86) (на самом деле архитектура x86 появилась за год до выхода первого процессора M68000). На практике это означает, что возможно свободно комбинировать операции и операнды, со всем богатством режимов адресации, не задумываясь об ограничениях совместимости конкретной операции и набора операндов. Эта особенность существенно облегчает программирование на ассемблере 68k, в определённой степени приближая его к языкам высокого уровня, а также существенно облегчает создание кода компиляторами.
Даже на многих старинных PIC16 уже присутствует железный I2C.
для тех кто с PIC- ами на ты, даже на простеньком творят такие сложные девайсы, что диву даёшься...
у меня кстати старинный программатор для них есть и, даже работает...