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