Autor Tema: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)  (Leído 25357 veces)

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

Desconectado keulyan

  • PIC10
  • *
  • Mensajes: 2
Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« en: 02 de Septiembre de 2010, 00:01:09 »
Hola picmaniacos, hace como un mes comencé desde cero con esto de los Pic´s. Como estoy en los ultimos años de ingenieria, la base de electronica y programación me fueron de mucha ayuda. Pero cabe destacar que los aportes de este foro fueron de valor incalculable, me hicieron avanzar de manera exponencial. Ni hablar de el gran maestro Suky (o suki... siempre se me confunde), que con su tutorial del 16f84 me ayudó muchisimo. Bueno quería dejar mi granito de arena, una de las cosas que no había podido encontrar era un programa en assembler que me permitiera mostrar por un LCD 16x2 un mensaje, basandome en el programa de suky y luego de hacer un analisis paso a paso, pude realizar las modificaciones necesarias para que este código permita realizar, de forma similar al programa antes mencionado, una salida al LCD winstar por un pic un poco más avanzado... el 16f877A.

Nota: no les voy a mentir, lo primero que intenté fue compilarlo como estaba, solo modificando los include, y recé porque no se queme ni el display ni el pic... no se quemó nada, pero obviamente no funcionó.


Código: ASM
  1. list            p=16f877A       ; list directive to define processor
  2.                 #include        <p16f877A.inc; processor specific variable definitions
  3.                 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF
  4.  
  5.  
  6.         ;**** Declaración de Registros ****
  7.         LCD_Dato        equ              0x20   ;registro para guardar dato a enviar al LCD
  8.         Loop            equ              0x21   ;registro para inicializacion del LCD
  9.         Contador1       equ              0x22   ;registro para demoras
  10.         Contador2       equ                      0x23   ;registro para demoras
  11.         ;**** Declaracion de bits para control LCD ****
  12.         RS              equ             0
  13.         RW              equ             1
  14.         E               equ             2
  15.         BACK    equ             3
  16.          
  17.         D4              equ             4
  18.         D5              equ             5
  19.         D6              equ             6
  20.         D7_BF   equ             7
  21.         ;**** Declaracion de Bytes del LCD ****
  22.         LCD_PORT_Control        equ             0x05    ; PORTA para control del LCD
  23.         LCD_PORT_Data           equ             0x06    ; PORTB para envio de Datos al LCD
  24.         LCD_TRIS_Control        equ             0x85    ; TRISA
  25.         LCD_TRIS_Data           equ             0x86    ; TRISB
  26.         ; **** Comandos de Software para la LCD ****
  27.         LCDLinea1       equ             0x80    ; Dirección comienzo línea1
  28.         LCDLinea2       equ             0xC0    ; Dirección comienzo línea2
  29.         LCDClr          equ             0x01    ; Borra pantalla, cursor a Inicio
  30.         LCDInicio       equ             0x02    ; Cursor a Inicio, DDRAM sin cambios
  31.         LCDInc          equ             0x06    ; Modo incrementa cursor
  32.         LCDDec          equ             0x04    ; Modo decrementa cursor
  33.         LCDOn           equ             0x0C    ; Pantalla On
  34.         LCDOff          equ             0x08    ; Pantalla Off
  35.         CursOn          equ             0x0E    ; Pantalla On, cursor On
  36.         CursOff         equ             0x0C    ; Pantalla On, cursor Off
  37.         CursBlink       equ             0x0F    ; Pantalla On, Cursor parpadeante
  38.         CurIzda         equ             0x10    ; Mueve cursor a la izquierda
  39.         CurDecha        equ             0x14    ; Mueve cursor a la derecha
  40.         DisIzda         equ             0x18    ; Mueve Display a la izquierda
  41.         DisDecha        equ             0x1C    ; Mueve Display a la Derecha
  42.         LCDBus_4_2      equ             0x28    ; Bus 4 bits, 2 líneas, 5x7
  43.         ;**** Definiciones para el ensamblador ****
  44.         #DEFINE LCD_E                   LCD_PORT_Control,E                       
  45.         #DEFINE LCD_RS                  LCD_PORT_Control,RS
  46.         #DEFINE LCD_RW                  LCD_PORT_Control,RW
  47.         #DEFINE LCD_D4                  LCD_PORT_Data,D4
  48.         #DEFINE LCD_D5                  LCD_PORT_Data,D5
  49.         #DEFINE LCD_D6                  LCD_PORT_Data,D6
  50.         #DEFINE LCD_D7_BF               LCD_PORT_Data,D7_BF
  51.         #DEFINE CD_backlight            LCD_PORT_Control,BACK   ; Control Backligth.-
  52.         ;**** Definición de macros ****
  53.         LCD_Putc macro  Carac
  54.                 movlw   Carac
  55.                 call    LCD_Caracter
  56.         endm
  57.         LCD_Putd macro  Coman  
  58.                 movlw   Coman
  59.                 call    LCD_Comando
  60.         endm
  61.         ;//////////////////////////////////////////////////////////
  62.         ;**** Inicio del Micro ****
  63.                 org     0x00
  64.                 goto    Inicio
  65.         ;**** Programa principal ****
  66.                 org     0x05
  67.         Inicio
  68.                 bsf             STATUS,RP0   ;Inicializo puertoA como I/O digitales
  69.                 movlw   0x06
  70.                 movwf   ADCON1
  71.                 bcf             TRISA,5
  72.                 call    LCD_Config_puertos      ; Configuramos Puertos a utilizar por LCD.-
  73.                 call    LCD_Init                ; Inicializamos LCD.-
  74. ;               bsf     LCD_backlight           ; Prendemos Backlight.-
  75.                 LCD_Putd CursBlink              ; Cursor Parpadeante.-
  76.                 LCD_Putc 'T'                    ; Escribimos en LCD.-
  77.                 LCD_Putc 'o'
  78.                 LCD_Putc 'd'
  79.                 LCD_Putc 'o'
  80.                 LCD_Putc ' '
  81.             LCD_Putc 'P'
  82.                 LCD_Putc 'i'
  83.                 LCD_Putc 'c'
  84.                
  85.                
  86.         Bucle
  87.                 nop
  88.                 goto    Bucle                   ; Bucle Infinito.-
  89.          
  90.         ;**** Subrutinas de Control ****
  91.          
  92.         ;**** Configuracion de puertos ****
  93.         LCD_Config_puertos
  94.                 bsf     STATUS,RP0              ; Seleccionamos Banco 1.-
  95.                 bcf     LCD_RS                  ; Colocamos todas las lineas de control y bus como Salidas.-
  96.                 bcf     LCD_RW
  97.                 bcf     LCD_E
  98.                 bcf     LCD_D4
  99.                 bcf     LCD_D5
  100.                 bcf     LCD_D6
  101.                 bcf     LCD_D7_BF
  102. ;               bcf     LCD_backlight          
  103.                 bcf     STATUS,RP0              ; Volvemos an Banco 0.-
  104.                 bcf     LCD_RS                   
  105.                 bcf     LCD_RW
  106.                 bcf     LCD_E
  107.                 bcf     LCD_D4
  108.                 bcf     LCD_D5
  109.                 bcf     LCD_D6
  110.                 bcf     LCD_D7_BF
  111. ;               bcf     LCD_backlight  
  112.                 return
  113.         ;...................................
  114.         ;**** Inicializacion de LCD ****
  115.         LCD_Init
  116.                 bcf     STATUS,RP0      ; Aseguramos Banco 0.-
  117.                 movlw   0x03
  118.                 movwf   Loop
  119.                 bsf     LCD_D4          ;<D7 D6 D5 D4> = 0011.-
  120.                 bsf     LCD_D5
  121.         ;.... se ejecuta 3 veces el siguiente bloque ....
  122.                 bsf     LCD_E
  123.                 call    Demora_5ms
  124.                 bcf     LCD_E
  125.                 call    Demora_5ms
  126.                 decfsz  Loop
  127.                 goto    $-5
  128.         ;.... Interfase de 4 bits ....
  129.                 bcf     LCD_D4          ;<D7 D6 D5 D4> = 0010.-
  130.                 bsf     LCD_E
  131.                 call    Demora_5ms
  132.                 bcf     LCD_E
  133.                 call    Demora_5ms
  134.         ;.... Sistema -> << Bus de 4 bits, 2 lineas, 5x7>>.-
  135.                 movlw   LCDBus_4_2
  136.                 call    LCD_Comando
  137.         ;....Limpia display y retorna al origen ....
  138.                 movlw   LCDClr
  139.                 call    LCD_Comando    
  140.                 return
  141.         ;.........................................
  142.         ;**** Lee Estado del LCD ****
  143.         LCD_Bandera
  144.                 bcf     LCD_RW
  145.                 bcf     LCD_RS
  146.                 bcf     LCD_E
  147.                 bcf     LCD_D4
  148.                 bcf     LCD_D5
  149.                 bcf     LCD_D6
  150.                 bcf     LCD_D7_BF
  151.                 nop    
  152.         bsf     LCD_RW  ; Modo Lectura.-
  153.                 bsf     STATUS,RP0      ; Banco 1.-
  154.                 bsf     LCD_D7_BF       ; Configura TRIS para recibir estado del LCD.-
  155.                 bcf     STATUS,RP0      ; Banco 1.-
  156.                 bsf     LCD_E
  157.                 nop
  158.                 btfsc   LCD_D7_BF       ; Lee estado del LCD, 1-> Ocupado.-
  159.                 goto    $-1             ; Esperamos a que se desocupe.-
  160.                 bcf     LCD_E           ; LCD_D7/BF->0, seguimos adelante.-
  161.                 bsf     STATUS,RP0      ; Banco 1.-
  162.                 bcf     LCD_D7_BF       ; Reconfigura TRIS para envio de Data.-
  163.                 bcf     STATUS,RP0      ; Banco 1.-    
  164.                 return
  165.         ;.............................
  166.         ;**** Envia pulso Enable ****
  167.         LCD_Enable
  168.                 bsf     LCD_E
  169.                 nop
  170.                 nop
  171.                 bcf     LCD_E
  172.                 return
  173.         ;.............................
  174.         ;**** Envia Dato al LCD ****
  175.         ;*** Previamente configurado como Comando o como Caracter.-
  176.         LCD_Envio_Data
  177.                 movwf   LCD_Dato        ; Guardamos Dato a enviar.-
  178.                                         ; CARGAMOS NIBLE ALTO EN PUERTO.-
  179.                 bcf     LCD_D4          ; Cargamos un cero.-
  180.                 btfsc   LCD_Dato,4      ; Si es 1, modificamos a uno, sino seguimos.-
  181.                 bsf     LCD_D4
  182.                 bcf     LCD_D5          ;
  183.                 btfsc   LCD_Dato,5
  184.                 bsf     LCD_D5
  185.                 bcf     LCD_D6          ;
  186.                 btfsc   LCD_Dato,6
  187.                 bsf     LCD_D6
  188.                 bcf     LCD_D7_BF       ;
  189.                 btfsc   LCD_Dato,7
  190.                 bsf     LCD_D7_BF
  191.                 call    LCD_Enable      ; Habilitamos LCD para recepcion de Data.-
  192.                                         ; CARGAMOS NIBLE BAJO EN PUERTO.-
  193.                 bcf     LCD_D4          ; Cargamos un cero.-
  194.                 btfsc   LCD_Dato,0      ; Si es 1, modificamos a uno, sino seguimos.-
  195.                 bsf     LCD_D4
  196.                 bcf     LCD_D5          ;
  197.                 btfsc   LCD_Dato,1
  198.                 bsf     LCD_D5
  199.                 bcf     LCD_D6          ;
  200.                 btfsc   LCD_Dato,2
  201.                 bsf     LCD_D6
  202.                 bcf     LCD_D7_BF       ;
  203.                 btfsc   LCD_Dato,3
  204.                 bsf     LCD_D7_BF      
  205.                 call    LCD_Enable      ; Habilitamos LCD para recepcion de Data.-
  206.                 return
  207.         ;.............................
  208.         ;**** Envia Comando al LCD ****
  209.         LCD_Comando
  210.                 call    LCD_Bandera             ;Controla si el LCD esta en condiciones de recibir un nuevo dato.-
  211.                 bcf             LCD_RW                  ; Modo escritura.-
  212.                 bcf             LCD_RS                  ; Se enviara Comando.-
  213.                 call    LCD_Envio_Data  ; Envio Comando.-
  214.                 return
  215.         ;.............................
  216.         ;**** Envia Caracter al LCD ****
  217.         LCD_Caracter
  218.                 call    LCD_Bandera             ;Controla si el LCD esta en condiciones de recibir un nuevo dato.-
  219.                 bcf     LCD_RW                  ; Modo escritura.-
  220.                 bsf     LCD_RS                  ; Se enviara Caracter.-
  221.                 call    LCD_Envio_Data  ; Envio Caracter.-
  222.                 return
  223.         ;..............................
  224.         ;**** Demora ****
  225.         Demora_5ms
  226.                 movlw   0xC8                    ; 200
  227.                 movwf   Contador1               ; Iniciamos contador1.-
  228.         Repeticion1
  229.                 movlw   0x07                    ;
  230.                 movwf   Contador2               ; Iniciamos contador2
  231.         Repeticion2
  232.                 decfsz  Contador2,1             ; Decrementa Contador2 y si es 0 sale.-        
  233.                 goto    Repeticion2             ; Si no es 0 repetimos ciclo.-
  234.                 decfsz  Contador1,1             ; Decrementa Contador1.-
  235.                 goto    Repeticion1             ; Si no es cero repetimos ciclo.-
  236.                 return                                  ; Regresa de la subrutina.-
  237.          
  238.         ;...............................  
  239.  
  240.        
  241.                 end

 La conexión del integrado al LCD es la misma que la que presenta suky en su tutorial, obviamente respetando los pines del 16f877A. El oscilador es el mismo, uno de 4 Mhz.

