Hallo zusammen,
ich habe ein 2x16-Display und möchte nur die Änderungen neu aufs Display
schreiben. Statt es immer komplett neu zu beschreiben.
Dies scheint aber nicht so wie erwartet möglich zu sein, ich vermute
stark dass es mit der Übergabe der char-Arrays zu tun hat. Kann aber
kein Problem sehen. Eventuell habt ihr eine Idee?
1 | int main(void)
|
2 | {
|
3 | char line0[16];
|
4 | char line1[16];
|
5 | InitUC(); //Init Ports(I/O), Sei()
|
6 | LCD_init(); //Init LCD
|
7 | strcpy(line0,"uc / LCD-INIT ");
|
8 | strcpy(line1,"INA219/ADC-INIT ");
|
9 | while (1)
|
10 | {
|
11 | write_changes_2_disp(0,&line0[0]);
|
12 | write_changes_2_disp(1,&line1[0]);
|
13 | _delay_ms(1000);
|
14 | }
|
15 | }
|
Es sollen also die beiden Strings line0 und line1 immer wieder aufs
display geschrieben werden, allerdings nur deren Änderungen, nicht immer
die kompletten Strings.
Dann habe ich die Ändrungs-Erkenn-Funktion:
1 | void write_changes_2_disp(uint8_t line_sel, char *line)
|
2 | {
|
3 | static char line0_old[16];
|
4 | static char line1_old[16];
|
5 | if (line_sel == 0)
|
6 | {
|
7 | //Write data to line 0
|
8 | for(uint8_t i = 0; i < 16 ; i++)
|
9 | {
|
10 | if (line0_old[i] /= line[i])
|
11 | { //Write changes
|
12 | line0_old[i] = line[i];
|
13 | LCD_WriteString(&line0_old[i],0,i,1);
|
14 | }
|
15 | }
|
16 | }
|
17 | else
|
18 | {
|
19 | //Write data to line 1
|
20 | for(uint8_t i = 0; i < 16 ; i++)
|
21 | {
|
22 | if (line1_old[i] /= line[i])
|
23 | { //Write changes
|
24 | line1_old[i] = line[i];
|
25 | LCD_WriteString(&line1_old[i],1,i,1);
|
26 | }
|
27 | }
|
28 | }
|
29 | return;
|
30 | }
|
Diese Funktion bekommt also einen zeiger auf das Element 0, der zu
schreibenden zeile, die Zeile selbst besteht immer aus 16Zeichen.
Insofern sollte mit einem vergleich "line1_old[i] /= line[i]" der Inhalt
der übergebenen mit dem Static-Inhalt der ehemaligen Zeile verglichen
werden und bei einem Unterschied der neue Inhalt an dieser Stelle auf
das LCD geschrieben werden. Ich vermute dass hier ein fataler Irrtum
vorliegt, kann ihn selbst aber nicht sehen...
Aufgerufen wird dann die Funkion:
1 | void LCD_WriteString(char *str, uint8_t line ,uint8_t base_addr, uint8_t len)
|
2 | { //Function does work for 4-Line-Displays
|
3 | uint8_t i=0;
|
4 | if (line == 1)
|
5 | {
|
6 | i=0x40;
|
7 | }
|
8 | else if (line == 2)
|
9 | {
|
10 | i=0x14;
|
11 | }
|
12 | else if (line == 3)
|
13 | {
|
14 | i=0x54;
|
15 | }
|
16 | len=len+i;
|
17 | for(uint8_t y = 0; i < len;i++, y++)
|
18 | {
|
19 | LCD_Send_ADDR(i+base_addr);
|
20 | LCD_Send(str[y]);
|
21 | }
|
22 | }
|
Welche bisher immer den kompletten text einer Zeile neu geschrieben hat.
Jedoch wird nun niemals mehr etwas geschrieben.
Vielleicht hat jemand von euch eine Idee, wo mein Denkfehler liegt?
Grüße und vielen Dank,
Matthias