Re: lcd display
First in a C program, you must write Routines like... (this is a routine for a 16X4 LCD)
void LCDSetXY(INT8U row, INT8U col)
{
INT8U pos; /* Variable temporal posición */
if (row < LCD_MAX_ROW && col < LCD_MAX_COL) {
/* Si la pantalla está en rango */
LCDSel(LCD_RS_LOW); /* Cambia a línea de comandos */
switch (row) { /* Decide que línea */
case LCD_ROW0: /* Si es la línea 0 */
pos = LCD_ROW0_OFFSET; /* Posiciona offset de línea 0 */
break; /* romper */
case LCD_ROW1: /* Si es la línea 1 */
pos = LCD_ROW1_OFFSET; /* Posiciona offset de línea 1 */
break; /* Romper */
case LCD_ROW2: /* Si es la línea 2 */
pos = LCD_ROW2_OFFSET; /* Posiciona offset de línea 2 */
break; /* Romper */
case LCD_ROW3: /* Si es la línea 3 */
pos = LCD_ROW3_OFFSET; /* Posiciona offset de línea 3 */
break; /* Romper */
} /* Fin de la decisión múltiple */
LCDWr(pos+col); /* Mueve hacia la fila-columna */
} /* Sal de la condicional */
}
void LCDWrChar(INT8U data)
{ /* Escribe un caracter */
LCDSel(LCD_RS_HIGH); /* Cambia a escritura */
LCDWr(data); /* Escribe caracter */
} /* Retorna */
void LCDSel(BOOLEAN cmd)
{ /* Selecciona modo esc./com. */
if (cmd == LCD_RS_HIGH) /* Si cmd es modo escritura */
LCD_RS_PORT |= (1 << LCD_RS_PIN); /* Selecciona modo de escritura */
else
LCD_RS_PORT &= ~(1 << LCD_RS_PIN); /* Selecciona modo de comandos */
}
void LCDWr(INT8U data)
{ /* Escribe caracter o comando */
#if LCD_8BIT_MODE_EN
LCD_DATA_PORT = data; /* Manda el dato/comando */
#else
LCD_DATA_PORT = (data & 0xF0) + (LCD_DATA_PORT & 0x0F);
/* Manda el dato/comando */
#endif
LCD_E_PORT |= (1 << LCD_E_PIN); /* Levanta Enable */
delayNus(5,1); /* Retarda +1us */
LCD_E_PORT &= ~(1 << LCD_E_PIN); /* Baja Enable, reconoce inst. */
delayNus(5,60);
#if LCD_8BIT_MODE_EN
#else
LCD_DATA_PORT = ((data & 0x0F)<<4) + (LCD_DATA_PORT & 0x0F);
LCD_E_PORT |= (1 << LCD_E_PIN); /* Levanta Enable */
delayNus(5,1); /* Retarda +1us */
LCD_E_PORT &= ~(1 << LCD_E_PIN); /* Baja Enable, reconoce inst. */
#endif
delayNus(5,60); /* Retarda +40us */
}
void LCDWrXY(INT8U row, INT8U col, INT8U data)
{ /* Escribe en la posición X-Y */
if (row < LCD_MAX_ROW && col < LCD_MAX_COL) {
/* Si está entre los límites */
LCDSetXY(row, col); /* Posiciona fila-columna */
LCDWrChar(data); /* Escribe caracter */
} /* Sale de la condicional */
} /* Retorna */