Espero les sirva

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #1 en: 02 de Septiembre de 2010, 00:40:16 »
Se agradece el aporte!  :-/ Seguramente a muchos les será de utilidad!  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado cdrpo

  • PIC18
  • ****
  • Mensajes: 317
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #2 en: 02 de Septiembre de 2010, 10:38:32 »
Como se prueba si un LCD 16*2 esta bueno?

tengo un LCD 16*2 y algunos caracteres no se despliegan, puede ser falla de mi código o del LCD

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #3 en: 02 de Septiembre de 2010, 11:11:52 »
Como se prueba si un LCD 16*2 esta bueno?

tengo un LCD 16*2 y algunos caracteres no se despliegan, puede ser falla de mi código o del LCD

Si se inicia pero después hay fallas en algunos caracteres, puede ser que no se esté esperando correctamente a que se desocupe el LCD para enviarle más datos.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado keulyan

  • PIC10
  • *
  • Mensajes: 2
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #4 en: 02 de Septiembre de 2010, 17:07:57 »
Gracias Suky... si, espero que sirva el aporte.... perdon por el plagio, debidamente notificado, pero plagio al fin :D

Para cdrpo: seria importante saber si te están faltando caracteres, o si los que queres poner en el codigo no son los que terminan en el LCD(por ejemplo: ponés una "u" y sale una "e"). te digo esto ya que me pasó algo parecido y resulto ser que el primer juego de 4 bits que le mandaba al LCD no llegaba correctamente, se ponia en cero. Yo tenia en variable 0x8E, pero le pasaba el dato 0x0E, eso provocaba que saliera un caracter ASCII distinto. Me reulto util corroborar el código con el simulador de MPLAB paso a paso verificando valores de variables y registros con el WATCH (en la pestaña VIEW). Si te faltan caracteres seguramente suky dio en el clavo.

