Autor Tema: novato pic LCD  (Leído 1887 veces)

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

Desconectado antraxa

  • PIC10
  • *
  • Mensajes: 2
novato pic LCD
« en: 04 de Marzo de 2005, 22:55:00 »
eh manejado antes la lcd con el 80c31, y apenas inicio con el pic16f877 y lo primero que deseo hacer es mostrar un simple mensaje en la lcd, pero eh revisado de arriba a abajo mi codigo y todo parece estar correcto..alguien me puede decir que esta mal en mi programa, les dejo aqui el programa totalmente comentado, diciendo lo que pretento hacer con cada linea.


list P=16f877    ;tipo de procesador
radix hex        ;numerolugia basica para programar
#include "p16f877.inc"  ;libreria de registros especificos del procesador
; __CONFIG _LVP_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC   ; Palabra de configuracion= 0x11, o
;ERRORLEVEL   -302        
__config 0x3d39    ; me dicen que esta linea sirve mejor en lugar que todas las anteriores por eso las comente, pero ya eh probado con ellas y sin ellas.
;__CONFIG _XT_OSC

 EST equ 0x03 ;Registro de estado
 ;PA equ 0x05 ;Puerto A
 PB equ 0x06 ;Puerto B
 PD equ 0x08 ;puerto D
 
 ORG 0 ;Vector de reset
 goto INICIO
 ORG 4

 INICIO

;configuramos puertos
BCF EST,RP0
BCF EST,RP1
CLRF PB
CLRF PD

BSF EST,RP0
MOVLW 0X00
MOVWF TRISB    ;CONFIGURAMOS PURTO B COMO SALIDA
MOVWF TRISD    ;CONFIGURAMOS PURTO D COMO SALIDA

BCF EST,RP0
BCF EST,RP1

;iniciamos rutinas de la lcd
        CALL INIT_LCD
        CALL CLEAR_LCD
   

 ;POSICIONA EN 00H


        BSF PD,7     ;EN
        BCF PD,5     ;RS
        MOVLW 0X80
        MOVWF PB
        BCF PD,7
        CALL WAIT_LCD

       
        BSF PD,7 ;EN
        BCF PD,5 ;RS
        MOVLW 0X64   ;CURSOR PARPADEANTE
        MOVWF PB
        BCF PD,7
        CALL WAIT_LCD
         

;mandamos mensaje/////////////////////////////////////////////////////

        MOVLW "h"
        CALL WRITE_TEXT
        MOVLW "o"
        CALL WRITE_TEXT
        MOVLW "l"
        CALL WRITE_TEXT
        MOVLW "a"
        CALL WRITE_TEXT

        CALL WAIT_LCD
       
   
goto fine



; DECLARACION DE FUNCIONES//////////////////////////////////////////////////////////////////////

INIT_LCD

        BSF PD,7       ;EN
        BCF PD,5       ;RS        
        MOVLW  0x38    ;INSTRUCCION DE INICIALIZACION DE LCD
        MOVWF PB       ;DATA        
        BCF PD,7       ;EN
        CALL WAIT_LCD
       

        BSF PD,7      ;EN
        BCF PD,5      ;RS
        MOVLW 0X0E
        MOVWF PB     ;DATA
        BCF PD,7      ;EN
        CALL WAIT_LCD

        BSF PD,7      ;EN
        BCF PD,5      ;RS
        MOVLW 0X06    
        MOVWF PB      ;DATA
        BCF PD,7     ;EN
        CALL WAIT_LCD

      RETURN


WAIT_LCD
       
        BSF PD,7    ;EN
        BCF PD,5    ;RS
        BSF PD,6    ;RW=1 EL PROGR LEE EL LCD
        MOVLW 0XFF
        MOVWF PB        

        BSF EST,RP0
        BCF EST,RP1
       
        MOVLW 0XFF
        MOVWF TRISB    ;CONFIGURAMOS PURTO B COMO ENTRADA
        BCF EST,RP0
        BCF EST,RP1        
        CICLO
        MOVFW PB
        BTFSS W,7
        GOTO CICLO
       
        BSF EST,RP0
        BCF EST,RP1
        MOVLW 0X00
        MOVWF TRISB  ;DEJAMOS PUERTO B DE SALIDA

        BCF EST,RP0
        BCF EST,RP1   ;regresamos al banco 1
       
        BCF PD,7    ;EN
        BCF PD,6    ;RW
     RETURN


