@Klebwax
Also im Prinzip stimme ich Dir ja zu... insbesondere die Aussage zu den Regressionstests.. aber Du kannst mir schon zutrauen, das ich das nicht in der Luft freihängend teste...
Der Code sieht zum testen grade so aus:
Code:
int16_t lcd_putchar(char c)
{
static bool nl_seen;
static bool cursor_seen;
uint8_t i;
if (cursor_seen) { // erstes Zeichen nach \v, Cursorposition also \v%c
//if (c <= LCD_LL) lcd_line=0;
c=0x00;
lcd_line=0x00;
//else lcd_line = c % LCD_LL; //aus kumulierter Cursorpos Zeile und Spalte berechnen
lcd_cpos = (c - (lcd_line * LCD_LL));
lcd_data(LCD_SET_DDADR + LCDLineAdr[lcd_line] + lcd_cpos, LCD_CMD);
// hier steht auch noch was code, der aber nichts zur Sache tut
cursor_seen = false; //ok es geht weiter im String
return 1; // darf nicht zur weiteren Auswertung gelangen.
} else { // wenn keine Cursorposition, dann normales Zeichen
//.. blabla.. hier gehts noch weiter
Der Code sollte eigentlich später so aus sehen:
Code:
int16_t lcd_putchar(char c)
{
static bool nl_seen;
static bool cursor_seen;
uint8_t i;
if (cursor_seen) { // erstes Zeichen nach \v, Cursorposition also \v%c
if (c <= LCD_LL) lcd_line=0;
else lcd_line = c % LCD_LL; //aus kumulierter Cursorpos Zeile und Spalte berechnen
lcd_cpos = (c - (lcd_line * LCD_LL));
lcd_data(LCD_SET_DDADR + LCDLineAdr[lcd_line] + lcd_cpos, LCD_CMD);
// hier steht auch noch was code, der aber nichts zur Sache tut
cursor_seen = false; //ok es geht weiter im String
return 1; // darf nicht zur weiteren Auswertung gelangen.
} else { // wenn keine Cursorposition, dann normales Zeichen
//.. blabla.. hier gehts noch weiter
die lcd_data(LCD_SET_DDADR + LCDLineAdr[lcd_line] + lcd_cpos, LCD_CMD);
ist definiert als void lcd_data( uint8_t data, uint8_t mode ); , LCDLineAdr[] ist ein Array aus 4 ints
Laut Breakpoints und Einzelschrittverfolgung ist vor Einsprung in lcd_data der Wert von lcd_cpos=1 wenn c=0.
Ich versuche dort, aus einer uint8 Zahl die eine cursorposition auf einem langen String (bis 80 Zeichen, enthält letztlich Reihe und Spalte in einem Display) zu berechnen. Ich würde ja mit Modulo % arbeiten aber da hat jemand das erste Zeichen auf die 0.te Display Position definiert und modulo Operationen mit 0 erzeugen schon mal Div/0 Fehler... Also Suche ich einen weg um aus Angaben wie 0x14 die 2.te Zeile in der 4 Spalte zu berechnen wobei die Koordinaten dann aber leider Zeile 1, spalte 3 ist. Letzteres sind Vorgaben die ich so übernehmen muss um Code Compatibilität zu halten.
Und zur Aussage "Da braucht man nicht den Assemblercode anzuschauen." .. ich würds selbst nicht glauben wenn ich es nicht mit eigenen Augen sehen würde!
Gruß
Lesezeichen