Saludos

Desconectado tromex

  • PIC10
  • *
  • Mensajes: 1
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #5 en: 26 de Enero de 2011, 12:30:33 »
Hola soy nuevo en el foro...  :) Probé el código en un PIC16F876A a 4 MHz y anda perfecto! Gracias!
 8)

Desconectado Correia

  • PIC10
  • *
  • Mensajes: 39
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #6 en: 12 de Septiembre de 2011, 19:20:19 »
buenas, en verdad que ese tutorial diseñado por suky (vos cuantos lenguajes de programar pic domina?) es muy bueno, son bases importantes para el que comienza assembler, por cierto suky te queria preguntar sabes que programe un LCD (bueno use el codigo completo de tu tutorial) con otros caracteres para mostrar pero no arranca =s cuando lo simulo, el proteus dice "attempted to write after reading a single nible" ("trató de escribir después de leer una sola nible"), soy un partidiario de que con ejemplo se aprende rapido y se desarrolla rapido el analisis, por eso requiero que funcione =s ayuda en verdad.
-Tsuki no Tamashi
-Microcontroladores
-Robotica
-Evangelion
-Einstein

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #7 en: 12 de Septiembre de 2011, 19:32:00 »
Podrías mostrar exactamente que código no funciona..


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Correia

  • PIC10
  • *
  • Mensajes: 39
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #8 en: 12 de Septiembre de 2011, 19:56:03 »
Citar
list      p=16f628A           ; list directive to define processor
      #include <p16F628A.inc>       ; processor specific variable definitions

      errorlevel  -302              ; suppress message 302 from list file

   __CONFIG   _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT

;-------Declaracion de Registros--------

LCD_DATO equ 0x0C ; registro para guardar dato a enviar al lcd
loop equ 0x1A ; registro para inicializacion del LCD
retardo1 equ 0xE ;registro para los retardos
retardo2 equ 0xF ;registro para los retardos
;-------Declaracion de bits para el control de LCD--------
RS equ 0 ; RA0 (modo comando)
RW equ 1 ; RA1 (Read/write)
E  equ 2 ; RA2 (abilitar)
BACK equ 3
D4 equ 4 ; RB4
D5 equ 5 ; RB5
D6 equ 6 ; RB6
D7_BF equ 7 ;RB7 este bus del lcd indica cuando esta lleno el busy, al enviar un dato.
;-------Declaracion de Bytes del LCD----------
LCD_P_CONTROL equ 0x05 ; PORTA
LCD_P_DATA equ 0x06    ; PORTB
LCD_T_CONTROL equ 0x85 ; TRISA
LCD_T_DATA equ 0x86    ; TRISB
;------COMANDOS DE SOFTWARE PARA LCD----------
LCDLinea1   equ 0x80 ; direccion comienzo de linea1 
LCDLinea2   equ 0xC0 ; direccion de comienzo de linea2
LCDClr equ 0x01 ;Borra pantalla, curso a inico
LCDInicio equ 0x02 ; cursos a inicio, ddram sin cambio
LCDInc equ 0x06 ;modo incrementa cursor
LCDDec equ 0x04 ;modo decrementa cursor
LCDOn equ 0x0C ; pantalla on
LCDOff equ 0x08 ;pantalla off
CursOn equ 0x0E ;pantalla on, cursor on
CursOff equ 0x0C ;pantalla on, cursor off
CursBlink equ 0x0F ; Pantalla on, cursos parpadeante
CurIzda equ 0x10 ; mueve cursor a la izquierda
CurDere equ 0x14 ; mueve cursor a la derecha
DisIzda equ 0x18 ; mueve display a la izquierda
DisDere equ 0x1C ; mueve display a la derecha
LCDBus_4_2 equ 0x28 ; Modo LCD 4 bits al bus, 2 lineas, 5x7
;--------DEFINICIONES DE TRABAJO PARA EL ASSEMBLER----------
#DEFINE LCD_E LCD_P_CONTROL,E
#DEFINE LCD_RS LCD_P_CONTROL,RS
#DEFINE   LCD_RW LCD_P_CONTROL,RW
#DEFINE LCD_D4 LCD_P_DATA,D4
#DEFINE LCD_D5 LCD_P_DATA,D5
#DEFINE LCD_D6 LCD_P_DATA,D6
#DEFINE LCD_D7_BF LCD_P_DATA,D7_BF
#DEFINE LCD_backlight LCD_P_CONTROL,BACK ; control de backlight
#DEFINE banco1 bsf STATUS,RP0 ; banco 1
#DEFINE banco0 bcf STATUS,RP0 ; banco 0
;--------DEFINICION DE MACROS-------------
LCD_PUTC macro Carac ;macro para el envio del caracter a visualizar en lcd
       movlw Carac
       call LCD_CARACTER
      endm
