Как объединить переменные в c запрограммированном pic?
-
06-07-2019 - |
Вопрос
Я программирую изображение 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);