Revisando la librería de ccs para manejar el lcd he encontrado que se le pueden hacer las siguientes mejoras.
Las siguientes líneas
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
pueden ser cambiadas por estas
lcd_send_nibble(swap(n));
lcd_send_nibble(swap(n));
Las líneas anteriores producen un ahorro de 6 líneas en assambler.
Y las siguientes lineas
void lcd_gotoxy(BYTE x, BYTE y)
{
BYTE address;
if(y!=1)
address=LCD_LINE_TWO;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
pueden ser cambiadas por estas
#define lcd_gotoxy(x,y) lcd_send_byte(0,0x80+ 0x40 * ( #if y < 3 y-1) #else y-3) + 0x14 #endif +(x-1))
La línea anterior es un macro que nos permite trabajar con lcd de 4 lineas, y ahorraremos como 20 lineas en assambler, pero tiene la desventaja que tenemos que modificar la funcion getc cambiando la linea
lcd_gotoxy(x,y);
por las siguientes líneas
if(y<3)
y=0x40 *(y-1);
else
y=0x40 * (y-3) + 0x14;
lcd_send_byte(0,0x80+ y +(x-1));
Pero siempre obtendremos un ahorro de código y por lo tanto una mejora en el rendimiento del programa.