Как объединить переменные в c запрограммированном pic?

StackOverflow https://stackoverflow.com/questions/1417109

Вопрос

Я программирую изображение 16f84a в hitech C для управления ЖК-дисплеем hd44780.Пока что я инициализировал ЖК-дисплей и могу записывать на него отдельные символы и строки.Теперь мне нужно сделать что-то вроде этого:

var = 250;
lcd_write_string("myVar имеет ценность:" + var);
таким образом, на ЖК-дисплее должно отображаться "myVar имеет значение:250"

Прежде всего, как я должен объединить var и строку?во-вторых, переменная var содержит 8-битное двоичное число (0-255 в десятичной системе счисления).Если var = 23;8-битное число должно быть разделено на 2, чтобы представить 2 и 3 в ascii, которые затем будут показаны на ЖК-дисплее.как я могу это сделать?Кажется, мне нужно выполнить базовые преобразования 10 или дерево if, чтобы разделить все 2-значные числа, которые затем будут показаны на ЖК-дисплее.Есть ли более простой способ обойти это?

Спасибо!

Это было полезно?

Решение

Почему бы тебе просто не использовать printf("%d", var) ?

var = 250;
char *static_msg = "MyVar has value:";
char msg[sizeof(static_msg) + 4];

sprintf(msg, "%s %d", static_msg, var);
lcd_write_string(msg);

Другие советы

Предположим, ваш набор инструментов не включает стандартную библиотеку C или вы хотите выяснить, как это сделать самостоятельно, вот подход, который я бы выбрал:

Объявите буфер из такого количества символов, какое может отобразить ЖК-дисплей.Запишите свою фиксированную строку в начало этого буфера.Определите, сколько символов в ширину будет иметь ваша переменная (здесь я опускаю некоторую математику, но, по-моему, это разумное упражнение).Используя эту длину и длину фиксированной строки, определите, куда в буфере будут помещены цифры вашего номера.Используя те же математические конструкции, что и раньше, запишите цифры в этот пробел, одну за другой.В языке C есть хитрость (требуемая стандартом), которая позволяет вам вычислять символьное значение десятичной цифры с помощью выражения '0' + digit.Надеюсь, вы видите, как это работает.Наконец, завершите работу буфера, однако ваш lcd_write_string функция ожидает и вызывает ее в буфере.

Как указали другие респонденты, это, по сути, реализует небольшую часть возможностей стандартной библиотеки printf семейство функций.Я думаю, что стоит разобраться с реализацией, даже если вы можете (и должны!) используйте библиотеку в производственном коде.

Поскольку это смутно напоминает домашнюю работу, я пока не буду вдаваться в подробности.Если вам нужна помощь по конкретным вопросам, я поищу обновления по этому вопросу.

Если компилятор C поставляется со стандартными библиотечными функциями C, то sprintf может быть использован аналогично printf, для того, чтобы создать строку.

sprintf может быть использован для создания форматированной строки (как char*), который, предположительно, мог бы быть отправлен в lcd_write_string функция.

Проблема с sprintf() заключается в том, что вы не знаете, сколько байт вам нужно выделить перед вызовом sprintf().Обычно я использую следующий ksprintf() в качестве замены.

typedef struct __kstring_t {
  size_t l, m;
  char *s;
} kstring_t;

int ksprintf(kstring_t *s, const char *fmt, ...)
{
  va_list ap;
  int l;
  va_start(ap, fmt);
  l = vsnprintf(s->s + s->l, s->m - s->l, fmt, ap); // not working with glibc 2.0
  va_end(ap);
  if (l + 1 > s->m - s->l) {
    s->m = s->l + l + 2;
    kroundup32(s->m);
    s->s = (char*)realloc(s->s, s->m);
    va_start(ap, fmt);
    l = vsnprintf(s->s + s->l, s->m - s->l, fmt, ap);
  }
  va_end(ap);
  s->l += l;
  return l;
}

Чтобы использовать это:

kstring_t *str = calloc(1, sizeof(kstring_t));
ksprintf(str, "%s, %d\n", aString, aInteger);
ksprintf(str, "a second line: %s\n", aString2);
free(str->s); free(s);

ksprintf() не работает с glibc 2.0, потому что vsnprintf не возвращает количество байтов в строке.Вам нужно многократно удваивать объем выделяемой памяти.Справочная страница Linux "man snprintf" также приводит пример.В вашей системе вам следует проверить поведение вашего vsnprintf(), хотя это C99, а не C90.

Другим способом сделать это было бы использовать lcd_write_string в качестве указателя на функцию и сделать это:

printf(lcd_write_string,"MyVar has value: %d",var)

Это корректно работает в компиляторе CCS Pic C, если lcd_write_string объявлен как

void lcd_write_string (char c);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top