Autor Tema: Cursillo en C18 para PICS DESDE CERO  (Leído 250306 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #180 en: 05 de Marzo de 2008, 17:37:19 »
Bueno tengo entendido que la funcion OpenADC configura los registros ADCON0, ADCON1, ADCON2, y la funcion SetChanADC solo cambia el canal que vas a utilizar para la entrada al conversor, esto es en el registro ADCON0, de modo que al emplear OpenADC solo selecciona un canal para la siguiente conversion, si decides emplear otro canal para otra conversion lo haces con SetChanADC pero previamente deberias haber configurado como entrada analogica el canal que vas a utilizar y esto se hace con OpenADC ya que ahi configuras el ADCON1.  Por lo tanto la funcion OpenADC solo la pones una ves y luego utilizas SetChanADC para cambiar de canal, espero haber resuelto tu duda   :mrgreen:

                                                                                Saludos  :-)
...enrique  :-)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #181 en: 06 de Marzo de 2008, 13:20:02 »
Enrique_86 está muy bien tu explicación, solo quería agregar que dependiendo del micro la función OpenADC también configurará los registros ANSEL y ANSELH.  Estos registros permiten configurar unitariamente los pines analógicos sin seguir una secuencia programada .  Si queremos que usar el AN0 y el AN7 y no queremos que entre medio estén como analógicas la entradas de AN1 a AN6 entonces en esos micros es perfectamente posible :) :)

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #182 en: 07 de Marzo de 2008, 18:27:57 »
offtopic: hola enrique jejeje no he tenido mucho tiempo para responder a tu post del ADC, tengo unos ejemplillos por aqui lo que si me falta es tiempo por que toda la semana he estado de parranda hermano y pucha ya s eme esta borrando toda la memoria flash dde tanto reseteo que me aplico jejejej nada mas te pido un poquito de paciencia.  :mrgreen:
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #183 en: 10 de Marzo de 2008, 17:03:59 »
Hola! bueno solucione mi problema con el ADC  :-) gracias de todas maneras micro_cadaver! y haber si sigues con cursillo que esta muy bueno   8)
               
                                                                                                             Saludosss!!
...enrique  :-)

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #184 en: 11 de Marzo de 2008, 15:15:13 »
en horabuena, y porque no lo subes para que otros tambien puedan aprender. saludos!  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #185 en: 11 de Marzo de 2008, 18:16:43 »
Estuve leyendo este post ( muy bueno por cierto ) y tengo una duda estupida, no seria mejor llamar el titulo del post "Cursillo de C utilizando el compilador C18 de MicroChip para micros de la serie PIC 18"...Porque cuando se lee el titulo parace que se hablaria de un lenguaje llamado C18 y este solo es una implementación C orientada a esos PICs y con las extensiones de lenguaje como recomienda el standart.
Saludos !

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #186 en: 14 de Marzo de 2008, 00:22:28 »
Hola! Bueno a peticion de microcadaver  :mrgreen: subo un ejemplo utilizando la libreria adc.h, se trata de un voltimetro implementado con un 18F4550 con un cristal de 20Mhz, el funcionamiento es sencillo utiliza el ADC para captar el voltaje en el pin AN3 y luego muestra el valor captado (previamente escalado a la resolucion del ADC) en un LCD de 2x16, la libreria del LCD la saque de otro hilo y esta basada en la libreria XLCD.h de microchip, pueden reemplazarla por la libreria de manejo de LCD que utilizen o si me la piden con gusto se las paso  :-)


#include<p18f4550.h>
#include<delays.h>
#include<stdlib.h>
#include<adc.h>
#include "lcd.h"

#pragma config PLLDIV = 5//CONFIG1L
#pragma config FCMEN = OFF,IESO = OFF,FOSC=HS //CONFIG1H
#pragma config PWRT = OFF,BORV = 0 //CONFIG2L
#pragma config WDT = OFF,WDTPS = 32768 //CONFIG2H
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF, CCP2MX = OFF//CONFIG3H
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF//CONFIG4L
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF//CONFIG5L
#pragma config CPB = OFF,CPD = OFF//CONFIG5H
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF//CONFIG6L
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF//CONFIG6H
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF//CONFIG7L
#pragma config EBTRB = OFF//CONFIG7H

