Codigo:
#include <18f452.h>
#include <stdlib.h>
#include <string.h>
#define RW PIN_A2
#define E PIN_A1
#define RS PIN_A3
#define disp_on 0b00001111
#define curs_off 0b00001101
#define blink_off 0b00001110
char text[16];
#Fuses HS,NOPROTECT,NOBROWNOUT,NOWDT,PUT,NODEBUG,NOLVP
#use delay (clock=20000000)
//Coloca els 4 bits de menor per de data al port d (0-3), manté E activat durant 1 us.
void clknibbleout(unsigned char data)
{
data &= 0x0f;
output_d(data);
delay_us(1);
output_bit(E,1);
delay_us(1);
output_bit(E,0);
}
unsigned char LCD_BUSY(void)
{
unsigned char port_data, port_busypin;
set_tris_d(0xff); //Configura el port d com entrada
output_bit(RW,1); //Posa RW a 1
output_bit(RS,0); //Posa RS a 0
delay_us(1);
output_bit(E,1); //Activa E
delay_us(1);
port_data = input_d(); //Llegeix el port d
port_busypin = port_data & (0x08); //and amb el bit d3
output_bit(E,0); //Desactiva E
delay_us(1);
output_bit(E,1); //Activa E
delay_us(1);
output_bit(E,0); //Desactiva E
output_bit(RW,0); //Desactiva RW
set_tris_d(0x00); //Configura el port d com sortida
return port_busypin; //Retorna el bit d3
}
void LCD_Command(unsigned char cmd)
{
set_tris_d(0x00);
output_bit(RW,0);
output_bit(RS,0);
clknibbleout(cmd>>4);
clknibbleout(cmd);
}
void LCD_WriteChar(char data)
{
set_tris_d(0x00);
output_bit(RW,0);
output_bit(RS,1);
clknibbleout(data>>4);
clknibbleout(data);
set_tris_d(0xff);
}
void LCD_init(void)
{
SET_TRIS_A(0x04); //Activa R/W com entrada i E i RS com sortida
SET_TRIS_D(0x00); //Posa el port D com sortida
output_bit(RW,0); //Posa senyals de control a 0
output_bit(E,0);
output_bit(RS,0);
delay_ms(5);
clknibbleout(0b00000011); //Treu 0011 per d0-d3
delay_ms(5);
clknibbleout(0b00000011); //Treu 0011 per d0-d3
delay_ms(5);
clknibbleout(0b00000010); //Treu 0010 per d0-d3
delay_ms(5);
clknibbleout(0b00000010); //Treu 0010 per d0-d3
clknibbleout(0b00001000); //Treu 1000 per d0-d3
while(LCD_BUSY()); //Mentres
LCD_Command(0x01);
delay_ms(20);
LCD_Command(disp_on & curs_off & blink_off);
}
void LCD_display(unsigned char line, unsigned char position, char *text)
{
int i =0;
unsigned char address ;
address = position - 1;
if(line == 2)
address += 0x40;
address += 0b10000000;
while(LCD_BUSY());
LCD_Command(address);
while(text)
{
while(LCD_BUSY());
delay_us(10);
LCD_WriteChar(text);
i++;
}
}
void clear_screen(void)
{
strcpy(text, " ");
delay_us(50);
LCD_display(1, 1, text);
LCD_display(2, 1, text);
}
void main(void)
{
setup_adc_ports(NO_ANALOGS);
set_tris_b(0x00);
OUTPUT_HIGH(PIN_B0);
delay_ms(1000);
LCD_init();
OUTPUT_LOW(PIN_B0);
delay_ms(1000);
clear_screen();
OUTPUT_HIGH(PIN_B0);
delay_ms(1000);
strcpy(text, "Hola Mon");
delay_us(50);
LCD_display(1, 1, text);
delay_ms(500);
strcpy(text, "HOLA MON 2");
delay_us(50);
LCD_display(2, 1, text);
delay_ms(1500);
}