1

hitechCで16f84apicをプログラミングして、hd44780lcdを駆動します。これまでのところ、lcdを初期化して、個々の文字と文字列をlcdに書き込むことができます。今、私はこのようなことをする必要があります:

var = 250;
lcd_write_string("MyVarには値があります:" + var);
したがって、液晶ディスプレイには「MyV​​arの値:250」と表示されます。

まず、変数と文字列をどのように連結する必要がありますか?次に、変数varには8ビットの2進数(10進数で0〜255)が含まれています。var=23の場合; 8ビットの数値を2に分割して、ASCIIで2と3を表し、lcdで表示する必要があります。これどうやってするの?2桁の数値をすべて分割して液晶ディスプレイに表示するには、基数10の変換またはifツリーを実行する必要があるようです。これを回避する簡単な方法はありますか?

ありがとう!

4

5 に答える 5

4

使ってみません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);
于 2009-09-13T07:42:43.403 に答える
1

ツールセットに標準Cライブラリが含まれていない場合、またはこれを自分で行う方法を理解したい場合は、次のアプローチを使用します。

LCDが表示できる数の文字のバッファを宣言します。そのバッファの先頭に固定文字列を書き込みます。変数の幅がいくつの文字になるかを決定します(ここでは省略している数学がいくつかありますが、これは妥当な演習だと思います)。その長さと固定文字列の長さを使用して、バッファ内のどこに数字の桁が入るかを計算します。以前と同じ数学的構成を使用して、そのスペースに数字を1つずつ書き込みます。式で10進数の文字値を把握できるC言語(標準で必須)のトリックがあります'0' + digit。うまくいけば、それがどのように機能するかがわかります。最後に、lcd_write_string関数が期待する方法でバッファーを終了し、バッファーで呼び出します。

他の回答者が示しているように、これは基本的に標準ライブラリのprintf関数ファミリのごく一部を実装しています。実稼働コードでライブラリを使用できる(そして使用すべきである)場合でも、実装を理解することは価値があると思います。

これは宿題のようなにおいがするので、まだ詳しく説明していません。特定の点についてサポートが必要な場合は、質問の更新を探します。

于 2009-09-13T08:08:32.103 に答える
0

Cコンパイラに標準Cライブラリ関数が付属している場合は、文字列を生成するために、sprintfと同様に使用できます。printf

sprintfフォーマットされた文字列(as char*)を生成するために使用できます。これは、おそらくlcd_write_string関数に送信される可能性があります。

于 2009-09-13T07:45:02.090 に答える
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);

vsnprintfは文字列のバイト数を返さないため、ksprintf()はglibc2.0では機能しません。割り当てのメモリを繰り返し2倍にする必要があります。Linuxのmanページ「mansnprintf」にも例があります。システムでは、vsnprintf()の動作を確認する必要があります。これはC90ではなくC99です。

于 2009-09-13T08:35:23.377 に答える
0

これを行う別の方法は、lcd_write_stringを関数ポインターとして使用してこれを行うことです。

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

lcd_write_stringが次のように宣言されている場合、これはCCSPicCコンパイラで正しく機能します。

void lcd_write_string (char c);
于 2009-09-21T14:43:02.350 に答える