LCD_PUTD macro Coman ; macro para activar los comandos que se desean utilizar del lcd
       movlw Coman
       call LCD_COMANDO
      endm
;------------------------------------------
;-------COMIENZO---------------
   org 0x00
   goto inicio
;------------------------------
   org 0x05
inicio
     movlw 0x07
     movwf CMCON
    call LCD_CONF_PUERTOS ;rutina de configuracion de puertos a utilizar por LCD
    call LCD_INIT ;rutina de inicializacion de LCD
    bsf LCD_backlight ; se prende backlight
    LCD_PUTD CursBlink ;cursos parpadeante
    LCD_PUTC 'J'
     LCD_PUTC 'E'
    LCD_PUTC 'H'
    LCD_PUTC 'O'
    LCD_PUTC 'V'
     LCD_PUTC 'A'
bucle
     nop
     goto bucle

;------SUBRUTINAS DE CONTROL---------
;-------configuracion de puertos-----
LCD_CONF_PUERTOS
      banco1
      bcf LCD_RS   
      bcf LCD_RW
      bcf LCD_E
      bcf LCD_D4
      bcf LCD_D5
      bcf LCD_D6
      bcf LCD_D7_BF
      bcf LCD_backlight
      banco0
      bcf LCD_RS   
      bcf LCD_RW
      bcf LCD_E
      bcf LCD_D4
      bcf LCD_D5
      bcf LCD_D6
      bcf LCD_D7_BF
      bcf LCD_backlight
      return
