Перейти к содержанию
    

Преобразование Int в строку на LCD (ICCAVR7)

Я только начал Си изучать, так что мне unsigned long привычнее (понятнее), чем uint64_t.

Изменено пользователем James D.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, James D. said:

Я только начал Си изучать, так что мне unsigned long привычнее (понятнее), чем uint64_t.

ну как наступите несколько раз на грабли что размеры int и long могут произвольно меняться в зависимости от архитектуры процессора и даже от компилятора. так сразу stdint.h станет понятнее и привычнее.

стандарт вроде гарантирует только что размер char <= short <= int <= long, поэтому иногда встречаются и 16-ти битные char и 16-ти битные int.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите еще, как подправить этот код, чтобы вывести число в 16-ричном виде? Я хочу вывести на LCD1602 значение регистра TWSR.

Если в TWSR 0xA0, то нужно вывести A0, а сейчас у меня на экране 160. Неудобно вручную переводить.

void IntToStr(unsigned long val, char str[])//Перевод числа в строку ASCII символов
{
	//~~~~~~~~~~~~~~~~~~~~~~~
	signed char i = 0, j = 0;
	unsigned int digits[11];
	//~~~~~~~~~~~~~~~~~~~~~~

	while (val)
	{
		digits[i] = val % 10; i++; val = val / 10;
	};
	i--;
	while ( i >= 0 )
	{
		str[j] = (digits[i]+ 0x30); j++; i--;
	};
	str[j] = 0x00;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/21/2023 at 2:16 PM, James D. said:

Подскажите еще, как подправить этот код, чтобы вывести число в 16-ричном виде?

void IntToStr(unsigned long val, char str[])//Перевод числа в строку ASCII символов

 

В это функции никак.

Или писать под это дело отдельную функцию, либо пользоваться универсальной библиотечной sprintf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

while(end > begin) aux=*end, *end--=*begin, *begin++=aux;

Повбывав бы..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 минуты назад, _pv сказал:
const char hex[] = "0123456789ABCDEF";
str[0] = hex[(TWSR>>4) & 0x0F];
str[1] = hex[(TWSR   ) & 0x0F];

Вообще-то: static const char hex[] = "0123456789ABCDEF";

Ведь надеюсь - догадываетесь, что вопрошающий так и вставит это в функцию как есть, не задумавшись?  :sarcastic:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, jcxz сказал:

Вообще-то: static const char hex[] = "0123456789ABCDEF";

Ведь надеюсь - догадываетесь, что вопрошающий так и вставит это в функцию как есть, не задумавшись?  :sarcastic:

Учитывая особенности архитектуры AVR, это не сэкономит ОЗУ и строка окажется в ней все равно...

Надо еще добавить квалификатор progmem добавить, ну и чтение через специальную функцию-макрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/21/2023 at 5:04 PM, Arlleex said:

Учитывая особенности архитектуры AVR, это не сэкономит ОЗУ и строка окажется в ней все равно...

Надо еще добавить квалификатор progmem добавить, ну и чтение через специальную функцию-макрос.

Свежие IAR для AVR сами кажется умеют const  во flash складывать и все особенности обращения скрывать под капотом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, Arlleex сказал:

Учитывая особенности архитектуры AVR, это не сэкономит ОЗУ и строка окажется в ней все равно...

Надо еще добавить квалификатор progmem добавить, ну и чтение через специальную функцию-макрос.

Может быть. С AVR не работал никогда - особенностей их компиляторов не знаю. Впрочем и вопрошающий не указал про какой компилятор идёт речь. А ваш progmem рассчитан видимо на определённый компилятор.

Я имел в виду, что static нужен, чтобы не было инициализации массива hex при каждом входе в функцию с таким кодом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 часов назад, dimka76 сказал:

Свежие IAR для AVR сами кажется умеют const  во flash складывать и все особенности обращения скрывать под капотом.

Сомнительно. Объекты const должны обеспечивать взятие адреса и находиться в том же адресном пространстве, что и остальные объекты памяти. А flash (progmem) в AVR -- это другое, отдельное адресное пространство.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 часов назад, _pv сказал:
const char hex[] = "0123456789ABCDEF";
str[0] = hex[(TWSR>>4) & 0x0F];
str[1] = hex[(TWSR   ) & 0x0F];

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...