C 프로그래밍 된 그림에서 Vars를 연락하는 방법은 무엇입니까?
-
06-07-2019 - |
문제
HD44780 LCD를 구동하기 위해 Hitech C에서 16F84A PIC를 프로그래밍합니다. 지금까지 나는 LCD를 초기화하고 LCD에 개별 캐릭터와 문자열을 쓸 수 있습니다. 이제 다음과 같은 일을해야합니다.
var = 250;
lcd_write_string
( "Myvar는 가치가 있습니다 :" + var);
따라서 LCD는 "Myvar가 가치가 있습니다 : 250"을 보여 주어야합니다.
우선 var와 문자열을 어떻게 연결해야합니까? 둘째, 가변 Var는 8 비트 이진수 (10 진수의 0-255)를 포함합니다. Var = 23 인 경우; 8 비트 번호는 2로 분할되어 2로 분할되어 ASCII의 2를 나타내고 3을 LCD로 표시해야합니다. 어떻게 할 수 있습니까? LCD에 2 자리 숫자를 모두 분할하려면베이스 10 변환 또는 IF 트리를 수행해야합니다. 이것에 대해 더 쉬운 방법이 있습니까?
감사해요!
해결책
그냥 사용하지 않는 이유는 무엇입니까? 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 라이브러리 기능이 제공되면 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);
vsnprintf는 문자열의 바이트 수를 반환하지 않기 때문에 ksprintf ()는 glibc 2.0에서 작동하지 않습니다. 할당 할 때 메모리를 반복적으로 두 배로 늘려야합니다. Linux Man Page "Man Snprintf"도 예제를 제시합니다. 시스템에서 C90이 아닌 C99 인 vsnprintf ()의 동작을 확인해야합니다.
이를 수행하는 또 다른 방법은 LCD_WRITE_STRING을 함수 포인터로 사용하고 다음을 수행하는 것입니다.
printf(lcd_write_string,"MyVar has value: %d",var)
LCD_WRITE_STRING이 다음과 같이 선언 된 경우 CCS PIC C 컴파일러에서 올바르게 작동합니다.
void lcd_write_string (char c);