CLEAR_LCD

        BSF PD,7     ;EN
        BCF PD,5     ;RS
        MOVLW 0X01
        MOVWF PB     ;DATA
        BCF PD,7    ;EN
        CALL WAIT_LCD
     RETURN


WRITE_TEXT
          ;EN W VIENE EL CARACTER A ESCRIBIR

        BSF PD,7       ;EN
        BSF PD,7        ;RS
        MOVWF PB        ;DATA
        BCF PD,7        ;EN
        CALL WAIT_LCD    
     
RETURN


fine
end



quise anexar el diagrama pero no supe como asi que si alguien me puede decir como subir la imagen de mi diagrama para que lo vean?

si no pues es muy sencillo los pines estan asi:

PIC                   LCD  

RB0                   DB0
RB1                   DB1
RB2                   DB2
RB3                   DB3
RB4                   DB4
RB5                   DB5
RB6                   DB6
RB7                   DB7

RD5                   RS
RD6                   RW
RD7                   EN

y por supuesto el pic alimentado con 5v en la pata 11, y a tierra en la pata 12.
su cuarzo(4MHZ) en las patas 13 y 14, con sus respectivos capacitores de 33pf  
y su resistencia pull-down en el reset.



AGRACECERE MUCHO SU AYUDA pues ya no se que es lo que este mal

Desconectado IngLAOFX

  • PIC10
  • *
  • Mensajes: 43
RE: novato pic LCD
« Respuesta #1 en: 04 de Mayo de 2005, 03:45:00 »
Hola, pues es algo muy basico lo que te puedo postear, ademas como desafortunadamente es tedioso analizar codigo en ensamblador, te mando esto que a mi, segun recuerdo me fuinciono bien...Muchas risas pronto volvere a utilizar el modulo LCD, asi que, literalmente volvere a reutilizar estas rutinas y a depurarlas, ya que creo que aun se pueden mejorar e incluso añadir mas.. espero te sirva de algo..Muchas risas

nota: Utilizo el PortB completo (8bits) como bus de datos y los pines de control del lcd son del portc, mas abajo en el codigo biene explicado eso, utilizo tambien el cristal de 4MHz.

; Febrero 6, 4:42 pm
   list   P=16F870
   #include <P16F870.inc>      ; Registros del PIC16F876A
;/////////////////////////////////////////////////////////////////////////////
   __CONFIG    _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON & _LVP_OFF & _BODEN_OFF
;/////////////////////////////////////////////////////////////////////////////
; Constantes
;Bancos de memoria RAM (para utilizar banksel)
Banco0   equ   0x20
Banco1   equ   0xA0
Banco2   equ   0x120
Banco3   equ   0x1A0
E_LCD      equ   7   ;Bit del puerto C para control de E.
RW_LCD       equ   6    ;Bit del puerto C para control de R/W.
RS_LCD      equ   5   ;Bit del puerto C para control de RS.
LCD_Dat      equ   0x06   ;Bus de datos del LCD = PORTB
LCD_Ins      equ   0x07   ;Bus de Control del LCD = PORTC
;/////////////////////////////////////////////////////////////////////////////
TEMPB3      equ   0x21
TEMPB2      equ   0x22
TEMPB1      equ   0x23
;/////////////////////////////////////////////////////////////////////////////

   Org   0x00
   goto   main
main   
   clrf   INTCON
   BANKSEL   Banco1      ; Bank1 seleccionado
   clrf   TRISC      
   clrf   TRISB      ; PORTB = Salidas
   BANKSEL   Banco0      ; Bank0 seleccionado
   clrf   PORTC
   clrf   PORTB

