Autor Tema: programa LCD  (Leído 1828 veces)

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

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
programa LCD
« en: 14 de Febrero de 2005, 03:32:00 »
Hola amigos, tengo un problemilla con un programa para la config del LCD. el programa es el q os pongo ahi abajo, y mi problema es q mi LCD es para 4 bits (D4-D7) y las otras lineas son: E (A1), RW (A2), RS (A3). Por muchas variaciones que intento hacer en el programa no consigo mandar nada al LCD... Agradecería mucho si alguien me pudiera poner el programa corregido con los cambios q he dicho, o pasarme otro para la configuración q os comento.

Muchas gracias!!

#define ENABLE       bsf PORTA,2        ;Activa señal E
#define DISABLE      bcf PORTA,2        ;Desactiva señal E
#define LEER         bsf PORTA,1        ;Pone LCD en Modo RD
#define ESCRIBIR     bcf PORTA,1        ;Pone LCD en Modo WR
#define OFF_COMANDO  bcf PORTA,0        ;Desactiva RS (modo comando)
#define ON_COMANDO   bsf PORTA,0        ;Activa RS (modo dato

      CBLOCK   Lcd_var      ;Inicio de las variables. Será la primera                  
      Lcd_Temp_1      ;direccón libre disponible
      Lcd_Temp_2
      ENDC                                 

;*************************************************************************
;UP_LCD: Configuración PIC para el LCD.
;
UP_LCD          bsf     STATUS,RP0      ;Banco 1
                clrf    PORTB           ;RB <0-7> salidas digitales
                movlw   b"00011000"
      movwf   PORTA           ;RA0-RA2 salidas, RA3-RA4 entradas
                bcf     STATUS,RP0      ;Banco 0
                OFF_COMANDO             ;RS=0
                DISABLE                 ;E=0
                return
;
;**************************************************************************
;LCD_BUSY: Lectura del Flag Busy y la dirección.
;
LCD_BUSY        LEER                    ;Pone el LCD en Modo RD
                bsf     STATUS,RP0          
                movlw   H"FF"
                movwf   PORTB           ;Puerta B como entrada
                bcf     STATUS,RP0      ;Selecciona el banco 0
                ENABLE                  ;Activa el LCD
                nop
LCD_BUSY_1   btfsc   PORTB,7         ;Chequea bit de Busy
                goto    LCD_BUSY_1      ;
                DISABLE                 ;Desactiva LCD
                bsf     STATUS,RP0                              
                clrf    PORTB           ;Puerta B salida
                bcf     STATUS,RP0                              
                ESCRIBIR                ;Pone LCD en modo WR
                return

;**************************************************************************
;LCD_E: Pulso de Enable. En los nuevos LCD"s esta señal debe estar a "0" unos 40uS antes de
;volver a activarse a "1".
;
LCD_E           ENABLE                  ;Activa E
      nop
                DISABLE                 ;Desactiva E
      movlw   .14
      movwf   Lcd_Temp_1
LCD_E_1      decfsz   Lcd_Temp_1,F   ;Pierde unos 40 uS para la constante de tiempo Tc
      goto   LCD_E_1      ;de los nuevos módulos LCD de winteck
      return
;
;**************************************************************************
;LCD_DATO: Escritura de datos en DDRAM o CGRAM. Envía el dato presente en el W
;
LCD_DATO        OFF_COMANDO             ;Desactiva RS (modo comando)
                movwf   PORTB           ;Valor ASCII a sacar por portb
                call    LCD_BUSY        ;Espera a que se libere el LCD
                ON_COMANDO              ;Activa RS (modo dato).
                goto    LCD_E           ;Genera pulso de E

;**************************************************************************
;LCD_REG: Escritura de comandos en el LCD. Envía el comando presente en el W

LCD_REG         OFF_COMANDO             ;Desactiva RS (modo comando)
                movwf   PORTB           ;Código de comando.
                call    LCD_BUSY        ;LCD libre?.
                goto    LCD_E           ;SI.Genera pulso de E.

;***************************************************************************
;LCD_INI: inicialización del LCD enviando el comando "Function Set" 3 veces consecutivas
;con un intervalo de unos 5 mS. El LCD queda borrado y el cursor en la primera posición

LCD_INI      movlw   b"00111000"
      call   LCD_REG      ;Código de instrucción
      call   LCD_DELAY   ;Temporiza
      movlw   b"00111000"
      call   LCD_REG      ;Código de instrucción
      call   LCD_DELAY   ;Temporiza
      movlw   b"00111000"
      call   LCD_REG      ;Código de instrucción
      call   LCD_DELAY   ;Temporiza
      movlw   b"00000001"     ;Borra LCD y Home.
                call    LCD_REG
                return

;*****************************************************************************
;LCD_DELAY: Rutina de temporización de unos 5 mS. Se emplean las variables Lcd_Temp_1
;y LCD_Temp_2 en lugar del TMR0. Este queda libre para las aplicaciones del usuario

LCD_DELAY:   clrwdt
                movlw   .10
                movwf   Lcd_Temp_1
                clrf   Lcd_Temp_2
LCD_DELAY_1:   decfsz   Lcd_Temp_2,F
      goto   LCD_DELAY_1
      decfsz   Lcd_Temp_1,F
      goto   LCD_DELAY_1
      return
         

Desconectado tornar

  • PIC18
  • ****
  • Mensajes: 342
RE: programa LCD
« Respuesta #1 en: 16 de Febrero de 2005, 03:40:00 »
Hola xelene, mirate el siguiente archivo que a lo mejor te puede ayudar, pq vienen casi las mismas rutinas que has puesto:

http://www.msebilbao.com/tienda/software.php

El archivo es  "Micro"PIC Trainer PLUS", le descomprimes, y te miras el archivo  lcd_cxx.asm

Si no consigues nada de esta forma, entonces hazmelo saber, y haremos pruebas con Proteus para ver si hacemos funcionar esto.

Un saludo.

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: programa LCD
« Respuesta #2 en: 17 de Febrero de 2005, 10:16:00 »
Gracias tornar, ya lo conseguí... con otro programita, pero lo conseguí.

Flash


 

anything