;-------inicializacion del LCD-------
LCD_INIT
      banco0
      movlw 0x03
      movwf loop
      bsf LCD_D4
      bsf LCD_D5
      bsf LCD_E
      call retardo
      bcf LCD_E
      call retardo
      decfsz loop,F
      goto $-5
      bcf LCD_D4
      bsf LCD_E
      call retardo
      bcf LCD_E
      call retardo
;------------------------------------
      movlw LCDBus_4_2
      call  LCD_COMANDO
      movlw LCDClr
      call LCD_COMANDO
      return
;------------------------------------
LCD_BANDERA
      bcf LCD_RS   
      bcf LCD_RW
      bcf LCD_E
      bcf LCD_D4
      bcf LCD_D5
      bcf LCD_D6
      bcf LCD_D7_BF
      bcf LCD_backlight
      nop
      bsf LCD_RW ; modo lectura
      banco1
      bsf LCD_D7_BF
      banco0
      bsf LCD_E
      nop
      btfsc LCD_D7_BF
      goto $-1
      bcf LCD_E
      banco1
      bcf LCD_D7_BF
      banco0
      return
;----------------------------------------
LCD_ENABLE
      bsf LCD_E
      nop
      nop
      bcf LCD_E
      return
;----------------------------------------
;-------ENVIO DE DATO AL LCD-------------
LCD_ENVIO_DATO      
      movwf LCD_DATO ; Guardamos Dato a enviar.-
                   ; CARGAMOS NIBLE ALTO EN PUERTO.-
      bcf LCD_D4 ; Cargamos un cero.-
       btfsc LCD_DATO,4 ; Si es 1, modificamos a uno, sino seguimos.-
      bsf LCD_D4
      bcf LCD_D5 ;
       btfsc LCD_DATO,5
       bsf LCD_D5
       bcf LCD_D6 ;
       btfsc LCD_DATO,6
       bsf LCD_D6
       bcf LCD_D7_BF ;
       btfsc LCD_DATO,7
       bsf LCD_D7_BF
       call LCD_ENABLE ; Habilitamos LCD para recepcion de Data.-
    ; CARGAMOS NIBLE BAJO EN PUERTO.-
      call retardo
       bcf LCD_D4 ; Cargamos un cero.-
       btfsc LCD_DATO,0 ; Si es 1, modificamos a uno, sino seguimos.-
       bsf LCD_D4
       bcf LCD_D5 ;
      btfsc LCD_DATO,1
      bsf LCD_D5
       bcf LCD_D6 ;
       btfsc LCD_DATO,2
       bsf LCD_D6
       bcf LCD_D7_BF ;
       btfsc LCD_DATO,3
       bsf LCD_D7_BF
       call LCD_ENABLE ; Habilitamos LCD para recepcion de Data.-
       return
