TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: asogen en 14 de Septiembre de 2010, 22:09:08

Título: AYUDA CON RUTINA LCD
Publicado por: asogen en 14 de Septiembre de 2010, 22:09:08
HOLA, ME ENCONTRE UNAS MACRO PARA MANDAR DATOS AL LCD SIN NECESIDAD DE TABLAS, EL CASO ES QUE FUNCIONAN BIEN PERO SI YO LE PONGO MAS DE 15 FRASES EL LCD SE VA A LA POSICION 1 PORQUE??? AQUI ESTA EL CODIGO



            LIST  P=16F877A
            INCLUDE P16F877A.INC

            CBLOCK 0X20
VAR1,VAR2,VAR3, PDel0,POINTER,AUX_LCD,AUX_LETRA, PDel1,R5,ASO
PDel2,TEMPSTAT,TEMPW,VAL1,VAR,HEX1,POS,AUX4,MEN
            ENDC

#DEFINE      PORT_LCD   PORTC   ;DEFINE EL PUERTO PARA EL BUS DE DATOS (4 PINES DE MENOR PESO)

LCD_PUTS   MACRO   STRING
         MESSG   "El parametro de 'LCD_PUTS' es el nombre de una TABLA de DATOS"
         LOCAL   LCD_MAS
         BSF   PORTC,4  ;LINEA 'RS' EN ALTO PARA OPCION DE DATO A VISUALIZAR EN LCD
         CLRF   POINTER
LCD_MAS   MOVF   POINTER,W
         CALL   STRING
         MOVWF   AUX_LCD
         MOVF   AUX_LCD,F
         BTFSC   STATUS,Z
         GOTO   $+4
         CALL   LCD_WRITE
         INCF   POINTER,F
         GOTO   LCD_MAS
         ENDM

LCD_GOTO   MACRO   line,position
         if   line>2
            error   "Linea LCD 1 ó 2!... Corregir parametro en llamado a macro LCD_GOTO"
         endif
         MOVLW   position
         if   line==1
            ADDLW   0X7F
         else
            ADDLW   0XBF
         endif
         BCF   PORTC,4   ; LINEA 'RS' EN BAJO PARA OPCION DE COMANDO O INSTRUCCION
         CALL   LCD_WRITE
         ENDM


#DEFINE  PLAY TRISB,0;
#DEFINE MAS TRISD,5  ;
#DEFINE ENTER TRISC,6 
#DEFINE MENOS TRISD,6 ;
#DEFINE ESC TRISC,7

;*********************************************************
            ORG  00
            GOTO INICIO
            ORG  05






;------------------------------------------------------------

FRA

FRA1         ADDWF   PCL,F
         DT      "HOLA            ",0X0
FRA2      ADDWF   PCL,F
         DT      "SOY UN    .       ",0X0
FRA3      ADDWF   PCL,F
         DT      "ESTUDIANTE      ",0X0
FRA4      ADDWF   PCL,F
         DT      "DE TECNOLOGIA   ",0X0
FRA5      ADDWF   PCL,F
         DT      "  ELECTRONICA ",0X0
FRA6      ADDWF   PCL,F
         DT      " DEL",0X0
FRA7   ADDWF   PCL,F
         DT      "PASCUAL BRAVO   ",0X0
FRA8   ADDWF   PCL,F
         DT      "   EN EL        ",0X0
FRA9      ADDWF   PCL,F
         DT      "     SEMESTRE   ",0X0
FRA10      ADDWF   PCL,F
         DT       "    NUMERO      ",0X0
FRA11      ADDWF   PCL,F
         DT       "   CINCO        ",0X0      
FRA12      ADDWF   PCL,F
         DT       "       DE LA    ",0X0   
FRA13      ADDWF   PCL,F
         DT       "     CIUDAD     ",0X0      
FRA14      ADDWF   PCL,F
         DT       "   DE MEDELLIN  ",0X0   

FRA15      ADDWF   PCL,F
         DT       "ANTIOQUIA       ",0X0   

FRA16      ADDWF   PCL,F
         DT       "   COLOMBIA     ",0X0   

FRA17      ADDWF   PCL,F
         DT       "  uno           ",0X0   

FRA18      ADDWF   PCL,F
         DT       "   dos          ",0X0   





