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:
	
	
	
		
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.
				
			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
        ENDHaber 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
			
				Última edición por un moderador: 
			
		
	
								
								
									
	
								
							
							 
   
				 
						 
 
		
 
 
		 
 
		 
 
		 
 
		