¡Hola!
Estoy intentando sacar lo que me llega por la UART por el módulo LCD usando la función Lcd_Chr_CP(). El primer problema con el que me encontré es que mikroC parece trabajar bien sólo con módulos de 40 caracteres de ancho. Digo esto porque después de escribir 24 caracteres tengo que escribir 16 más (que no se muestran) para que salte de línea. Esto lo he solventado llevando manualmente la posición del cursor.
En definitiva lo que quiero hacer es una interfaz estilo lcdserializer para lcdproc ( http://lcdproc.sourceforge.net/docs/current-user.html#hd44780-lcdserializer ), como el que hay en el siguiente link para el PIC16F84
http://www.mindspring.com/~tcoonan/lcd.html
El caso es que no funciona bien en lcdproc, sale todo descuadrado y con mucha basura; mientras que usando un programa de terminal como putty todo se muestra correctamente.
A continuación el código:
Estoy intentando sacar lo que me llega por la UART por el módulo LCD usando la función Lcd_Chr_CP(). El primer problema con el que me encontré es que mikroC parece trabajar bien sólo con módulos de 40 caracteres de ancho. Digo esto porque después de escribir 24 caracteres tengo que escribir 16 más (que no se muestran) para que salte de línea. Esto lo he solventado llevando manualmente la posición del cursor.
En definitiva lo que quiero hacer es una interfaz estilo lcdserializer para lcdproc ( http://lcdproc.sourceforge.net/docs/current-user.html#hd44780-lcdserializer ), como el que hay en el siguiente link para el PIC16F84
http://www.mindspring.com/~tcoonan/lcd.html
El caso es que no funciona bien en lcdproc, sale todo descuadrado y con mucha basura; mientras que usando un programa de terminal como putty todo se muestra correctamente.
A continuación el código:
Código:
#define NROWS 2
#define NCOLS 24
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RA0_bit;
sbit LCD_D5 at RA1_bit;
sbit LCD_D6 at RA2_bit;
sbit LCD_D7 at RA3_bit;
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISA0_bit;
sbit LCD_D5_Direction at TRISA1_bit;
sbit LCD_D6_Direction at TRISA2_bit;
sbit LCD_D7_Direction at TRISA3_bit;
void main() {
char character;
unsigned char col=0;
unsigned char row=0;
OSCCON=0x7E;
ANSEL=0;
TRISA=0;
UART1_Init(9600);
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);
while(1) {
if(UART1_Data_Ready()) {
character = UART1_Read();
if (0xFE !=character) {
if(0==col) {
if(0==row) {
Lcd_Cmd(_LCD_CLEAR);
}
else
Lcd_Cmd(_LCD_SECOND_ROW);
}
Lcd_Chr_CP(character);
col=(col+1)%NCOLS;
if(0==col)
row=(row+1)%NROWS;
}
else {
while(!UART1_Data_Ready());
character = UART1_Read();
switch (character) {
case 1: Lcd_Cmd(_LCD_CLEAR); row=0; col=0; break;
case 2: Lcd_Cmd(_LCD_RETURN_HOME); break;
case 12: Lcd_Cmd(_LCD_CURSOR_OFF); break;
case 13: Lcd_Cmd(_LCD_BLINK_CURSOR_ON); break;
case 14: Lcd_Cmd(_LCD_UNDERLINE_ON); break;
case 16: Lcd_Cmd(_LCD_MOVE_CURSOR_LEFT);
col=(col-1)%NCOLS;
if(NCOLS-1==col)
row=(row-1)%NROWS;
break;
case 20: Lcd_Cmd(_LCD_MOVE_CURSOR_RIGHT);
col=(col+1)%NCOLS;
if(0==col)
row=(row+1)%NROWS;
break;
case 24: Lcd_Cmd(_LCD_SHIFT_LEFT); break;
case 28: Lcd_Cmd(_LCD_SHIFT_RIGHT); break;
case 192: Lcd_Cmd(_LCD_SECOND_ROW); row=1; col=0; break;
}
}
}
}
}