unsigned float v = 0;
char s[3]={""};
void main(void)
{
   OpenXLCD(FOUR_BIT & LINES_5X7);
   WriteCmdXLCD(BLINK_ON);
   WriteCmdXLCD(CLEAR);
   TRISAbits.TRISA2 = 1;
   LATA=0x00;
   OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_0_TAD, //Config ADCON2
         ADC_CH2 & ADC_INT_OFF,                     //Config ADCON0
         12);                                 //Config ADCON1
   ADCON1=0x0B;
    for( ; ; )
   {   
      s[0] = 0;
      s[1] = 0;
      s[2] = 0;
      SetChanADC(ADC_CH3);
      Delay10TCYx(5);     //Delay de 50Ci
      ConvertADC();
      while(BusyADC());
      v = ReadADC();
      v = v * 488 / 1000;
      ultoa(v,s);         //conversion de un entero a una cadena    
      
      WriteCmdXLCD(CLEAR);//visualizacion de resultado en LCD (2x16)
      putrsXLCD("V1 = ");
      if(s[1]==0 && s[2]==0)
      {
         s[2]=s[0];
         s[1]='0';
         s[0]='0';
      }
      if(s[2]==0)
      {
         s[2]=s[1];
         s[1]=s[0];
         s[0]='0';      
      }
      putcXLCD(s[0]);
      putcXLCD('.');
      putcXLCD(s[1]);
      putcXLCD(s[2]);

      Delay10KTCYx(50); //Delay de 100ms
   }
}



Como podran ver en el datasheet del 18F4550 al ejecutar la instruccion ADCON1=0x0B lo que hago es configurar los voltajes de referencia internos a Vss y Vdd, ademas de configurar los pines analogicos que se van a emplear, esto se tendria que hacer mediante la instruccion OpenADC pero es aqui donde tuve los problemas, lo que pasa es q la libreria adc.h para el PIC 18f4550 utiliza solo numeros enteros entre 0 y 15, que al utilizarlos no contemplan la configuracion de los voltajes de referencia para el conversor ADC, pues lo pone por defecto como las entradas a los pines AN2 y AN3, y del modo que queria hacerlo esto no me funcionaba, es por eso que añado la intruccion ADCON1=0x0B luego de utilizar la instruccion OpenADC de este modo si funciono asi que aqui esta lo que hice.. Espero les sirva   :-) 

                                                                                                                          ...Saludos... :-/

 
« Última modificación: 05 de Abril de 2008, 15:24:07 por Enrique_86 »
...enrique  :-)

Desconectado juankho

  • PIC10
  • *
  • Mensajes: 12
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #187 en: 05 de Abril de 2008, 14:05:06 »
hola estuve ejecutando el programa pero logicamente, me hace falta la libreria <lcd.h> sera que me la puede facilitar por favor:. :lol:

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #188 en: 05 de Abril de 2008, 15:22:12 »
Hola! claro te la paso lo saque de este hilo:

http://www.todopic.com.ar/foros/index.php?topic=17984.0

Bueno tienes que instalarte el MegauploadToolbar para poder bajartelo pero eso es rapido asi no que no creo q tengas inconvenientes. Saludoss :)
...enrique  :-)

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #189 en: 05 de Abril de 2008, 17:23:38 »
subo el archivo del LCD por si no puedes bajarlo del megaupload.
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado 1mas

  • PIC10
  • *
  • Mensajes: 7
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #190 en: 07 de Abril de 2008, 09:40:10 »

   OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_0_TAD, //Config ADCON2
         ADC_CH2 & ADC_INT_OFF,                     //Config ADCON0
         12);                                 //Config ADCON1
   ADCON1=0x0B;
    
Como podran ver en el datasheet del 18F4550 al ejecutar la instruccion ADCON1=0x0B lo que hago es configurar los voltajes de referencia internos a Vss y Vdd, ademas de configurar los pines analogicos que se van a emplear, esto se tendria que hacer mediante la instruccion OpenADC pero es aqui donde tuve los problemas, lo que pasa es q la libreria adc.h para el PIC 18f4550 utiliza solo numeros enteros entre 0 y 15, que al utilizarlos no contemplan la configuracion de los voltajes de referencia para el conversor ADC, pues lo pone por defecto como las entradas a los pines AN2 y AN3, y del modo que queria hacerlo esto no me funcionaba, es por eso que añado la intruccion ADCON1=0x0B luego de utilizar la instruccion OpenADC de este modo si funciono asi que aqui esta lo que hice.. Espero les sirva   :-) 

                                                                                                                          ...Saludos... :-/

 

