Problema LCD y PIC16F877

Buenas. Estoy realizando un proyecto en el que necesito utilizar un LCD con el PIC16F877. De momento me está siendo imposible mostrar nada por pantalla. He probado con varios programas (algunos propios, y otros de internet) y de nada de nada...
El lenguaje que utilizo es ensamblador.

El último programa probado e el siguiente:
Código:
         LIST    P=16F877    ;TIPUS DE PIC
STATUS     EQU    0x03        ;ALIES REGISTRE STATUS
PORTA      EQU    0x05            
TRISA     EQU    0x05                    
PORTB     EQU    0x06            
TRISB     EQU    0x06            
PORTC     EQU    0x07            
TRISC     EQU    0x07            
PORTD     EQU    0x08            
TRISD     EQU    0x08

LCD_E      EQU     5             ;Bit del puerto A para control de E.
LCD_RW      EQU     6             ;Bit del puerto A para control de R/W.
LCD_RS      EQU     7             ;Bit del puerto A para control de RS.    

RETARDO1 EQU     0X0D         ;Constante del temporizador 1
RETARDO2 EQU     0X00         ;Constante del temporizador 2    

CONT1      EQU     0x20             ;Reserva un Byte para la Variable CONT1
CONT2      EQU     0x21            ;Reserva un Byte para la Variable CONT2    
            
                                    ;Definim Alies
         ORG    00                    ;Comença a 00

            ;Configuración entrada y salidas

        BSF            STATUS,5
        BCF            STATUS,6        ;Anem al banc 1

        MOVLW        0x00                ;W=0000 0000
        MOVWF        TRISC            ;TRISD=0000 0000
        MOVWF        TRISD            ;TRISD=0000 0000

        BCF            STATUS,5        
        BCF         STATUS,6        ;Tornem al banc 0

            ;Configuramos LCD

        CALL         TEMPO2            ;15ms
         MOVLW     b'00110000'        ;bus de datos de 8 Bits
        CALL         LCDI            ;Colocar el dato en el modulo
        MOVLW     b'00111000'        ;Activación de dos líneas
        CALL         LCDI            ;Colocar el dato en el modulo
        MOVLW     b'00001110'        ;trabajar con encendido de la pantalla y el cursor
        CALL         LCDI            ;Colocar el dato en el modulo
        MOVLW     b'00000110'        ;Desplazamiento del cursor a la derecha
        CALL         LCDI            ;Colocar el dato en el modulo

        ;IRLANDES

        MOVLW "I"                      ;Coloca el carácter ASCII en W
        CALL         LCDC             ;Rutina para escribir un carácter en el LCD.
        MOVLW "R"                      ;Coloca el carácter ASCII en W
        CALL       LCDC             ;Rutina para escribir un carácter en el LCD.
        MOVLW "L"                     ;Coloca el carácter ASCII en W
        CALL         LCDC             ;Rutina para escribir un carácter en el LCD.
        MOVLW "A"                     ;Coloca el carácter ASCII en W
        CALL         LCDC             ;Rutina para escribir un carácter en el LCD.
        MOVLW "N"                     ;Coloca el carácter ASCII en W
        CALL         LCDC             ;Rutina para escribir un carácter en el LCD.
        MOVLW "D"                     ;Coloca el carácter ASCII en W
        CALL         LCDC             ;Rutina para escribir un carácter en el LCD.
        MOVLW "E"                     ;Coloca el carácter ASCII en W
        CALL         LCDC             ;Rutina para escribir un carácter en el LCD.
        MOVLW "S"                     ;Coloca el carácter ASCII en W
CICLO     GOTO     CICLO



LCDI             BCF         PORTD,LCD_RW    ;Coloca "0" en el Pin RW.
        BCF         PORTD,LCD_RS     ;Coloca "0" en el Pin RS.
        BSF         PORTD,LCD_E     ;Coloca "1" en el Pin E
        MOVWF     PORTC             ;Coloca el contenido de "W" en el bus de datos del modulo LCD.
        BCF         PORTD,LCD_E     ;Coloca "0" en el Pin E
        CALL         TEMPO1             ;Llamada de una subrutina de tiempo de 40 micro segundos.
        RETURN                         ;Finaliza la Rutina de tiempo.



LCDC             MOVWF     PORTC             ;Coloca el contenido de "W" en el bus de datos del modulo LCD.
        BSF         PORTD,LCD_RS     ;Coloca "1" en el Pin RS.
        BCF         PORTD,LCD_RW    ;Coloca "0" en el Pin RW.
        BCF         PORTD,LCD_E     ;Coloca "0" en el Pin E
        NOP
        BSF         PORTD,LCD_E     ;Coloca "1" en el Pin E
        CALL         TEMPO1             ;Llamada de una subrutina de tiempo de 40 micro segundos.
        RETURN                         ;Finaliza la Rutina de tiempo.

TEMPO1     MOVLW         RETARDO1
        MOVWF         CONT1
CICLOT1 NOP
        DECFSZ         CONT1,1
        GOTO         CICLOT1
        RETURN                        ;58us

TEMPO2     MOVLW         RETARDO2
        MOVWF         CONT2
CICLOT2     CALL                 TEMPO1
        DECFSZ         CONT2,1
        GOTO         CICLOT2
        RETURN                        ;15.37ms

        END
Adjunto el archivo asm.
Haber si alguien lo puede mirar el y decirme que está mal. El programa solo debería mostrar un mensaje. Una vez mostrado uno, mostrar lo que quisieras debería ser fácil.
También agradecería que gente que haya utilizado algún LCD con este PIC o alguno similar me pudiera pasar algún programa que sepa 100% seguro que funciona.
Gracias de antemano.
 

