문제

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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top