Nabend,
Ich wende mich heute nach drei Nächten voller Verzweiflung an euch. Nach
langer Zeit möchte ich mal wieder so ein 16*2 Display verwenden, welche
ich schon früher zu AVR Zeiten extrem viel benutzt habe.
Das Display hängt mit allen 8-bits am Port eines STM32 Microcontrollers.
Der Code unten wird entsprechen ausgeführt. Das Display zeigt an:
1 | [ ] [ ] [ ] [ ] [ ] [ ] [G] [F] [E] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
|
2 |
|
3 | [ ] [_] [G] [F] [E] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
|
das '_' ist hierei die Position des Cursers der auch schön blinkt. Das
lustige ist nun, das bei jedem Reset oder PowerOn das ganze weiter nach
rechts geschiftet wird und dann irgend wann mal wieder die Zeichenkette
"GFE" nachrückt.... Ich weiss wirklich nicht was ich falsch mache, doch
es muss irgend ein ganz dummer Fehler sein.
Die Ports werden anständig als PushPull Outputs deklariert.
Ich habe auch drei verschiedene LCDs getestet, sie zeigen alle die
selben Symptome.
Die Initialisierungswerte habe ich aus dem Datenblatt - Initialisieren
tut's sich soweit ja auch.
main.c
1 | tdispInit();
|
2 | tdispHome();
|
3 | tdispClear();
|
4 | tdispDrawChar('A');
|
5 | tdispDrawChar('B');
|
6 | tdispDrawChar('C');
|
highlevel code:
1 | bool_t tdispInit(void) {
|
2 | init();
|
3 | }
|
4 |
|
5 | void tdispClear(void) {
|
6 | write_cmd(0x01);
|
7 | }
|
8 |
|
9 | void tdispHome(void) {
|
10 | write_cmd(0x02);
|
11 | }
|
12 |
|
13 | void tdispDrawChar(char c) {
|
14 | write_data(c);
|
15 | }
|
driver code:
1 | void write_cmd(uint8_t data) {
|
2 | setpin_rs(FALSE);
|
3 | setpin_rw(FALSE);
|
4 |
|
5 | write_bus(data);
|
6 |
|
7 | setpin_e(TRUE);
|
8 | delayMicroseconds(1);
|
9 | setpin_e(FALSE);
|
10 | delayMicroseconds(5);
|
11 | }
|
12 |
|
13 | void write_data(uint8_t data) {
|
14 | setpin_rs(TRUE);
|
15 | setpin_rw(FALSE);
|
16 |
|
17 | write_bus(data);
|
18 |
|
19 | setpin_e(TRUE);
|
20 | delayMicroseconds(1);
|
21 | setpin_e(FALSE);
|
22 | delayMicroseconds(5);
|
23 | }
|
24 |
|
25 | void init(void) {
|
26 | delayMilliseconds(50);
|
27 |
|
28 | write_cmd(0x38);
|
29 | delayMilliseconds(64);
|
30 |
|
31 | write_cmd(0x0f);
|
32 | delaypMicroseconds(50);
|
33 |
|
34 | write_cmd(0x01);
|
35 | delayMilliseconds(5);
|
36 |
|
37 | write_cmd(0x06);
|
38 | delayMicroseconds(50);
|
39 | }
|
lowlevel routinen:
1 | /* enable pin */
|
2 | void setpin_e(bool_t state) {
|
3 | if(state)
|
4 | SetPin(GPIOE, 2);
|
5 | else
|
6 | ClearPin(GPIOE, 2);
|
7 | }
|
8 |
|
9 | /* rs pin */
|
10 | void setpin_rs(bool_t state) {
|
11 | if(state)
|
12 | SetPin(GPIOE, 0);
|
13 | else
|
14 | ClearPin(GPIOE, 0);
|
15 | }
|
16 |
|
17 | /* rw pin */
|
18 | void setpin_rw(bool_t state) {
|
19 | if(state)
|
20 | SetPin(GPIOE, 1);
|
21 | else
|
22 | ClearPin(GPIOE, 1);
|
23 | }
|
24 |
|
25 | void write_bus(uint8_t data) {
|
26 | WritePort(GPIOD, data);
|
27 | }
|
Könnt ihr mich bitte ins Licht führen? :D
~ Tectu