LCD1602 выравнивание по правому краю значения

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Значение меняется от нуля и может быть до 5 знаков со знаком как + так и -. Очищаю область на все 5 знаков (с учетом знаков + и -) и потом через кучу if-ов определяю с какого положения начинать выводить число, чтобы последний символ был самым правым (крайним).

Вопрос в том, можно ли как-то по проще это реализовать?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Выводить наоборот, начиная с правого края

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

v258 пишет:

Выводить наоборот, начиная с правого края

совать в стек, первым зашёл последним вышел?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

ua6em пишет:

v258 пишет:

Выводить наоборот, начиная с правого края

совать в стек, первым зашёл последним вышел?

Поцифрово?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Кстати, это хороший вариант. Всего один цикл.

Странно, когда с динамической индикацией разбирался так и делал, а сейчас что-то и не подумал даже )))

СПАСИБО!!!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

v258 пишет:

ua6em пишет:

v258 пишет:

Выводить наоборот, начиная с правого края

совать в стек, первым зашёл последним вышел?

Поцифрово?

преобразовать в строку и посимвольно

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

ua6em пишет:

v258 пишет:

ua6em пишет:

v258 пишет:

Выводить наоборот, начиная с правого края

совать в стек, первым зашёл последним вышел?

Поцифрово?

преобразовать в строку и посимвольно

Ну и зачем стек? Точно так же с хвоста. Только в строку - это лишнее

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

 ua6em, ты чего сегодня так жжёшь то? Знак «%» ни о чем не говорит?)))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

 ua6em, ты чего сегодня так жжёшь то? Знак «%» ни о чем не говорит?)))

стековые операции для меня святое, как никак в РД две тысячи были насыпом и отведённое время жизни два часа)))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

При чем тут стек вообще? Речь о числах. Ладно, пофиг. 

sadman41
Offline
Зарегистрирован: 19.10.2016

printf запрещён по причине дискредитации армии?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ни в коем разе, никогда не использовал. Можно пример printf с выравниванием по правому краю?

sadman41
Offline
Зарегистрирован: 19.10.2016

По умолчанию все выводимые значения выравниваются по правому краю: если ширина поля больше выводимого значения, оно будет выровнено по правому краю поля. Чтобы установить выравнивание по левому краю, нужно поставить знак «минус» сразу после знака %. Например, спецификация формата %-10.2f обеспечит выравнивание вещественного числа с двумя десятичными знаками в 10-символьном поле по левому краю.
----------
snprintf лупит в строку, которую потом в обычный lsd.print сгрузить можно.

Green
Offline
Зарегистрирован: 01.10.2015
void printInt(uint16_t bin) {
  char chr = ' ';
  for (uint16_t div = 10000; div > 1; div /= 10) {
    uint8_t d = bin / div;
    if (chr != ' ' || d)
      chr = d + '0';
    printChar(chr);
    bin %= div;
  }
  printChar(bin + '0');
}

Проще некуда.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Если число отрицательное, взвожу об этом флаг, а само число умножаю на -1. Вывожу число на экран:

while (num > 0 ) {
  lcd.setCursor(cursorPos, 0);
  lcd.print((num % 10));
  num = num / 10;
  cursorPos--;
}

Ну и если флаг об отрицательном числе взведен, то потом еще вывожу в позиции cursorPos "-".

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Как то так:

char *topRow[17];
int myVal=325;
sprintf(topRow,"myVal= %5d",myVal);
lcd.setCursor(0,0);
lcd.print(topRow);

%5d выделит под значение 5 знаков , которые будут выравнивается по правому краю.
%05d , забьет пустоту слева (если число меньше 5 знаков) нулями.
Остальное сам пропишешь.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

BOOM пишет:

Если число отрицательное, взвожу об этом флаг, а само число умножаю на -1. Вывожу число на экран:

while (num > 0 ) {
  lcd.setCursor(cursorPos, 0);
  lcd.print((num % 10));
  num = num / 10;
  cursorPos--;
}

Ну и если флаг об отрицательном числе взведен, то потом еще вывожу в позиции cursorPos "-".