INICIO         CLRF   PORT_LCD
            BSF     STATUS,RP0  ; CAMBIO A BANCO 1
            MOVLW    07
                MOVWF    OPTION_REG; habilito las res. De pull-up en el port B y la máxima Pres
              MOVLW    0XF0
                MOVWF    PORTB; habilita la part alta de portB como entrada
            MOVLW   B'11000000'
            MOVWF   PORT_LCD   ;Configura lineas como salidas en el puerto seleccionado
            CLRF   PORTC
            BSF   TRISC,6
            BSF   TRISC,7
            MOVLW   0XFF
            MOVWF   TRISA
            BANKSEL   ADCON1
            CLRF      TRISB
            BSF   TRISB,0
            BSF   TRISB,1
            MOVLW   .255
            BSF      TRISE,0
            BSF      TRISE,1
            BCF      TRISE,2
            BCF      TRISE,PSPMODE  ; HABILITACION PARA PUERTO D
            MOVLW   .255
            MOVWF      TRISD
            MOVLW   B'10000101'           ;B'10000101'      ;
            MOVWF   ADCON1
            BANKSEL ADCON0   
            MOVLW   B'01000001'      ;ENIENDE CONVERSION, RA0 CANAL ENTRADA
            MOVWF   ADCON0
            CALL   DELAY
            MOVLW B'01001000'
             MOVWF OPTION_REG
            BCF  STATUS,RP0        ; CAMBIO A BANCO 0
            MOVLW      .2
            MOVWF      ASO      
            CLRF   PORTD
            CLRF  PORTA
            CLRF   PORTE
            CLRF   PORTB
            GOTO   PROGRAMA


;++++++++++++++++++++++++

PROGRAMA

CALL      LCD_INIT         
CALL   BORDISP
         CALL   BORDISP
         LCD_GOTO  1,1
         LCD_PUTS  FRA1
         LCD_GOTO  2,1
         LCD_PUTS FRA2
         CALL Delay15Ms
         CALL   DEL1SEG
         CALL   DEL1SEG   


                  CALL   BORDISP
         LCD_GOTO  1,1
         LCD_PUTS  FRA2
         LCD_GOTO  2,1
         LCD_PUTS FRA3
         CALL Delay15Ms
         CALL   DEL1SEG
         CALL   DEL1SEG   

            
         CALL   BORDISP
         LCD_GOTO  1,1
         LCD_PUTS  FRA4
         LCD_GOTO  2,1
         LCD_PUTS FRA5
         CALL Delay15Ms
         CALL   DEL1SEG
         CALL   DEL1SEG



         CALL   BORDISP
         LCD_GOTO  1,1
         LCD_PUTS  FRA6
         LCD_GOTO  2,1
         LCD_PUTS FRA7
         CALL Delay15Ms
         CALL   DEL1SEG
         CALL   DEL1SEG   
   
         CALL   BORDISP
         LCD_GOTO  1,1
         LCD_PUTS  FRA8
         LCD_GOTO  2,1
         LCD_PUTS FRA9
         CALL Delay15Ms
         CALL   DEL1SEG
         CALL   DEL1SEG   



         CALL   BORDISP
         LCD_GOTO  1,1
         LCD_PUTS  FRA9
         LCD_GOTO  2,1
         LCD_PUTS FRA10
         CALL Delay15Ms
         CALL   DEL1SEG
         CALL   DEL1SEG   


         CALL   BORDISP
         LCD_GOTO  1,1
         LCD_PUTS  FRA11
         LCD_GOTO  2,1
         LCD_PUTS FRA12
         CALL Delay15Ms
         CALL   DEL1SEG
         CALL   DEL1SEG   


         CALL   BORDISP
         LCD_GOTO  1,1
         LCD_PUTS  FRA13
         LCD_GOTO  2,1
         LCD_PUTS FRA14
         CALL Delay15Ms
         CALL   DEL1SEG
         CALL   DEL1SEG   


         CALL   BORDISP
         LCD_GOTO  1,1
         LCD_PUTS  FRA15
         LCD_GOTO  1,2
         LCD_PUTS  FRA16
         CALL Delay15Ms
         CALL   DEL1SEG
         CALL   DEL1SEG   


         CALL   BORDISP
         LCD_GOTO  1,1
         LCD_PUTS  FRA17
         LCD_GOTO  1,2
         LCD_PUTS  FRA18
         CALL Delay15Ms
         CALL   DEL1SEG
         CALL   DEL1SEG   







GOTO PROGRAMA




DELAY   MOVLW   .3
      MOVWF   R5
DELAY1   DECFSZ   R5
      GOTO   DELAY1
      RETURN


