/*
* =============================================================================
* LCD.C
*
* DESCRICAO: driver de LCD
* implementa escrita de bytes e strings no display LCD
* AUTOR: Tiago Butzke dos Santos
* DATA DE CRIACAO: 2010/03
* DISPOSITIVO: LPC2388
* PLACA: MCB2300
*
* =============================================================================
*/
#include "lcd.h"
/*
* =============================================================================
* ROTINAS BASICAS
* =============================================================================
*/
// envia um dado de quatro bits para o display
void LCD_EnviaNibble(unsigned char pcDado) {
//seta a saida
FIO1CLR3 |= 0x0F;
FIO1PIN3 |= (pcDado & 0x0F);
TMR_Delay(10, cTMR_US);
// da um pulso na linha enable
LCD_ENSET;
TMR_Delay(10, cTMR_US);
LCD_ENCLR;
}
void LCD_EnviaByte(short int psEndereco, unsigned char pcDado) {
LCD_RSCLR;
if (psEndereco) {
LCD_RSSET;
} else {
LCD_RSCLR;
}
TMR_Delay(10, cTMR_US);
// desativa linha enable
LCD_ENCLR;
// envia a primeira parte do byte
LCD_EnviaNibble(pcDado >> 4);
// envia a segunda parte do byte
LCD_EnviaNibble(pcDado & 0x0F);
}
// rotina de inicializacao do display
void LCD_Ini(void) {
short int lsConta;
TMR_Delay(255, cTMR_MS);
FIO1DIR3 |= 0xFF;
FIO1CLR3 |= 0xFF;
// envia uma sequencia de 3 vezes 0x03
// e depois 0x02 para configurar o modulo
// para modo de 4 bits
for (lsConta = 1; lsConta <= 3; ++lsConta) {
LCD_EnviaNibble(3);
TMR_Delay(6, cTMR_MS);
}
LCD_EnviaNibble(2);
TMR_Delay(6, cTMR_MS);
// envia string de inicializacao do display
for (lsConta = 0; lsConta <= 3; ++lsConta) {
LCD_EnviaByte(0, cLCD_INI_BUF[lsConta]);
TMR_Delay(6, cTMR_MS);
}
}
void LCD_PosXY(short int psY, short int psX) {
unsigned char lcEndereco;
if (psY != 1) {
lcEndereco = cLCD_SEG_LIN;
} else {
lcEndereco = 0;
}
lcEndereco += psX - 1;
LCD_EnviaByte(0, (0x80 | lcEndereco));
}
// envia caractere para o display
void LCD_Escreve(unsigned char pcDado) {
switch (pcDado) {
case '\f':
LCD_EnviaByte(0, 1); // limpa display e coloca na posicao (1,1)
TMR_Delay(2, cTMR_MS);
break;
case '\n':
case '\r':
LCD_PosXY(2, 1); // pula pra posicao (2,1), ou seja, muda de linha
break;
case '\b':
LCD_EnviaByte(0, 0x10);
break;
default:
LCD_EnviaByte(1, pcDado);
break;
}
}
void LCD_EscreveString(unsigned char *pcString) {
while (*pcString != 0) {
LCD_Escreve(*pcString++);
}
}