Autor Tema: PROBLEMA CON LCD CCS !!  (Leído 1522 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dariocav87

  • PIC10
  • *
  • Mensajes: 15
PROBLEMA CON LCD CCS !!
« en: 13 de Mayo de 2015, 23:48:22 »
Buenas, tengo un problema con el lcd. Estoy intentando de practicar un poco con la programacion en c y el lcd, ya que soy nuevo en el tema. En la parte void main (), puse los comandos para iniciar el lcd e imprimir una palabra.
El tema es que cuando lo simulo en el proteus me aparecen unos caracteres raros, intente de varias formas para que me salga lo que quiero y no puedo.
Use  el picwizard para usar la libreria de lcd con el puerto c, ya que estoy usando un pic16f886 y quiero aprovechar las interrupciones por el puerto b.
Adjunto archivos y bueno.. espero que me puedan dar una mano, jeje.
Muchas gracias saludos.  :)

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: PROBLEMA CON LCD CCS !!
« Respuesta #1 en: 14 de Mayo de 2015, 00:43:12 »
Hola como estás Dario.

Mirá, yo uso una librería que hice en base a otras que encontré en foros y similares. La misma utiliza un registro de desplazamiento y utiliza solo 3 pines del microcontrolador.



El código de la librería es el siguiente:

