domingo, 17 de enero de 2010

SDCC LCD a 4 bit's

Del sitio iearobotics.com hay un ejemplo para manejar LCD a 8bits, en este caso lo adapte para 4 bits.

#include <pic16f873a.h>
typedef unsigned int word;
word at 0x2007 CONFIG = _HS_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF & _CP_OFF;

//-- Pines de conexionado para el LCD
#define RW RA2
#define RS RA1
#define E RA0


//-- Valor inicial del timer0 para hacer una pausa de 10ms
//-- Divisor del prescar a 256
#define T_10ms 61

void timer0_delay(unsigned char t0ini)
{
//-- Dar valor inicial del timer
TMR0=t0ini;

//-- Flag de interrupcion a cero
T0IF=0;

//-- Esperar a que transcurra el tiempo indicado
while(T0IF==0);
}

/*******************************************************/
/* Pausa */
/* ENTRADA: duracion de la pausa en centesimas (10ms) */
/*******************************************************/
void delay(unsigned int duracion)
{
unsigned int i;

for (i=0; i<duracion; i++)
timer0_delay(T_10ms);
}

/*********************************************/
/* Habilitar el dato escrito en el puerto B */
/*********************************************/
void enable()
{
//-- Hay que garantizar un tiempo minimo de 500ns
//-- A 20Mhz, las instrucciones tardan 200ns.
//-- Por eso nos curamos en salud y repetimos la instruccion
//-- tres veces.
E=1; E=1; E=1;
E=0; E=0; E=0;
}

/**********************************/
/* Enviar un comando al LCD */
/**********************************/
void lcd_cmd(unsigned char cmd)
{
RS=0;
PORTB=cmd;
enable();
cmd<<=4;
PORTB=cmd;
enable();
delay(1);
}

/*********************************/
/* Escribir un dato en el lcd */
/*********************************/
void lcd_write(unsigned char car)
{
RS=1;
PORTB=car;
enable();
car<<=4;
PORTB=car;
enable();
delay(1);
}

void main(void)
{
TRISB=0b00000000;
TRISA=0b00000000;
ADCON1=0x06;

//-- Configurar temporizador para hacer pausas
T0CS=0; PSA=0;
//-- Configurar el prescaler (division entre 64)
PS2=1; PS1=1; PS0=1;

//-- Pausa inicial
delay(1);

//-- Inicializar lcd (para trabajar a 4 bits)
RW=0; E=0;
lcd_cmd(0b00101000);

//-- Modo de funcionamiento
lcd_cmd(0b00000110);

//-- Encender el LCD
lcd_cmd(0b00001110);

//-- Cursor a HOME
lcd_cmd(0b00000010);

//-- CLS
lcd_cmd(0b00000001);

//-- Enviar una cadena
lcd_write('H');
lcd_write('O');
lcd_write('L');
lcd_write('A');
lcd_write('!');

while(1);
}

No hay comentarios:

IRC

#freenode->#usljujuy

Seguidores

Eventos n_n

Tira Ecol Nano,Bilo y Luca