;--------------comando-----------
LCD_COMANDO
      call LCD_BANDERA
      bcf LCD_RW
      bcf   LCD_RS
      call LCD_ENVIO_DATO
      return
LCD_CARACTER
      call LCD_BANDERA
      bcf LCD_RW
      bsf   LCD_RS
      call LCD_ENVIO_DATO
      return
;---------------------------------
      
retardo ;retardo de 5ms
     movlw 0xC8
     movwf retardo1
repetir
     movlw 0x07
     movwf retardo2
repetir1
     decfsz retardo2,F
     goto repetir1
     decfsz retardo1,F
     goto repetir
     return
;-------------------------------
     end



-Tsuki no Tamashi
-Microcontroladores
-Robotica
-Evangelion
-Einstein

Desconectado Correia

  • PIC10
  • *
  • Mensajes: 39
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #9 en: 12 de Septiembre de 2011, 20:15:50 »

aqui esta la imagen de la simulacion del proteus y el error que el programa dice, y arriba el codigo suky.
-Tsuki no Tamashi
-Microcontroladores
-Robotica
-Evangelion
-Einstein

Desconectado Correia

  • PIC10
  • *
  • Mensajes: 39
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #10 en: 12 de Septiembre de 2011, 20:21:19 »
el bit RA2 que va al pin E del LCD si esta conectado en la simulacion, solo que no se nota en la foto.
-Tsuki no Tamashi
-Microcontroladores
-Robotica
-Evangelion
-Einstein

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #11 en: 12 de Septiembre de 2011, 23:34:57 »
Rápidamente no se ve donde puede estar el problema, proba con la siguiente rutina de Bandera:

Código: [Seleccionar]
LCD_BANDERA
      bcf LCD_RS   
      bcf LCD_RW
      bcf LCD_E
      bcf LCD_D4
      bcf LCD_D5
      bcf LCD_D6
      bcf LCD_D7_BF
      nop
      banco1
      bsf LCD_D7_BF
      banco0
      bsf LCD_RW ; modo lectura
      bsf LCD_E
      nop
      btfsc LCD_D7_BF
      goto $-1
      bcf LCD_E
      nop
      bsf LCD_E
      nop
      nop
      nop
      bcf LCD_E
      banco1
      bcf LCD_D7_BF
      banco0
      return


Si ir paso a paso en proteus y ver que no se cumple con los requerimientos del LCD.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Correia

  • PIC10
  • *
  • Mensajes: 39
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #12 en: 12 de Septiembre de 2011, 23:53:20 »
nada, queda igual encendida sola la pantalla y ese msj del proteus, segun investigue en el foro, hay un comentario de leon_pic que dice que el proteus no simula el pin 7 el buffer del lcd, el que se encarga de notificar si esta lleno o vacio para recibir los datos, vos ha probado esa programacion en proteus? bueno disculpe la molestia, por cierto se acerca el 17 =D
-Tsuki no Tamashi
-Microcontroladores
-Robotica
-Evangelion
-Einstein

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #13 en: 13 de Septiembre de 2011, 12:35:41 »
Puede llegar a ser, podrías para simular agregar un demora de 100us en lugar de la rutina BANDERA...

Citar
bueno disculpe la molestia, por cierto se acerca el 17 =D

Que tiene de especial esa fecha? Me perdí  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado Correia

  • PIC10
  • *
  • Mensajes: 39
Re: Manejo LCD 16x2 con 16f877A - (adaptado de Suky)
« Respuesta #14 en: 13 de Septiembre de 2011, 22:06:34 »
la competencia de robotica en la universidad de paranama argentina =D, joder, si aqui hicieran seguidos eventos asi =s pero hacen uno solo una vez al año y si acaso =s =,( amo la electronica y programacion, (electronica+programacion=robotica).
-Tsuki no Tamashi
-Microcontroladores
-Robotica
-Evangelion
-Einstein


 

anything