Código: C
  1. // Librería para LCD SERIAL 2x16.
  2. // Programador: Moyano Jonathan.
  3. // Fecha: Junio de 2013.
  4. // Versión: v1.1
  5. // Revisión: r0.5
  6.  
  7. // Definir pines antes de ejecutar las funciones del LCD.
  8.  
  9. #define LCD_E       PIN_A5
  10. #define LCD_CK     PIN_A4  
  11. #define LCD_DAT   PIN_A3
  12. #define LIGHT       PIN_A2
  13.  
  14. // Definición de funciones:
  15. void lcd_send_nibble(int8 nibble, int rs_bit); // Envía medio nibble de datos al display.
  16. void lcd_send_byte(int8 address, int8 n);      // Envía un dato de 8 bits al display.
  17. void lcd_init(void);                           // Inicializa el LCD.
  18. void lcd_gotoxy(int8 x, int8 y);               // Posiciona el cursor.
  19. void lcd_putc(char c);                         // Envía un caracter al LCD.
  20. void lcd_cursor_shift_right(void);             // Desplaza el cursor a la derecha.
  21. void lcd_cursor_shift_left(void);              // Desplaza el cursor a la izquierda.
  22. void lcd_clear(void);                          // Borramos la pantalla del LCD.
  23.  
  24. // Definiciones y declaración de variables.
  25. int8 RS_bit;
  26. int8 lcd_line=0x00;
  27. #define lcd_tipo 2   // 0=5x7, 1=5x10, 2=2 Líneas o más de caracteres.
  28. #define LCD_LINE_1_ADDRESS 0x00
  29. #define LCD_LINE_2_ADDRESS 0x40
  30.  
  31. // Macros.
  32. #define LIGHT_ON  output_high(LIGHT); // Enciende backlight.
  33. #define LIGHT_OFF output_low(LIGHT);  // Apaga Backligth.
  34.  
  35.  
  36. int8 const LCD_INIT_STRING[4] =
  37. {
  38.  0x20 | (lcd_tipo << 2),  // Modo: 4-bits, 2+ líneas, 5x8 puntos.
  39.  0xC,                     // Encendido del display.
  40.  1,                       // Limpia display.
  41.  6                        // Incrementa cursor.
  42.  };
  43.  
  44. // Funciones internas.
  45.  
  46. void lcd_send_nibble(int8 nibble, int rs_bit)
  47. {
  48. int x;
  49. if(RS_bit==1){nibble=nibble|0x10;}
  50.  
  51. for(x=0;x<5;x++){
  52.          output_bit(LCD_DAT,shift_right(&nibble,1,0));
  53.          delay_cycles(1);
  54.          output_low(LCD_CK);
  55.          delay_us(1);
  56.          output_high(LCD_CK);}
  57.          
  58.  output_high(LCD_E);
  59.  delay_us(2);
  60.  output_low(LCD_E);
  61.  
  62. }
  63.  
  64. void lcd_send_byte(int8 address, int8 n)
  65. {
  66.  RS_bit=0;
  67.  delay_us(100);
  68.  if(address){RS_bit=1;}else{RS_bit=0;}
  69.  delay_cycles(1);
  70.  output_low(LCD_E);
  71.  lcd_send_nibble(n >> 4,RS_bit);
  72.  lcd_send_nibble(n & 0xF,RS_bit);
  73. }
  74.  
  75. // Funciones de usuario.
  76.  
  77. void lcd_init(void)
  78. {
  79. int8 i;
  80. RS_bit=0;
  81. output_low(LCD_E);
  82. delay_ms(20);
  83.  
  84. // Enciende el backlight.
  85. LIGHT_ON
  86.  
  87. for(i=0 ;i < 3; i++)
  88.    {
  89.     lcd_send_nibble(0x03,RS_bit);
  90.     delay_ms(5);
  91.    }
  92.    
  93. lcd_send_nibble(0x02,RS_bit);
  94.  
  95. for(i=0; i < sizeof(LCD_INIT_STRING); i++){
  96.     lcd_send_byte(0, LCD_INIT_STRING[i]);
  97.     delay_ms(5);}
  98. }
  99.  
  100. void lcd_gotoxy(int8 x, int8 y){
  101.  
  102. int8 address;
  103.  
  104. switch(y)
  105.   {
  106.    case 1:
  107.      address = LCD_LINE_1_ADDRESS;
  108.      break;
  109.    case 2:
  110.      address = LCD_LINE_2_ADDRESS;
  111.      break;
  112.    default:
  113.      address = LCD_LINE_1_ADDRESS;
  114.      break;      
  115.   }
  116.  
  117. address += x-1;
  118. lcd_send_byte(0, 0x80 | address);
  119.  
  120. }
  121.  
  122. void lcd_putc(char c)
  123. {
  124.  switch(c)
  125.    {
  126.     case '\f':
  127.       lcd_send_byte(0,1);
  128.       delay_ms(2);
  129.       break;
  130.     case '\n'   : lcd_gotoxy(1, ++lcd_line);
  131.        break;
  132.     case '\b'   : lcd_send_byte(0,0x10);
  133.        break;
  134.     case '\t'   : lcd_send_byte(0,0x14);
  135.        break;
  136.     case '\r'   : lcd_send_byte(0,0x18);
  137.        break;
  138.     case '\v'   : lcd_send_byte(0,0x1C);
  139.        break;
  140.     default     : lcd_send_byte(1,c);
  141.                    break;
  142.    }
  143. }
  144.  
  145. void lcd_cursor_shift_right(void){
  146. lcd_send_byte(0,0x10|0x08|0x04);
  147. }
  148.  
  149. void lcd_cursor_shift_left(void){
  150. lcd_send_byte(0,0x10|0x08|0x00);
  151. }
  152.  
  153. void lcd_clear(void)
  154. {
  155.    lcd_send_byte(0,0x01);
  156.    delay_ms(250);
  157. }

Espero te sirva, cualquier cosa me consultas.

Saludos !




Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re: PROBLEMA CON LCD CCS !!
« Respuesta #2 en: 14 de Mayo de 2015, 13:58:18 »
Tambien puedes usar la libreria flex_lcd.h que ronda en todo el foro esa funciona muy bien y sin problemas, se puede personalizar sin problemas para los pines que desees, obviamente debes asegurarte que los pines queden solo para el LCD, ya que si poseen una funcion multiplexada podrian darte problemas.

saludos.
Nunca se deja de aprender

Desconectado dariocav87

  • PIC10
  • *
  • Mensajes: 15
Re: PROBLEMA CON LCD CCS !!
« Respuesta #3 en: 14 de Mayo de 2015, 15:44:44 »
Muchas gracias por la informacion, voy a probar esos dos metodos y les comento como me fue.
Muchas gracias de nuevo, saludos.

Desconectado dariocav87

  • PIC10
  • *
  • Mensajes: 15
Re: PROBLEMA CON LCD CCS !!
« Respuesta #4 en: 16 de Mayo de 2015, 13:12:11 »
Hola gente, me anduvo impecable  :-/ . Muchas gracias, saludos!!!.