Also die Version von Klebwax gibt bei
lcd_cpos = c % LCD_LL;
lcd_line = c / LCD_LL;

und c=0 als Ergebnis für lcd_cpos UND lcd_line je = 255 bzw. vermutlich eher -1 aus obwohl alles uint8_t ist bzw. auf solches gecastet wurde.
So hab ich das aber auch mal gelernt...
Da kann ich dir nicht folgen. 0 geteilt durch was auch immer außer 0 gibt 0. Also 0 / 15 = 0, simple Bruchrechnung.
So ist es auch bei modulo, das Ergebniss ist 0.

Einen Zusammenhang mit der Größe der Variablen kann ich nicht erkennen.

Code:
#define LENGHT 16

int main() {
    int i;
    uint8_t xpos;
    uint8_t line;

    for(i = 0; i < 80; i ++){
        xpos = i % LENGHT;
        line = i / LENGHT;
        printf("%d, %d, %d\n", i, xpos, line);
    }
    return 0;
}
Code:
0, 0, 0
1, 1, 0
2, 2, 0
3, 3, 0
4, 4, 0
5, 5, 0
6, 6, 0
7, 7, 0
8, 8, 0
9, 9, 0
10, 10, 0
11, 11, 0
12, 12, 0
13, 13, 0
14, 14, 0
15, 15, 0
16, 0, 1
.
.
77, 13, 4
78, 14, 4
79, 15, 4
Das ganze erzeugt mit gcc. Ich hab das ganze auch mal auf einem PIC24 laufen lassen. printf() hab ich da nicht, aber auch der Debugger zeigt mir das gleiche wie oben. Der Compiler ist auch der gcc.
Ich kann dir also nicht weiter helfen

MfG Klebwax