2009-09-13 2 views
1

hitech C에서 16f84a 그림을 프로그래밍하여 hd44780 LCD를 구동합니다. 지금까지 lcd를 초기화하고 개별 문자와 문자열을 lcd에 쓸 수 있습니다. 이제 다음과 같이해야합니다.프로그래밍 된 그림으로 벡터를 연결하는 방법?

var = 250;
lcd_write_string ("MyVar의 값 :"+ var); 모든

먼저 어떻게 var에와 문자열을 연결해야합니다
그래서 LCD는 "250이 MyVar이 값을 갖는다"표시해야합니까? 초, 변수 var는 8 비트 2 진수 (십진수로 0-255)를 포함합니다. var = 23; 8 비트 숫자는 2를 나타 내기 위해 2로 나눠지고, ASCII에 의해 3은 LCD에 의해 표시되어야합니다. 내가 어떻게 할 수 있니? 그것은 내가 10 진수의 변환을해야하거나, LCD에 표시되는 모든 2 자리 숫자를 나눌 if 트리입니다. 이 문제를 해결하는 쉬운 방법이 있습니까?

감사합니다.

+0

는 A 선언 된 경우이, CCS 그림 C 컴파일러에서 제대로 작동 빠른 구글 제안 그 PIC에 대한 많은 컴파일러가 있습니다. 대답은 현재 사용중인 답변에 따라 다릅니다. –

답변

4

printf("%d", var)을 사용하지 않으시겠습니까? C 컴파일러는 표준 C 라이브러리 함수와 함께 제공하는 경우

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); 
+0

감사합니다. qrdl의 대답이 효과가있었습니다. 그러나 printf를 사용하면 외부 라이브러리가로드되고 더 많은 메모리가 필요합니다. 나는 이것을 다음과 같이 작동시킨다 : lcd_write_num (var/10); lcd_write_num (var % 10); 하지만 그것은 2 자리 숫자에 대해서만 작동합니다. 캐치는 16f84a가 실제로이 두 가지 방법 중 하나를 사용하여 메모리가 거의 없다는 것을 보여줍니다. 나는 16f628a를 사용하여 결국 qrdl의 방법을 사용하여 완벽하게 작동합니다. 고마워요! – Juank

+0

숫자 조작에 관한 또 다른 옵션이 연결이 아닙니다. 확인 : http://www.mikroe.com/en/books/picbook/5_chapter.htm – Juank

0

, 다음 sprintf 문자열을 생산하기 위해, printf 유사 사용할 수 있습니다.

sprintflcd_write_string 함수로 전송 될 수있는 형식화 된 문자열 (char*)을 생성하는 데 사용할 수 있습니다.

1

은 도구 세트는 표준 C 라이브러리를 포함, 또는 당신이 직접 작업을 수행하는 방법을 파악하도록하지 않는 가정하면, 여기에 내가 걸릴 것 접근 방식 :

는 LCD만큼 문자의 버퍼를 선언 할 수 있습니다 디스플레이. 고정 된 문자열을 해당 버퍼의 시작 부분에 씁니다. 변수가 얼마나 많은 문자가 될지 결정하십시오 (여기에 몇 가지 수학이 있지만, 생각하는 합리적인 연습입니다). 그 길이와 고정 된 문자열의 길이를 사용하여 버퍼에서 숫자의 자릿수가 어디로가는 지 알아냅니다. 이전과 같은 수학적 구조를 사용하여 숫자를 그 공간에 하나씩 씁니다. '0' + digit이라는 표현으로 10 진수의 문자 값을 계산할 수있는 C 언어 트릭이 있습니다 (표준에서 요구됨). 바라건대, 어떻게 작동하는지보십시오. 마지막으로, lcd_write_string 함수가 예상하는 버퍼를 종료하고 버퍼에서 호출하십시오.

다른 응답자가 지적했듯이 이것은 표준 라이브러리의 printf 패밀리 패밀리의 일부를 구현합니다. 프로덕션 코드에서 라이브러리를 사용할 수 있더라도 구현을 이해하는 것은 가치가 있다고 생각합니다.

이것은 숙제처럼 막연하게 냄새가 나기 때문에, 아직 더 자세히 설명하지는 않습니다. 특정 요점에 대한 도움이 필요하면 질문에 대한 업데이트를 찾아 보겠습니다.

0

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 페이지 "man snprintf"도 예제를 제공합니다. 시스템에서는 vsnprintf() (C90이 아니라 C99)의 동작을 확인해야합니다.

0

함수 포인터로 lcd_write_string를 사용 할 것이 작업을 수행하는 또 다른 방법이 :

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

lcd_write_string이

void lcd_write_string (char c); 
+0

이것은 CCS 컴파일러 인 경우에만 작동합니다. 이것은 전체 상수 문자열을 매개 변수로 전달할 수 없으므로이 컴파일러의 해결 방법입니다. 따라서이 함수는 문자 으로 정의되며 프로그래머는이 컴파일러 결함을 극복하고 자동으로 내부 루프를 생성하여 인쇄 할 수 있습니다. –

관련 문제