BORDISP

         BCF         PORTC,4   ; LINEA 'RS' EN BAJO PARA OPCION DE COMANDO O INSTRUCCION
         MOVLW      0X01     ;BORRA CONTENIDO DE AMBAS LINEAS   
         CALL      LCD_WRITE
         CALL      Delay5Ms
RETURN








LCD_INIT   BCF         PORTC,4   ; LINEA 'RS' EN BAJO PARA OPCION DE COMANDO O INSTRUCCION
         CALL       Delay15Ms
      
         
         MOVLW      0XF0
         ANDWF      PORT_LCD,W
         IORLW      0X03
         MOVWF      PORT_LCD
         BSF         PORTC,5  ;PERMITE GENERAR EL PULSO DE VALIDACION SOBRE LA LINEA 'E' DEL LCD
         NOP                ;NECESARIO PARA CRISTALES DE ALTA FRECUENCIA
         BCF         PORTC,5  ; VALIDACION E DEL DISPLAY
         CALL      Delay5Ms
         
         BSF         PORTC,5  ; VALIDACION E DEL DISPLAY  ;PERMITE GENERAR EL PULSO DE VALIDACION SOBRE LA LINEA 'E' DEL LCD
         NOP                ;NECESARIO PARA CRISTALES DE ALTA FRECUENCIA
         BCF         PORTC,5  ; LINEA E DE DISPLAY   
         CALL      Delay100Us
      

         BSF         PORTC,5  ; LINEA E DE DISPLAY  ;PERMITE GENERAR EL PULSO DE VALIDACION SOBRE LA LINEA 'E' DEL LCD
         NOP                ;NECESARIO PARA CRISTALES DE ALTA FRECUENCIA
         BCF         PORTC,5  ; LINEA E DE DISPLAY
         CALL      Delay5Ms
      

         MOVLW      0XF0
         ANDWF      PORT_LCD,W
         IORLW      0X02   ;Modo a 4-Bits
         MOVWF      PORT_LCD
         BSF         PORTC,5 ; VALIDACION E DEL DISPLAY  ;PERMITE GENERAR EL PULSO DE VALIDACION SOBRE LA LINEA 'E' DEL LCD
         NOP               ;NECESARIO PARA CRISTALES DE ALTA FRECUENCIA
         BCF         PORTC,5  ; LINEA E DE DISPLAY
         CALL      Delay40Us
      
         MOVLW      0X28       ;4-Bits, 2-Lineas activas, Tamaño Fuente 5x8
         CALL      LCD_WRITE

         MOVLW      0X08      ;Display Off
         CALL      LCD_WRITE

         MOVLW      0X0F      ;Display On, Display Cursor, Blink Curson ON
         CALL      LCD_WRITE

         MOVLW      0X06      ;Entry Mode
         CALL      LCD_WRITE
         RETURN

;Esta SUBRUTINA permite enviar COMANDO cualquiera a la LCD (INSTRUCCION de CONFIGURACION o CONTROL)
;La Instruccion a enviar necesita ser cargado en 'W' antes de llamar la Subrutina
LCD_INSTRUCCION      BCF   PORTC,4   ; LINEA 'RS' EN BAJO PARA OPCION DE COMANDO O INSTRUCCION
         CALL   LCD_WRITE
         RETURN

;Esta Subrutina es la que se encarga de enviar un BYTE a la LCD (Bits 7:4, luego Bits 3:0)
;No es una subrutina de uso directo de usuario.
LCD_WRITE   MOVWF   AUX_LCD
         MOVLW   0XF0
         ANDWF   PORT_LCD,F
         SWAPF   AUX_LCD,W
         ANDLW   0X0F
         IORWF   PORT_LCD,F
         BSF         PORTC,5  ; LINEA E DE DISPLAY  ;PERMITE GENERAR EL PULSO DE VALIDACION SOBRE LA LINEA 'E' DEL LCD
         NOP               ;NECESARIO PARA CRISTALES DE ALTA FRECUENCIA
         BCF         PORTC,5  ; LINEA E DE DISPLAY
         MOVLW   0XF0
         ANDWF   PORT_LCD,F
         MOVLW   0X0F
         ANDWF   AUX_LCD,W
         IORWF   PORT_LCD,F
         BSF      PORTC,5  ; LINEA E DE DISPLAY  ;PERMITE GENERAR EL PULSO DE VALIDACION SOBRE LA LINEA 'E' DEL LCD
         NOP      ;NECESARIO PARA CRISTALES DE ALTA FRECUENCIA
         BCF      PORTC,5  ; LINEA E DE DISPLAY         
         CALL   Delay40Us

