Frage

I Programmierung eines 16F84A pic in HiTech C ein HD44780 lcd zu fahren. Bisher habe ich die LCD initialisiert bekam und einzelne Zeichen und Zeichenketten dem lcd schreiben kann. Jetzt brauche ich so etwas wie dies zu tun:

var = 250;
lcd_write_string ( "MyVar hat den Wert:" + var);
so sollte die LCD-Anzeige "MyVar hat Wert: 250"

Zu allererst wie soll ich verketten eine var und einen String? Zweitens ist der variable var enthält einen 8-Bit-Binärzahl (0-255 in dezimal). Wenn var = 23; die 8-Bit-Zahl hat, aufgeteilt in 2 wird die 2 und die 3 im ASCII- darzustellen, um dann durch die LCD angezeigt. Wie kann ich das machen? Es scheint, ich habe Basis 10 Umbauten oder eine tun, wenn Baum, der alle 2-stellige Zahlen zu teilen, um dann in der LCD-Anzeige angezeigt werden. Gibt es einen einfacheren Weg, um dies?

Danke!

War es hilfreich?

Lösung

Warum gehst du nicht einfach printf("%d", var) verwenden?

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

Andere Tipps

Ihr Toolset Nimmt man die Standard-C-Bibliothek nicht enthalten, oder dass Sie möchten, um herauszufinden, wie dies selbst zu tun, hier ist der Ansatz, den ich nehmen würde:

Deklarieren Sie einen Puffer von so viele Zeichen wie die LCD-Anzeige kann. Schreiben Sie eine feste Zeichenfolge in den Anfang des Puffers. Ermitteln Sie, wie viele Zeichen breit Ihre Variable sein wird (es gibt einige Mathe Ich verlasse hier, aber es ist eine vernünftige Übung glaube ich). Mit Hilfe dieser Länge und die Länge der festen Zeichenkette, herauszufinden, wo in den Puffer Ziffern Ihrer Nummer gehen. Unter Verwendung der gleichen mathematischen Konstrukte wie zuvor, schreiben die Ziffern in diesen Raum, eins nach dem anderen. Es ist ein Trick der Sprache C (von der Norm gefordert), dass Sie den Zeichenwert einer Nachkommastelle durch den Ausdruck '0' + digit ausrechnen kann. Hoffentlich sehen Sie, wie das funktioniert. Schließlich beenden Sie den Puffer jedoch Ihre lcd_write_string Funktion erwartet, und auf dem Puffer nennen.

Wie schon in anderen Befragten angegeben, setzt dies im wesentlichen einen kleinen Teil der printf Familie Standardbibliothek von Funktionen. Ich denke, es lohnt sich, die Umsetzung, um herauszufinden, auch wenn Sie können (und sollten!), Um die Bibliothek in Produktionscode verwenden.

Da diese vage wie Hausaufgaben riecht, ich bin der Ausarbeitung nicht weiter nur noch. Wenn Sie auf bestimmte Punkte die Hilfe benötigen, die ich für Updates auf die Frage aussehen.

Wenn die C-Compiler mit den Standard-C-Bibliotheksfunktionen kommen, dann sprintf kann werden verwendet, ähnlich wie printf, um eine Zeichenfolge zu erzeugen.

sprintf verwendet werden kann, eine formatierte Zeichenfolge (als char*) zu erzeugen, die vermutlich auf die lcd_write_string Funktion gesendet werden kann.

Das Problem mit sprintf () ist, dass Sie nicht wissen, wie viele Bytes Sie vor dem Aufruf von sprintf zuweisen müssen (). Ich in der Regel verwenden Sie die folgende ksprintf () als Ersatz.

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;
}

Um das verwenden:

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 () funktioniert nicht mit glibc 2.0, weil vsnprintf nicht die Anzahl der Bytes in der Zeichenfolge zurückgibt. Sie müssen immer wieder die Speicher in Zuordnung verdoppeln. Linux-man-Seite „Mann snprintf“ gibt auch ein Beispiel. Auf Ihrem System sollten Sie das Verhalten Ihres vsnprintf überprüfen (), die C99 ist, nicht obwohl C90.

Eine andere Möglichkeit, dies zu tun, wäre lcd_write_string als Funktion Zeiger zu verwenden, und dies zu tun:

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

Dies funktioniert korrekt auf CCS Pic C-Compiler, wenn lcd_write_string wie

deklariert
void lcd_write_string (char c);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top