inicio
   call   Configurar_LCD
   call   BorrarDisplay_LCD
   call   CursorOn_LCD
   call   InicioL1_LCD
   movlw   .2
   call   DelayS

   movlw   "P"
   call   LCD_printchar
   movlw   "r"
   call   LCD_printchar
   movlw   "u"
   call   LCD_printchar
   movlw   "e"
   call   LCD_printchar
   movlw   "b"
   call   LCD_printchar
   movlw   "a"
   call   LCD_printchar

fin
   nop
   goto   fin


;/////////////////// Subrutinas ///////////////////

Configurar_LCD
   movlw   .10
   call   DelaymS
   movlw   0x38
   call   LCD_Instruccion
   movlw   .1
   call   DelaymS
   return  

CursorOn_LCD
   movlw   0x0F
   call   LCD_Instruccion
   movlw   .1
   call   DelaymS
   return

CursorOff_LCD
   movlw   0x0C
   call   LCD_Instruccion
   movlw   .1
   call   DelaymS
   return

BorrarDisplay_LCD
   movlw   0x01
   call   LCD_Instruccion
   movlw   .3
   call   DelaymS
   return

InicioL1_LCD
   movlw   .128
   bcf      LCD_Ins,RW_LCD   
    bcf      LCD_Ins,RS_LCD    
    bsf    LCD_Ins,E_LCD    
   movwf   LCD_Dat
   bcf      LCD_Ins,E_LCD
   movlw   .1
   call   DelaymS
   return

InicioL2_LCD
   movlw   .168
   bcf      LCD_Ins,RW_LCD   
    bcf      LCD_Ins,RS_LCD    
    bsf    LCD_Ins,E_LCD    
   movwf   LCD_Dat
   bcf      LCD_Ins,E_LCD
   movlw   .1
   call   DelaymS
   return

LCD_printchar
   bcf      LCD_Ins,RW_LCD  
    bsf    LCD_Ins,RS_LCD  
    bsf    LCD_Ins,E_LCD    
    movwf    LCD_Dat      
   bcf    LCD_Ins,E_LCD    
    movlw   0x01
   call   DelaymS      
   return       

LCD_Instruccion
   bcf      LCD_Ins,RW_LCD   
    bcf      LCD_Ins,RS_LCD    
    bsf    LCD_Ins,E_LCD    
    movwf    LCD_Dat      
    bcf    LCD_Ins,E_LCD    
    return       

DelayS
   movwf   TEMPB3
   movlw   .250
   call   DelaymS
   movlw   .250
   call   DelaymS
   movlw   .250
   call   DelaymS
   movlw   .250
   call   DelaymS
   decfsz   TEMPB3,F
   goto   $-9
   return

DelaymS   
   movwf   TEMPB1
   movlw   .249
   movwf   TEMPB2
   nop
   decfsz   TEMPB2,F
   goto   $-2
   decfsz   TEMPB1,F
   goto   $-6
   retlw   .0



   end
Gana Mas Una Bruja Rentando Su Palo De Escoba A 10Euros por Vuelta Que Uno Prediciendole Un Esplendoroso Futuro A La Clase Obrera En Una Semana

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: novato pic LCD
« Respuesta #2 en: 04 de Mayo de 2005, 07:17:00 »
Buenas.

Codigo:
y por supuesto el pic alimentado con 5v en la pata 11, y a tierra en la pata 12.
su cuarzo(4MHZ) en las patas 13 y 14, con sus respectivos capacitores de 33pf
y su resistencia pull-down en el reset.


No se si eso del pull-down es un error a la hora de escribir este mensaje o es que pones la patilla de reset a cero. En el segundo caso, el PIC necesita a uno la patilla de reset para funcionar, puesto que si la lelvas a cero está reseteado.

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: novato pic LCD
« Respuesta #3 en: 04 de Mayo de 2005, 07:48:00 »
En cuanto al programa, te falta una instrucción en la etiqueta "fine" que haga "goto fine", por que cuando saltas a este etiqueta, el procesador sigue ejecutando instruccciones, pese a tener un "end" en el programa. Las instrucciones se ejecutarán, hasta que el contador de programa llege al final de la memoria y entonces el micro se resetea y comienza el programa de nuevo desde la direccion 0x00.

Por lo tanto:

fine goto fine

siempre al final de los programas para que el micro entre en ese bucle infinito.