Hola a todos, luego de ver los inconvenientes que yo mismo tuve al igual que otros amigos que les gustaría entender la programación de microcontroladores PIC18 con el compilador C18 dado que sus librería son completamente diferentes a los otros compiladores mas famosos como el que algunas veces yo mismo uso el CCS y MIKROC for PICmicro, decidí crear esta librería que trabaja muy parecido a las de estos compiladores con el fin de ayudar a dar ese paso que algunos no quieren dar al C18, no por que sea mejor ni mas fácil de usar si no por que es la base para aprender C30 y si dios nos da fuerzas C32, compiladores muy útiles para programar DSPics, PIC24, PIC32 y bueno también acostumbrarnos mejor dicho vamos al grano.
Esquema del montaje en proteus:
Primera vercion del codigo:
#ifndef __LCD_H
#define __LCD_H
// libreria para el manejo de lcd desarrollado por mariano rocha para c18
// Inicio de creacion 14 enero 2010
#define LcdPort PORTB
#define Lcd_e PORTBbits.RB3
#define Lcd_rs PORTBbits.RB2
#define Busy_Delay 1
#define Lcd_Delay 3
// definicion de comandos para el display
#define Lcd_Clr 0b00000001
#define On_Cur 0b00001110
#define Off_Cur 0b00001100
#define Shif_Cur_Righ 0b00010100
#define Shif_Cur_Left 0b00010000
#define Shif_Viz_Righ 0b00011100
#define Shif_Viz_Left 0b00011000
#define Lcd_Normal 0b00000110
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
// Funciones
// retardos no precisos de 1mSg
void delay_ms(unsigned short t){
unsigned short x;
unsigned char j;
for(x=0;x>t;x++){for(j=0;j<80;j++);}
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void Lcd_Cmd(unsigned char cmd){
Lcd_rs=1; //modo comando
LcdPort=cmd;
delay_ms(Busy_Delay); // busy delay
Lcd_e=0; // habilita lcd
delay_ms(Busy_Delay);
Lcd_e=0; // deshabilita el lcd
Lcd_rs=0; //modo comando
LcdPort=cmd<<4;
delay_ms(Busy_Delay); // busy delay
Lcd_e=1; // habilita lcd
delay_ms(Busy_Delay);
Lcd_e=0; // deshabilita el lcd
delay_ms(Lcd_Delay); // lcd delay
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void Lcd_gotoxy(unsigned char y,unsigned char x){
unsigned char fll,fy;
fy=y-1;
switch(fy){
case 0: fll=0b10000000; break;
case 1: fll=0b11000000; break;
case 2: fll=0b10100000; break;
case 3: fll=0b11100000; break;
case 4: fll=0b10010000; break;
case 5: fll=0b11010000; break;
case 6: fll=0b10110000; break;
case 7: fll=0b11110000; break;
}
Lcd_Cmd(fll | x-1);
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void Lcd_Chr_cp(unsigned char dat){
Lcd_rs=0; //modo comando
LcdPort=dat;
delay_ms(Busy_Delay); // busy delay
Lcd_rs=1; //modo dato
Lcd_e=1; // habilita lcd
delay_ms(Busy_Delay);
Lcd_e=0; // deshabilita el lcd
Lcd_rs=0; //modo comando
LcdPort=dat<<4;
Lcd_rs=1; //modo dato
Lcd_e=1; // habilita lcd
delay_ms(Busy_Delay);
Lcd_e=0; // deshabilita el lcd
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void Lcd_Chr(unsigned char y, unsigned char x, unsigned char dat){
Lcd_gotoxy(y,x);
Lcd_Chr_cp(dat);
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void Lcd_Out_cp(char *text)
{
while(text)
{
Lcd_Chr_cp(*text);
text++;
}
return;
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void Lcd_Out(unsigned char y, unsigned char x, char *text)
{
Lcd_gotoxy(y,x);
while(text)
{
Lcd_Chr_cp(*text);
text++;
}
return;
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void Lcd_OutR(unsigned char y, unsigned char x, unsigned rom char *text)
{
Lcd_gotoxy(y,x);
while(text)
{
Lcd_Chr_cp(*text);
text++;
}
return;
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void Lcd_Init(){
Lcd_rs=0; //modo comando
LcdPort=0b00100000; // comando funcion set para que el lcd entienda que son 4 lineas
delay_ms(Busy_Delay); // busy delay
Lcd_e=1; // habilita lcd
delay_ms(Busy_Delay); // busy delay
Lcd_e=0; // deshabilita el lcd
delay_ms(Busy_Delay); // lcd delay
Lcd_Cmd(0b00101000); // envia el comando completo de configuracion
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
Ejemplo de uso:
#include <lcd.h>
void main(void){
char text [10]="Mikrosurfer";
TRISB=0;
PORTB=0;
Lcd_Init();
Lcd_Cmd(Lcd_Clr);
Lcd_Cmd(Off_Cur);
Lcd_OutR(1,1,"Ucontrol");
Lcd_Out(2,1,text);
while(1);
}
Además tuve que crear una librería mas completa para ayudar a un amigo en UControl que me lo pidió.
Acá esta la librería con código de ejemplo y simulación
Descargar de
http://www.mikropics.webcindario.com/ Espero que mi pequeño aporte sea de gran ayuda a todos.