Как объединить Vars в C запрограммированной рис? - PullRequest
1 голос
/ 13 сентября 2009

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

var = 250;
lcd_write_string («MyVar имеет значение:» + var);
поэтому на ЖК-дисплее должно быть указано «MyVar имеет значение: 250»

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

спасибо!

Ответы [ 5 ]

4 голосов
/ 13 сентября 2009

Почему бы вам просто не использовать 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);
1 голос
/ 13 сентября 2009

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

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

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

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

0 голосов
/ 21 сентября 2009

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

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

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

void lcd_write_string (char c);
0 голосов
/ 13 сентября 2009

Проблема с 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.

0 голосов
/ 13 сентября 2009

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

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

...