printf/sprintf решают проблему со знаком за тебя

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я не отказываюсь от решения с участием printf/sprintf, просто надо по изучать...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Птамать, что там изучать-то?  Не хочешь sprint разворачивать, заводишь унутре функции преобразования буфер, заведомо больше требуемого, преобразуешь туда слева направо, потом считаешь, какая длина получилась. После этого из буфера копируешь в результирующую строку справа налево (с конца к началу) стока символов, скока получилось.  Отдаёшь. Результирующую строку предварительно надо забить пробелами во всю длину

паматри здесь 

https://github.com/DetSimen/TM1637/blob/master/TM1637.cpp

функцию 

void TM1637::OutString(const char * AString, const enTM1637Align AAlign)

там 4 символа в дисплее, цифры выравниваются вправо, строки - влево

ПыСы  Пидец, ты тугой.  :)))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Сам ты Наташа )))

Красивое решение:

  sprintf(temp, "%5d", num);
  lcd.setCursor(cursorPos, 1);
  lcd.print(temp);

Не так ли?

Только по сравнению с моим решением через цикл while () отжирает дополнительно 2кб флэш-памяти. А мне это место нужно, у меня Atmega8....

Feofan
Offline
Зарегистрирован: 28.05.2017

А ежель так:
 

  char ch[8];                   // сколько надо символов под вывод
  itoa(temp, ch, 10);
  cursorPos = 15 - strlen(ch);  //  15 - крайняя правая позиция вывода
  lcd.setCursor(cursorPos, 1);
  lcd.print(ch);

 

rkit
Offline
Зарегистрирован: 23.11.2016

sprintf

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Feofan пишет:

А ежель так:

  char ch[8];                   // сколько надо символов под вывод
  itoa(temp, ch, 10);
  cursorPos = 15 - strlen(ch);  //  15 - крайняя правая позиция вывода
  lcd.setCursor(cursorPos, 1);
  lcd.print(ch);

В контроллер не загружал (вечером попробую), при компиляции флеш-память на уровне что и с циклом while(), всего на 10 байт больше - приемлемо. Спасибо!

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

rkit пишет:

sprintf

#19

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

BOOM пишет:

Feofan пишет:

А ежель так:

  char ch[8];                   // сколько надо символов под вывод
  itoa(temp, ch, 10);
  cursorPos = 15 - strlen(ch);  //  15 - крайняя правая позиция вывода
  lcd.setCursor(cursorPos, 1);
  lcd.print(ch);

В контроллер не загружал (вечером попробую), при компиляции флеш-память на уровне что и с циклом while(), всего на 10 байт больше - приемлемо. Спасибо!

Попробовал. Отличный вариант, его и оставлю. Спасибо!

Green
Offline
Зарегистрирован: 01.10.2015

А завтра захочется LCD подключить к PIC-у или другому... И пиши по новой.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

к PIC-у можно тока LSD подключить.  

Green
Offline
Зарегистрирован: 01.10.2015

"Чойта"?) Если по нормальному, то и менять ничего не надо. Без ++ только.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

к PIC-у можно тока LSD подключить.  

софтовый i2c на пике не катит?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:
софтовый i2c на пике не катит?

Нинаю, я с ними плотно не работал.  Но впечатление осталось как от Motorola 68010, плювацца хотелось.  :) 

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

софтовый i2c на пике не катит?


Даже на многих старинных PIC16 уже присутствует железный I2C.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:
софтовый i2c на пике не катит?

Нинаю, я с ними плотно не работал.  Но впечатление осталось как от Motorola 68010, плювацца хотелось.  :) 

ну не знаю, на нём сделаны очень многие серьёзные железки...
PS
Набор инструкций значительно более «ортогонален», чем у многих процессоров, появившихся как ранее (как i8080), так и после (как семейство x86) (на самом деле архитектура x86 появилась за год до выхода первого процессора M68000). На практике это означает, что возможно свободно комбинировать операции и операнды, со всем богатством режимов адресации, не задумываясь об ограничениях совместимости конкретной операции и набора операндов. Эта особенность существенно облегчает программирование на ассемблере 68k, в определённой степени приближая его к языкам высокого уровня, а также существенно облегчает создание кода компиляторами.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Даже на многих старинных PIC16 уже присутствует железный I2C.

для тех кто с PIC- ами на ты, даже на простеньком творят такие сложные девайсы, что диву даёшься...
у меня кстати старинный программатор для них есть и, даже работает...