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
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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.