Forum: Mikrocontroller und Digitale Elektronik putsXLCD nur der Anfangscharacter vom String auf LCD


von Beast (Gast)


Lesenswert?

Moin,

vielleicht könnt ihr mir auch ohne meinen Code helfen.
Hab hier einen PIC18F4455, ein Hitachi 2x16 LCD (der Standard halt) und 
das versuch ich mit XLCD und XC8 zum laufen zu bewegen.

Scheint mir soweit auch alles gut, benutz den Befehl putsXCLD(text) und 
hab als text: char text[13] = "MFRC522-Test";
Die Zeile 2 fütter ich auf gleicher Art mit char text2[3] = "->";

Zu sehen bekomme ich immer nur die ersten Zeichen, also oben das "M" und 
unten den "-".

Beim Debuggen seh ich das in putsXLCD aber alle Zeichen durchgegangen, 
*buffer also alle values von text hat, werden, nur schreibt das LCD die 
dann nicht...komisch.

Mit dem alten C18 Compiler und MPLAB8 lief das LCD schon problemlos!

Vielleicht hat jemand von euch sowas schonmal selbst gehabt und weiß was 
falsch läuft..

Gruß
Beast

von Volker S. (vloki)


Lesenswert?

Vielleicht läuft irgendwas bei der Initialisierung falsch.
(Cursor increment/decrement)

Schreib doch mal was kurzes in die Mitte der Zeile.
Wenn es dann rückwärts da steht ...

: Bearbeitet durch User
von Beast (Gast)


Lesenswert?

Gute Idee, mach ich heute Abend mal!

von Beast (Gast)


Lesenswert?

Moin Volker,
Du hast recht!
Hab mir openXLCD.c angesehen und da war wirklich ein writecmd für 
Cursor_Left, hab das korrigiert, so daß der Cursor sich nach rechts 
bewegt (in xlcd.h ist ja einiges definiert).
Das er nun in der Mitte anfängt zu schreiben, nicht die volle Zeile 
verwendet und so....da läuft noch was verkehrt...mal schaun!

Gruß Beast

von Beast (Gast)


Lesenswert?

Moin,

hab mir das nochmal angesehen, insbesondere eins der HD44780 Datasheets.
Entweder hab ich etwas nicht kapiert, von wegen Cursor left/right und 
Display left/right, oder die haben sich bei der xlcd.h geirrt...mal ein 
kleiner Auszug von den Definitions in xlcd.h:
1
/* Cursor or Display Shift defines */
2
#define SHIFT_CUR_LEFT    0b00000100  /* Cursor shifts to the left   */
3
#define SHIFT_CUR_RIGHT   0b00000101  /* Cursor shifts to the right  */
4
#define SHIFT_DISP_LEFT   0b00000110  /* Display shifts to the left  */
5
#define SHIFT_DISP_RIGHT  0b00000111  /* Display shifts to the right */
Wenn ich mir nun das HD44780 Datasheet ansehe:

Entry
mode set   0 0 0 0 0 0 0 1 I/D S  Sets cursor move direction
                                  and specifies display shift.
                                  I/D: Increment = 1, Decrement =0
                                  S = 1 :Accompanies display shift
Cursor or
display
shift    0 0 0 0 0 1 S/C R/L — —  Moves cursor and shifts
                                  display without changing
                                  DDRAM contents.
                                  S/C: Display Shift = 1; Cursor Move= 0
                                  R/L: to the right = 1; to the left= 0

