-
Hallo,
als erstes musst du die lcdportdef.h anpassen. Du musst halt die Ports, Pins usw so eintragen wie es bei dir der Fall ist. Wenn du also Bit 0 (Datenleitung4)an PB0 angeschlossen hast,
#define LCD_DATA0_PORT PORTB /**< port for 4bit data bit 0 */
#define LCD_DATA0_DDR DDRB /**< port direction for 4bit data bit 0 */
#define LCD_DATA0_PINS PINB /**< port for 4bit data bit 0 */
#define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */
Wobei ich gerade sehe das du diesen Teil
Code:
#define LCD_BRIGHTNESS_PORT PORTB /**< port for Brightness */
#define LCD_BRIGHTNESS_DDR DDRB /**< port direction for Brightness */
#define LCD_BRIGHTNESS_PIN PB4 /**< pin for Brightness */
#define LCD_CONTRAST_PORT PORTB /**< port for CONTRAST */
#define LCD_CONTRAST_DDR DDRB /**< port direction for CONTRAST */
#define LCD_CONTRAST_PIN PB5 /**< Pin for CONTRAST */
#define LCD_ON_PORT PORTC
#define LCD_ON_DDR DDRC
#define LCD_ON_PIN 6
aus der Datei löschen kannst.
Am besten du erzeugst dir dann noch eine lcd.h in der die benötigten Funktionen deklariert werden.
Code:
void InitLCD ();
void WriteData (uint8_t , uint8_t);
Jetzt schreibst du ein kleines Programm
Code:
...
#include "lcd.h"
#include "global.h"
int main (void){
InitLCD ();
while (1) {}
return 0;
}
Jetzt muss das Display nach dem Einschalten leer sein.
Es dürfen nicht mehr die Balken da sein! Vorher brauchst du nichts weiter probieren.
Wenn das soweit geht, fügst du ein
WriteData (0,65);
hinter InitLCD(); ein. Dann sollte nach dem Einschalten ein A zu erkennen sein.
Funktionen wie z.B. PrintString, PrintChar, werden hierfür nicht benötigt. Die kannst du dann ja später ergründen.
Noch etwas, wenn du den Controller geflasht hast, ziehe für die ersten Versuche den ISP ab und schalte die Versorgung aus und wieder ein.
Nicht das es da zu Konflikten kommt.
Gruß
Jens
-
Hallo Jens,
vielen Dank für die ganze Hilfe, das "A" wird angezeigt, nur habe ich jetzt ein anderes Problem, wie bekomme ich jetzt z.B. die Funktion PrintString in die Headerdatei, ich habe schon versucht die Variablennamen (also x und y) wegzulassen und dann einige Teile nach des Kommas, aber immer kommen Fehlermeldungen.
Gruss Josef
-
Hallo,
void PrintString (uint8_t,uint8_t,char *);
Bitte beachte, dass der String nullterminiert sein muss. Das heißt das letzte Zeichen des Strings muss eine Null sein. Die Funktion gibt sonst lustige Dinge aus.
Gruß
Jens
-
Und mit "Null" meint er nicht '0' (das lesbare Ascii-zeichen), sondern das nullte Zeichen der Ascii-Tabelle: char Nullzeichen = 0x00.
-
Hallo zusammen,
entschuldigung, dass ich jetzt erst wieder antworte, ich hatte aber in den letzten Tagen so viel um die Ohren, dass ich einfach keine Zeit zum basteln hatte.
Wie "nullterminiere" ich einen String?
Gruss
Josef
-
Häng '\0' an den string an.
-
Hallo,
wichtig ist erst einmal das dein Puffer groß genug ist.
char buffer[5] = "Hallo";
ist ganz böse und falsch, immer. Hallo hat zwar nur 5 Buchstaben, aber für die Null ist kein Platz mehr.
char *Buchstabe = 'a';
nicht falsch, für PrintString aber auch böse.
char buffer[15] = "Hallo";
ist okay, in Anführungszeichen wird \0 automatisch angefügt.
Aufpassen musst du auch, wenn du dir aus Zeichen Strings zusammenbasteles oder z.B. bei strncpy.
char buffer[6] = "Hallo";
char test [15] = "ABCDEFGHIJ";
strncpy(test,buffer,3);
test[3] = 0;
ohne test [3] = 0; würde der Ausgabestring HalDEFGHIJ sein.
okay?
Ich benutze die Null, um das Ende des Strings zu erkennen. In der Annahme das ich weiß was ich tue, ist das für mich auch okay. Der Quellcode war nicht zur Veröffentlichung gedacht und auf meine Anwendung zurecht geschnitten. Bisher nicht einmal optimiert*. Darum musst du selber darauf achten, dass eine Null da ist. Denkbar ist, dass man die Funktion spätestens nach erreichen der Zeichen pro Zeile abbricht. Damit kann man zwar keinen Mist bei der Ausgabe vermeiden, zumindest wird die Funktion aber definiert abgebrochen.
Gruß
Jens
* ohne Leidensdruck kann das auch noch seeehr lange dauern :-)
-
Hi,
also den Sinn hab ich jetzt verstanden, nur die Umsetzung nicht :X
So'n klitze kleiner Beispielcode hilft mir weiter =)
Gruß Josef
-
Oder nutze einfach einen Buffer, der größer ist, als Dein geschriebenes und mach eine Schleife, die jedem Zeichen 0x00 zuweist. Dann kannst Du bequem Deinen String hineinschreiben und hinten ist garantiert ne null.
Die Ausgabe von itoa macht die null selber.
-
Hallo,
ich befürchte fast, du siehst das zu kompliziert.
Wenn du z.B. den String so initalisierst
char MyString [10] = "Hallo";
ist der automatisch Nullterminiert. Du musst mindestens immer ein Byte mehr Platz haben als Zeichen.
sprich
char MyString [5] = "Hallo"; //falsch
char MyString [6] = "Hallo"; //richtig
Zum echten Problem wird das ganze, wenn du dir deine Strings aus Zeichen oder Teilstrings zusammensetzt. Da können wir dir aber kein Beispiel geben, weil wir nicht wissen, wie du das machst. Nach dem letzten 'Nutz'-Zeichen musst du gegeben falls noch eine Null schreiben.
z.B.
MyString [0] = 'H';
MyString [1] = 'a';
...
MyString [5] = 0;
oder
MyString [5] = '\0';
Gruß
Jens