Adjuntos

  • ASM.rar
    1,014 bytes · Visitas: 6
Última edición por un moderador:
Buenas. Estoy realizando un proyecto en el que necesito utilizar un LCD con el PIC16F877. De momento me está siendo imposible mostrar nada por pantalla. He probado con varios programas (algunos propios, y otros de internet) y de nada de nada...
El lenguaje que utilizo es ensamblador.

Adjunto el archivo asm.
Haber si alguien lo puede mirar el y decirme que está mal. El programa solo debería mostrar un mensaje. Una vez mostrado uno, mostrar lo que quisieras debería ser fácil.
También agradecería que gente que haya utilizado algún LCD con este PIC o alguno similar me pudiera pasar algún programa que sepa 100% seguro que funciona.
Gracias de antemano.
Saludos armajaleo.
Realice algunos cambios al programa que dejaste.
Lo probe con un 16F873A y funciono muy bien.
No pude hacerlo funcionar para 2 líneas y el programa es para usar los 8 Bits del LCD.
Te adjunto el programa con los cambios que le hice y su diagrama de nueva conexión.

Suerte.
 

Adjuntos

  • ASM(2).rar
    56.4 KB · Visitas: 9
Saludos armajaleo.
Realice algunos cambios al programa que dejaste.
Lo probe con un 16F873A y funciono muy bien.
No pude hacerlo funcionar para 2 líneas y el programa es para usar los 8 Bits del LCD.
Te adjunto el programa con los cambios que le hice y su diagrama de nueva conexión.

Suerte.

Muchas gracias por contestar !!!
Una pregunta, ¿lo has probado grabándolo en un PIC físicamente o simplemente ha sido simulado con algún programa?
Te lo pregunto porque en Proteus si que hemos conseguido simularlo, pero en el diseño de placa no hemos podido.

Otra pregunta, ¿porqué la inicialización se ha quedado en 3 lineas? En concreto estas 3:

CALL TEMPO2
MOVLW b'00001110'
CALL LCDI

Gracias de nuevo. Hasta el viernes no podré probarlo en placa.
 
Muchas gracias por contestar !!!
Una pregunta, ¿lo has probado grabándolo en un PIC físicamente o simplemente ha sido simulado con algún programa?
Te lo pregunto porque en Proteus si que hemos conseguido simularlo, pero en el diseño de placa no hemos podido.

Otra pregunta, ¿porqué la inicialización se ha quedado en 3 lineas? En concreto estas 3:

CALL TEMPO2
MOVLW b'00001110'
CALL LCDI

Gracias de nuevo. Hasta el viernes no podré probarlo en placa.
OK. Saludos nuevamente.
Para hacer las primeras pruebas, primero lo estuve simulando para ver reacciones.
Cuando conseguí algo funcional en la simulación fue cuando lo monte en protoboard,
pero con un PIC16F873A (Cambiando las condiciones del programa para este PIC).
El porque fue que deje solo esas líneas se debe a que removiendo las otras fue como funciono.
Si las dejaba, el LCD no mostraba nada en la pantalla. (Si en la simulación)
Ya no las probé independientemente en otra parte del programa.

Un comentario: El espacio en blanco al iniciar el mensaje IRLANDES
lo puse porque físicamente no se mostraba la I en el LCD y al agregarlo si.
Pero queda un espacio en blanco al principio.
Esto puede ser debido a los tiempos de retardo que usa el programa, y ya no lo seguí corrigiendo.

Adjunto el programa con el cual hice las pruebas de hardware. Ahh! Y una foto de como se ve.
6103119.jpg
Suerte.
 

Adjuntos

  • 16F873A LCD16X2.rar
    36 KB · Visitas: 16
Última edición:
OK. Saludos nuevamente.
Para hacer las primeras pruebas, primero lo estuve simulando para ver reacciones.
Cuando conseguí algo funcional en la simulación fue cuando lo monte en protoboard,
pero con un PIC16F873A (Cambiando las condiciones del programa para este PIC).
El porque fue que deje solo esas líneas se debe a que removiendo las otras fue como funciono.
Si las dejaba, el LCD no mostraba nada en la pantalla. (Si en la simulación)
Ya no las probé independientemente en otra parte del programa.

Un comentario: El espacio en blanco al iniciar el mensaje IRLANDES
lo puse porque físicamente no se mostraba la I en el LCD y al agregarlo si.
Pero queda un espacio en blanco al principio.
Esto puede ser debido a los tiempos de retardo que usa el programa, y ya no lo seguí corrigiendo.

Adjunto el programa con el cual hice las pruebas de hardware.
Ahh! Y una foto de como se ve.
Ver el archivo adjunto 73951
Suerte.

Muchas gracias por responder. El viernes lo pasaré al PIC haber si funciona. Llevo días probándolo y no hay forma de mostrar nada.
 
Bueno el fallo era que...
No nos habiamos dado cuenta que en el Datasheet del LCD el orden de Pins no esta como nos lo habiamos pensado..:
Creiamos que estaban asi..

1-2-3-4-5-6-7-8-9-10-11--12-13-14-15-16

Pero no estan de una forma mas rara...

14-13-12-11-10-9-8-7-6-5-4-3-2-1-16-15

Que listos los de Hitachi... ya podrian poner en grande ese maldito hecho !!

pero bueno ya funciona bien nuestro programa... 1 mes y medio casi rayandonos con el software cuando era el Hardware... en fin... Gracias por todo de todas formas ^^ !!
 
Atrás
Arriba