el registro ADCON1  si que se puede configurar con OpenADC.
OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_0_TAD, //Config ADCON2
         ADC_CH2 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VDD,      //configuracion de los Vref alto y bajo               
         12);                                 //Config ADCON1
El problema que le veo yo es que tanto VREFPLUS_VDD como VREMINUS_VDD se asignan a VDD :shock: y no a VDD y VSS como deveria ser(por lo menos eso es lo que pone en el datasheet de la libreria) :?. Eso me desconcierta bastante pos eso yo tb incluiré después el valor de  ADCON1 .
                                                un saludo a todos :)

Desconectado Enrique_86

  • PIC12
  • **
  • Mensajes: 62
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #191 en: 07 de Abril de 2008, 14:12:55 »
Hola 1mas, si tienes razon, se me debe de haber pasado por alto eso  :?... uhm he revisado lo que has puesto y consegui configurar el ADCON1 sin necesidad de adicionar la instrcuccion ADCON1=0x0B :) y otra cosa al archivo lcd.h yo le agregue estos comandos pues no las tenia y creo que son de mucha utilidad  8)

#define LINEA_1    0b10000000    // Linea 1
#define LINEA_2    0b11000000    // Linea 2
#define CLEAR       0b00000001    // Clear 
#define CURSOR_HOME 0b00000010 // Inicio

Ademas de ello habras notado que en el codigo que puse anteriormente no utilice la instruccion  while(BusyXLCD()); ya que la añadi al comienzo de cada funcion que hiba a utilizar de la libreria lcd.h esto lo hice para que el codigo salga un poco mas pequeño xD pero de otro modo (sin hacer lo que menciono antes) podrias utilizar el siguiente codigo:



#include<p18f4550.h>
#include<delays.h>
#include<stdlib.h>
#include<adc.h>
#include<string.h>
#include "lcd.h"

#pragma config PLLDIV = 5//CONFIG1L
#pragma config FCMEN = OFF,IESO = OFF,FOSC=HS //CONFIG1H
#pragma config PWRT = OFF,BORV = 0 //CONFIG2L
#pragma config WDT = OFF,WDTPS = 32768 //CONFIG2H
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF, CCP2MX = OFF//CONFIG3H
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF//CONFIG4L
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF//CONFIG5L
#pragma config CPB = OFF,CPD = OFF//CONFIG5H
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF//CONFIG6L
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF//CONFIG6H
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF//CONFIG7L
#pragma config EBTRB = OFF//CONFIG7H

unsigned float v = 0;
char s[3]={""};
void main(void)
{
   OpenXLCD(FOUR_BIT & LINES_5X7);
   WriteCmdXLCD(CURSOR_OFF);
   WriteCmdXLCD(CLEAR);
   TRISAbits.TRISA2 = 1;
   LATA=0x00;
   OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_0_TAD,//Config ADCON2
         ADC_CH2 & ADC_INT_OFF & ADC_VREFMINUS_VSS & ADC_VREFPLUS_VDD,//Config ADCON0
         11); //Config ADCON1
   for( ; ; )
   {   
      s[0] = 0;
      s[1] = 0;
      s[2] = 0;
      SetChanADC(ADC_CH3);
      Delay10TCYx(5);     //Delay de 50Ci
      ConvertADC();
      while(BusyADC());
      v = ReadADC();
      v = v * 488 / 1000;
      ultoa(v,s);         //conversion de un entero a una cadena    
      while(BusyXLCD());
      WriteCmdXLCD(CLEAR);//visualizacion de resultado en LCD (2x16)
      while(BusyXLCD());
      putrsXLCD("V1 = ");
      
      if(strlen(s)==1)
      {
         while(BusyXLCD());
         putcXLCD('0');
         while(BusyXLCD());
         putcXLCD('.');
         while(BusyXLCD());
         putcXLCD('0');
         while(BusyXLCD());
         putsXLCD(s);
      }
      if(strlen(s)==2)
      {
         while(BusyXLCD());
         putcXLCD('0');
         while(BusyXLCD());
         putcXLCD('.');
         while(BusyXLCD());
         putsXLCD(s);
      }
      if(strlen(s)==3)
      {
         while(BusyXLCD());
         putcXLCD(s[0]);
         while(BusyXLCD());
         putcXLCD('.');
         while(BusyXLCD());
         putcXLCD(s[1]);
         while(BusyXLCD());
         putcXLCD(s[2]);
      }
      Delay10KTCYx(50); //Delay de 100ms
   }
}