RETURN



;-------------------------------------------------------------
; Code generated by PDEL  ver 1.0  on 10/05/2005 at 22:31:21
; Description: Waits 40 cycles
;-------------------------------------------------------------
Delay40Us     movlw   .8        ; 1 set number of repetitions
             movwf   PDel0     ; 1 |
PLoop01     clrwdt              ; 1 clear watchdog
           decfsz  PDel0, 1  ; 1 + (1) is the time over?
           goto    PLoop01    ; 2 no, loop
PDelL11     goto    PDelL21         ; 2 cycles delay
PDelL21     clrwdt              ; 1 cycle delay
           return              ; 2+2 Done
;-------------------------------------------------------------   
; Code generated by PDEL  ver 1.0  on 11/05/2005 at 16:12:21
; Description: Waits 15000 cycles
;-------------------------------------------------------------
Delay15Ms     movlw     .21       ; 1 set number of repetitions (B)
           movwf     PDel0     ; 1 |
PLoop12    movlw     .142      ; 1 set number of repetitions (A)
           movwf     PDel1     ; 1 |
PLoop22     clrwdt              ; 1 clear watchdog
           clrwdt              ; 1 cycle delay
           decfsz    PDel1, 1  ; 1 + (1) is the time over? (A)
           goto      PLoop22    ; 2 no, loop
           decfsz    PDel0,  1 ; 1 + (1) is the time over? (B)
           goto      PLoop12    ; 2 no, loop
           clrwdt              ; 1 cycle delay
           return              ; 2+2 Done
;-------------------------------------------------------------
;-------------------------------------------------------------
; Code generated by PDEL  ver 1.0  on 11/05/2005 at 16:32:48
; Description: Waits 100 cycles
;-------------------------------------------------------------
Delay100Us  movlw     .23       ; 1 set number of repetitions
           movwf     PDel0     ; 1 |
PLoop03     clrwdt              ; 1 clear watchdog
           decfsz    PDel0, 1  ; 1 + (1) is the time over?
           goto      PLoop03    ; 2 no, loop
PDelL13     goto PDelL23         ; 2 cycles delay
PDelL23     clrwdt              ; 1 cycle delay
           return              ; 2+2 Done
;-------------------------------------------------------------
;-------------------------------------------------------------
; Code generated by PDEL  ver 1.0  on 11/05/2005 at 16:34:11
; Description: Waits 5000 cycles
;-------------------------------------------------------------
Delay5Ms     movlw     .6        ; 1 set number of repetitions (B)
              movwf     PDel0     ; 1 |
PLoop14     movlw     .207      ; 1 set number of repetitions (A)
           movwf     PDel1     ; 1 |
PLoop24     clrwdt              ; 1 clear watchdog
           decfsz    PDel1, 1  ; 1 + (1) is the time over? (A)
           goto      PLoop24    ; 2 no, loop
           decfsz    PDel0,  1 ; 1 + (1) is the time over? (B)
           goto      PLoop14    ; 2 no, loop
PDelL14     goto PDelL24         ; 2 cycles delay
PDelL24     clrwdt              ; 1 cycle delay
           return              ; 2+2 Done

DEL1SEG
  movlw     .14       ; 1 set number of repetitions (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .72       ; 1 set number of repetitions (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .247      ; 1 set number of repetitions (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2, 1  ; 1 + (1) is the time over? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) is the time over? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) is the time over? (C)
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 cycles delay
PDelL2  clrwdt              ; 1 cycle delay
        return   


DEL1MSG 
     movlw     .156     ; 1 set number of repetitions (B)
        movwf     PDel0     ; 1 |
PLoop1A  movlw     .213      ; 1 set number of repetitions (A)
        movwf     PDel1     ; 1 |
PLoop2A  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 cycle delay
        decfsz    PDel1, 1  ; 1 + (1) is the time over? (A)
        goto      PLoop2A    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) is the time over? (B)
        goto      PLoop1A    ; 2 no, loop
PDelL1A  goto PDelL2         ; 2 cycles delay
PDelL2A  goto PDelL3         ; 2 cycles delay
PDelL3  clrwdt              ; 1 cycle delay
        return              ;
;-------------------------------------------------------------
;-------------------------------------------------------------
; Generado con PDEL ver SP  r 1.0  el 26/08/05 Hs 12:13:05
; Descripcion: Delay 5000000 ciclos
;-------------------------------------------------------------


;-------------------------------------------------------------





;-------------------------------------------------------------




;*************
            
            END