dann denk ich sollte das bei xlcd.h eher so aussehen:
1
/* Entry mode set */
2
#define CUR_RIGHT_NO_DISP_SHIFT 0b00000110  /* Cursor move right, no shift of the display */
3
#define CUR_LEFT_NO_DISP_SHIFT  0b00000100  /* Cursor move left, no shift of the display */
4
#define CUR_RIGHT_DISP_SHIFT    0b00000111  /* Cursor move right, shift of the display */
5
#define CUR_LEFT_DISP_SHIFT     0b00000101  /* Cursor move left, shift of the display */
6
/* Cursor or Display Shift defines */
7
#define SHIFT_CUR_LEFT    0b00010000  /* Cursor shifts to the left   */
8
#define SHIFT_CUR_RIGHT   0b00010100  /* Cursor shifts to the right  */
9
#define SHIFT_DISP_LEFT   0b00011000  /* Display shifts to the left  */
10
#define SHIFT_DISP_RIGHT  0b00011100  /* Display shifts to the right */

Benutze ich aus der xlcd.h die Definition SHIFT_DISP_LEFT in OpenXLCD.c 
dann ist die Darstellung auf meinem 2x16 HD44780 perfekt, also wenn ich 
im Grunde den Entry Mode: Cursor move right, no shift of the display 
nehme.

Gruß
Beast

von Volker S. (vloki)


Lesenswert?

Es scheint die Defines für den Entry Mode fehlen komplett.
Ich habe mir schon vor langer Zeit meine eigene Display Bibliothek 
geschrieben, weil:

1. Ich Unabhängigkeit in der Pinbelegung der Datenleitungen haben wollte
   (nicht an einen Port oder ein Nibble gebunden)
2. Die Lib idiotischer Weise immer vor-kompiliert in der Processor Lib 
ist
   (Pins sind damit schon vorgegeben, Lib muss neu kompiliert werden 
...)
3. Die ersten Versionen das Busy Flag nicht genutzt haben.

Die Definitionen sehen jetzt so aus:
1
// Instruction Set defines (HD44780 compatible)
2
//                              RS  R/W |   D7  D6  D5  D4  D3  D2  D1  D0
3
// Clear display                0   0   |   0   0   0   0   0   0   0   1
4
    #define CLEAR_DISPLAY       0x01
5
// Return home                  0   0   |   0   0   0   0   0   0   1   -
6
    #define RETURN_HOME         0x02
7
// Entry mode set               0   0   |   0   0   0   0   0   1   I/D S
8
    #define ENTRY_MODE          0x04
9
    #define CURSOR_INC          0x02
10
    #define CURSOR_DEC          0x00
11
    #define DSHIFT_ON           0x01
12
    #define DSHIFT_OFF          0x00
13
// Display ctrl                 0   0   |   0   0   0   0   1   D   C   B
14
    #define DISPLAY_CTRL        0x08
15
    #define DISPLAY_ON          0x04
16
    #define DISPLAY_OFF         0x00
17
    #define CURSOR_ON           0x02
18
    #define CURSOR_OFF          0x00
19
    #define BLINK_ON            0x01
20
    #define BLINK_OFF           0x00
21
// Cursor / Display shift       0   0   |   0   0   0   1   S/C R/L -   -
22
    #define DISPLAY_SHIFT_R     0x1C
23
    #define DISPLAY_SHIFT_L     0x18
24
    #define CURSOR_MOVE_R       0x14
25
    #define CURSOR_MOVE_L       0x10
26
27
#define LCD_Clear() LCD_Command(CLEAR_DISPLAY); LCD_DELAY_5MS()
28
#define LCD_Home()  LCD_Command(RETURN_HOME); LCD_DELAY_5MS()
und werden so benutzt:
1
    LCD_Command(DISPLAY_CTRL + DISPLAY_ON);// + BLINK_ON + CURSOR_ON);
2
    LCD_Command(ENTRY_MODE + CURSOR_INC + DSHIFT_OFF);
3
    LCD_Clear();
4
    LCD_Home();

: Bearbeitet durch User
von Beast (Gast)


Lesenswert?

Ahh, du addierst das in LCD_Command zusammen.
Ich dachte mir gestern noch ob es nicht egal ist ob ich den Cursor nach 
rechts beweg oder aber das Display nach links...

Gruß
Beast

von Volker S. (vloki)


Lesenswert?

Eigentlich sollte man es wohl besser ver-odern als zu addieren ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.