[英]How to concatenate vars in c programmed pic?
我用高科技C编程了一个16f84a图片来驱动hd44780液晶显示器。 到目前为止,我已经初始化了LCD,并且可以将单独的字符和字符串写入LCD。 现在,我需要执行以下操作:
var = 250;
lcd_write_string
(“ MyVar的值:” + var);
因此,液晶显示器应显示“ MyVar具有值:250”
首先,我应该如何连接一个var和一个字符串? 第二,变量var包含8位二进制数(十进制为0-255)。 如果var = 23; 必须将8位数字拆分为2以代表ascii中的2和3,然后才能由LCD显示。 我怎样才能做到这一点? 看来我必须进行10进制转换或if树来拆分所有2位数字,然后才能在lcd中显示。 有没有更简单的方法可以解决此问题?
谢谢!
为什么不只使用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库,或者您想自己弄清楚该如何做,那么我将采用以下方法:
声明一个缓冲区,该缓冲区的大小与LCD可以显示的字符数相同。 将固定的字符串写入该缓冲区的开头。 确定您的变量将有多少个字符宽(我在这里省略了一些数学运算,但是我认为这是一个合理的练习)。 使用该长度和固定字符串的长度,找出数字在缓冲区中的位置。 使用与以前相同的数学构造,将数字一位一位地写入该空间。 C语言有一个技巧(标准要求),可让您通过表达式'0' + digit
十进制数字的字符值。 希望您能看到它是如何工作的。 最后,根据您的lcd_write_string
函数的期望终止缓冲区,并在缓冲区上调用它。
正如其他受访者所指出的那样,这实际上实现了标准库的printf
系列功能的一小部分。 我认为,即使您可以(并且应该!)在生产代码中使用该库,也应该弄清楚实现方式。
由于这有点像作业的气味,所以我暂时不做进一步说明。 如果您需要特定点的帮助,我将寻找有关该问题的更新。
如果C编译器随附了标准C库函数,则可以类似于printf
来使用sprintf
,以产生一个字符串。
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)
如果lcd_write_string声明为像这样,则可以在CCS Pic C编译器上正常工作
void lcd_write_string (char c);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.