En este codigo utilizo la funcion strlen que devuelve la longitud de una cadena. Bueno espero haber contribuido un poco mas en el foro, un saludo a todos  :mrgreen:
...enrique  :-)

Desconectado 1mas

  • PIC10
  • *
  • Mensajes: 7
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #192 en: 11 de Mayo de 2008, 20:34:30 »
La LCD.H me va a volver loco :( :(
no consigo que me ponga nada en la pantalla(ni un hola).
Utilizo la placa de evaluación picdem 2 plus y en ella tengo en la parte baja del puerto D los bits de datos y en la alta los de control.
mis dudas son:
Al cambiar en la librería lcd.h el puerto al  que esta conectada la lcd tengo que volver a compilarla o ya esta. Si tengo que compilar como hago?.

Como no conseguí que me funcionase intente con la libreria lcd4b2x16.h y el programa de micro cadáver ( cambiando los pines para mi placa y la cabecera).
Lo que conseguí es que me ponga unos símbolos raros y para eso tengo que encender y apagar varias veces o darle al reset para que se queden.
Con esto descarto que los pines que yo defino  son los acertados, ademas los comprobé con el polimetro 20 veces.

este es el programa:

#include <p18f4620.h>
#include <delays.h>
#include <stdio.h>
#include"C:\MCC18\Proyectos Alvaro\Librerias\LCD4b2x16.h"//ruta del archivo en mi PC
//#include <usart.h>

#pragma config OSC = HS,FCMEN = OFF,IESO = OFF //CONFIG1H
#pragma config PWRT = ON,BOREN = OFF,BORV = 0 //CONFIG2L
#pragma config WDT = OFF,WDTPS = 32768 //CONFIG2H
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = PORTC//CONFIG3H
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = ON//CONFIG4L
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF//CONFIG5L
#pragma config CPB = OFF,CPD = OFF//CONFIG5H
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF//CONFIG6L
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF//CONFIG6H
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF//CONFIG7L
#pragma config EBTRB = OFF//CONFIG7H


char mensaje[]="Henry";


void main(void)
{
TRISA = 0X00;
TRISB = 0XF0;
TRISD = 0X00;
PORTA = 0X00;
PORTB = 0X00;
PORTD = 0X00;
Inicializa_LCD();
Comando_LCD(CURSOR_ON & BLINK_ON);
Dato_LCD('#');//un dato
Datos_LCD(" PERU ");//una cadena desde la memoria de programa
Dato_String_LCD(mensaje);//una cadena desde la memoria de datos
 
//con este comando pasamos a la linea 2 del LCD
Comando_LCD(DDRAM_LINEA_2);

Datos_LCD("micro_cadaver");
while(1);



}
« Última modificación: 11 de Mayo de 2008, 20:36:47 por 1mas »

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #193 en: 13 de Mayo de 2008, 16:05:31 »
vamo a ver que pasa, voy a simularlo y te comento.  :-/ saludos.
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #194 en: 19 de Mayo de 2008, 00:33:57 »
aca esta amigo, modifique la libreria del lcd para los requerimientos del hardware. saludos.  :-/

Código: C
  1. /******************************************************/
  2. /*
  3. /* Manejo de un Display de Cristal Liquido LCD 16X4   */
  4. /* de 16 caracteres por 4 lineas, con una interface   */
  5. /* de 4 lineas:                                       */
  6. /*
  7. /*      LCD                         PIC
  8. /* ------------------------------------
  9. /*      D4  (11)                -->     RD4
  10. /*      D5  (12)                -->     RD5
  11. /*      D6  (13)                -->     RD6
  12. /*      D7  (14)                -->     RD7
  13. /*
  14. /*      RS  (4)                 -->     RD0
  15. /*      RW  (5)                 -->     RD1
  16. /*      E   (6)                 -->     RD2
  17. /*
  18. /******************************************************/
  19. /* Conexiones del LCD al Microcontrolador */
  20. #define PIN_RS  LATDbits.LATD0  // Define la Columna 1
  21. #define PIN_RW  LATDbits.LATD1  // Define la Columna 2
  22. #define PIN_E   LATDbits.LATD2  // Define la Columna 3
  23.  
  24. /* Configuracion del Display y cursor */
  25. #define DON                             0b00001111  /* Display encendido   */
  26. #define DOFF                    0b00001011  /* Display apagado     */
  27. #define CURSOR_HOME             0b00000010  /* Cursor encendido    */
  28. #define CURSOR_ON               0b00001111  /* Cursor encendido    */
  29. #define CURSOR_OFF              0b00001101  /* Cursor apagado      */
  30. #define BLINK_ON                0b00001111  /* Cursor con parpadeo */
  31. #define BLINK_OFF               0b00001110  /* Cursor sin parpadeo */
  32. #define CLEAR                   0b00000001  /* Display encendido   */
  33.  
  34. /* Modo de entrada */
  35. #define INCREMENT               0b00000110  /* Incrementa la posicion del cursor */
  36. #define DECREMENT               0b00000100  /* Decrementa la posicion del cursor */
  37.  
  38.  
  39. /* Configuracion de los desplazamientos del cursor y del Display*/
  40. #define SHIFT_CUR_LEFT          0b00010011  /* Corrimiento del cursor a la izquierda  */
  41. #define SHIFT_CUR_RIGHT         0b00010111  /* Corrimiento del cursor a la derecha    */
  42. #define SHIFT_DISP_LEFT         0b00011011  /* Corrimiento del display a la izquierda */
  43. #define SHIFT_DISP_RIGHT        0b00011111  /* Corrimiento del display a la derecha   */
  44.  
  45.  
  46. /* Funciones de inicializacion */
  47. //#define NIBLE                         0b00000010  /* interface a 4 bits */
  48. #define NIBLE                           0b00100000  /* interface a 4 bits */
  49.  
  50. #define FOUR_BIT                        0b00101111  /* Interface a 4-bit  */
  51. #define EIGHT_BIT                       0b00111111  /* Interface a 8-bit  */
  52. #define LINE_5X7                        0b00110011  /* Una linea, caracter 5x7 */
  53. #define LINE_5X10                       0b00110111  /* Una linea, caracter 5x10 */
  54. #define LINES_5X7                       0b00111011  /* Dos lineas. character 5x7 */
  55.  
  56.  
  57. /* Lineas de trabajo */
  58. #define DDRAM_LINEA_1           0b10000000      /* Linea 1 */
  59. #define DDRAM_LINEA_2           0b11000000      /* Linea 2 */
  60. #define DDRAM_LINEA_3           0b10010000      /* Linea 3 */
  61. #define DDRAM_LINEA_4           0b11010000      /* Linea 4 */
  62.  
  63.  
  64. /* Configuracion del puerto */
  65. #define Config_Puerto           0b00000000      /* RC<0:6> como salidas */
  66. #define Mascara                         0b00001111      /* Parte baja del Byte  */
  67.  
  68.  
  69. /* Prototipos de funciones */
  70. void Inicializa_LCD(void);              /* Inicializa LCD */
  71. void Comando_LCD(char);                 /* Indica al LCD un comando */
  72. void Dato_LCD(char);                    /* Indica al LCD un caracter */
  73. void Datos_LCD(const rom char *buffer); /* escribe una cadena desde la memoria de programa al LCD */
  74. void Dato_String_LCD(char *buffer);             /* escribe una cadena desde la memoria de datos al LCD */
  75.  
  76. //**********************************************************
  77. /* Inicializacion del LCD segun fabricante */
  78. //**********************************************************
  79. void Inicializa_LCD(void)
  80. {
  81.         int i;
  82.         Delay10TCYx(110);                       /* Retardo mayor a 100 useg. */
  83. //      LATD = NIBLE;                           /* Interface de 4 bits RC<0:3> */
  84.         LATD = ( (LATD & 0XF0) | NIBLE );
  85.         PIN_RS = 0;
  86.         PIN_RW = 0;
  87.         PIN_E = 1;
  88.  
  89.         Delay1KTCYx(5);                         /* Retardo de 5 mseg. */       
  90.         PIN_E = 0;
  91.         Delay1KTCYx(15);                        /* Retardo de 15 mseg. */
  92.  
  93.         /* Funcion set,  DL = 0, N = 1, F = 0 */
  94.         /* Dos lineas, caracter de 5X7 e interface a 4 bits */ 
  95.         Comando_LCD(LINES_5X7 & FOUR_BIT);
  96.  
  97.         /* Display ON, D = 1, C = 1, B = 1 */
  98.         /* Display encendido, cursor encendido con parpadeo */
  99.         Comando_LCD(DON & CURSOR_ON & BLINK_ON);
  100.  
  101.         /* limpia el display */
  102.         Comando_LCD(CLEAR);
  103.  
  104.         /* Entry Mode Set */
  105.         /* Incremento del cursor */
  106.         Comando_LCD(INCREMENT);
  107. }
  108.  
  109. //**********************************************************
  110. /* Indica al LCD comandos */
  111. //**********************************************************
  112. void Comando_LCD(char dato)
  113. {
  114.         char temp;                                              /* variable auxiliar */
  115.  
  116.         Delay1KTCYx(10);                                /* Retardo de 10 mseg. */
  117.         temp = dato;                                    /* Respaldo del dato original */
  118. //      dato = dato >> 4;                               /* Corrimiento del nible alto */
  119. //      LATD = dato;
  120.         LATD = ( (LATD & 0X0F) | (dato & 0xf0) );//se envia el nible alto
  121.  
  122.         PIN_RS = 0;
  123.         PIN_RW = 0;
  124.         PIN_E = 1;
  125.         Delay1KTCYx(5);                                 /* Retardo de 5 mseg. */       
  126.         PIN_E = 0;
  127. //      LATD = temp;
  128.         temp = temp << 4;
  129.         LATD = ( (LATD & 0X0f) | (temp & 0xf0) );//se envia el nible bajo
  130.  
  131.         PIN_RS = 0;
  132.         PIN_RW = 0;
  133.         PIN_E = 1;
  134.         Delay1KTCYx(5);                                 /* Retardo de 5 mseg. */       
  135.         PIN_E = 0;
  136. }
  137.  
  138. //**********************************************************
  139. /* Manda datos al LCD */
  140. //**********************************************************
  141. void Dato_LCD(char dato)
  142. {
  143.         char temp;                                              /* variable auxiliar */
  144.  
  145.         Delay1KTCYx(10);                                /* Retardo de 10 mseg. */
  146.         temp = dato;                                    /* Respaldo del dato original */
  147. //      dato = dato >> 4;                               /* Corrimiento del nible alto */
  148. //      LATD = dato;
  149.         LATD = ( (LATD & 0X0f) | (dato & 0xf0) );//se envia el nible alto
  150.         PIN_RS = 1;
  151.         PIN_RW = 0;
  152.         PIN_E = 1;
  153.         Delay1KTCYx(5);                                 /* Retardo de 5 mseg. */       
  154.         PIN_E = 0;
  155. //      LATD = temp;
  156.  
  157.         temp = temp << 4;
  158.         LATD = ( (LATD & 0X0F) | (temp & 0xf0) );//se envia el nible bajo
  159.         PIN_RS = 1;
  160.         PIN_RW = 0;
  161.         PIN_E = 1;
  162.         Delay1KTCYx(5);                                 /* Retardo de 5 mseg. */       
  163.         PIN_E = 0;
  164. }
  165. //**********************************************************
  166. //      Escribe una cadena desde memoria de programa al LCD
  167. //**********************************************************
  168. void Datos_LCD(const rom char *buffer)
  169. {
  170.         while(*buffer)                  // Write data to LCD up to null
  171.     {
  172.                 Delay1KTCYx(5);                                 /* Retardo de 5 mseg. */       
  173.         Dato_LCD(*buffer); // Write character to LCD
  174.         buffer++;               // Increment buffer
  175.         }
  176.     return;
  177. }
  178. //**********************************************************
  179. //      Escribe una cadena desde memoria de datos al LCD
  180. //**********************************************************
  181. void Dato_String_LCD(char *buffer)
  182. {
  183.         while(*buffer)                  // Write data to LCD up to null
  184.     {
  185.                 Delay1KTCYx(5);                                 /* Retardo de 5 mseg. */       
  186.         Dato_LCD(*buffer); // Write character to LCD
  187.         buffer++;               // Increment buffer
  188.         }
  189.     return;
  190. }

a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com