Autor Tema: Ayuda con reloj digital para 16f877A  (Leído 3800 veces)

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

Desconectado cat256

  • PIC10
  • *
  • Mensajes: 2
Ayuda con reloj digital para 16f877A
« en: 07 de Julio de 2009, 08:28:17 »
Hola necesito ayuda con este programa. Está implementado para una lcd 16x4, pero sólo tengo una lcd de 16x1, cuandop coloco la lcd de 16x1 en proteus no me fiunciona nada :shock:.. No entiendo q pueda estar sucediendo. :(

Código: ASM
  1. list            p=16f877
  2. include         <p16f877.inc>
  3.  
  4.  
  5. Lcd_var         equ     0x20
  6. n               equ     0x23
  7. seg             equ     0x26
  8. min             equ     0x27
  9. hora            equ     0x28
  10. Temporal                equ     0x29
  11. Unidades                equ     0x2A
  12. Decenas         equ     0x2B
  13. VAR1            equ     0x2C
  14. VAR2            equ     0x2D
  15.  
  16. org             0x00
  17. goto            Inicio
  18.  
  19. org             0x04
  20. goto            Inter
  21.  
  22. include         <LCD_PORTD.inc>
  23.  
  24. Inter           btfss   PIR1,TMR1IF
  25. retfie
  26.                                
  27.                                
  28. ;INTERRUMPCION TMR0
  29. SI_SEG
  30.         bcf             INTCON,GIE
  31.         bcf             PIR1,TMR1IF
  32.         comf            PORTA,f         ;Prende y apaga LED en RA0 cada segundo
  33.         incf            seg,f           ;Si paso el segundo
  34.         movlw           .60
  35.         subwf           seg,w
  36.         btfss           STATUS,Z
  37.         goto            Ini_hora
  38.         clrf            seg             ;Pasaran 60 Seg seg=0
  39.         incf            min,f           ;se incrementan los minutos
  40.         movlw           .60
  41.         subwf           min,w
  42.         btfss           STATUS,Z
  43.         goto            Ini_hora
  44.         clrf            min             ;Pasaron 60 Min min=0
  45.         movlw           .12
  46.         subwf           hora,w          ;Las horas=12
  47.         btfsc           STATUS,Z
  48.         clrf            hora            ;Si hora=12 se borra para luego ser llevada a hora=1
  49.         incf            hora,f          ;Se incrementan las horas
  50.  
  51. ;Pregunta si esta presionado RB4
  52. Ini_hora
  53.         btfsc           PORTB,4
  54.         goto            Inc_min
  55.         call            RETARDO_10
  56.         movlw           .12
  57.         subwf           hora,w          ;Las horas=12
  58.         btfsc           STATUS,Z
  59.         clrf            hora            ;Si hora=12 se borra para luego ser llevada a hora=1
  60.         incf            hora,f          ;Se incrementan las horas
  61.         goto            INI_SEG
  62.  
  63. ;Pregunta si esta presionado RB5
  64. Inc_min
  65.         btfsc           PORTB,5
  66.         goto            rei_seg
  67.         call            RETARDO_10
  68.         incf            min,f           ;se incrementan los minutos
  69.         movlw           .60
  70.         subwf           min,w
  71.         btfss           STATUS,Z
  72.         goto            INI_SEG
  73.         clrf            min             ;Pasaron 60 Min min=0
  74.         goto            INI_SEG
  75.  
  76. ;Pregunta si esta presionado RB6
  77. rei_seg
  78.         btfsc           PORTB,6         ;Reinicia el segundero a cero
  79.         goto            INI_SEG
  80.         call            RETARDO_10
  81.         movlw           0x80
  82.         movwf           TMR1H
  83.         clrf            TMR1L
  84.         clrf            seg
  85.         movlw           0x9D
  86.         call            LCD_REG
  87.         movlw           '0'
  88.         call            LCD_DATO
  89.         movlw           '0'
  90.         call            LCD_DATO
  91.  
  92.  
  93. INI_SEG
  94.         movlw           0x80
  95.         movwf           TMR1H
  96.         clrf            TMR1L
  97.         call            MOSTRAR_HORA
  98.         bcf             PIR1,TMR1IF
  99.  
  100.  
  101. SALIR
  102.         bsf             INTCON,GIE
  103.         retfie
  104.  
  105.  
  106. Inicio
  107.         bsf             STATUS,RP0
  108.         bcf             STATUS,RP1      ;Banco 1
  109.         movlw           .6
  110.         movwf           ADCON1          ;Puertos A y E E/S Digitales
  111.         clrf            TRISA
  112.         clrf            TRISD
  113.         clrf            TRISE
  114.         movlw           0xFF
  115.         movwf           TRISB
  116.         movwf           TRISC           ;Puertos B y C como entradas
  117.         clrf            OPTION_REG
  118.         movlw           0x01
  119.         movwf           PIE1            ;Habilitar Interrupcion por Timer1
  120.         bcf             STATUS,RP0      ;Banco 0
  121.         clrf            PORTA
  122.         clrf            PORTD
  123.         clrf            PORTE           ;Borra latch de Salida
  124.         clrf            seg
  125.         clrf            min
  126.         movlw           .12
  127.         movwf           hora            ;Inicializa la hora-> 12:00:00
  128.         movlw           0x0F
  129.         movwf           T1CON
  130.         movlw           0x80
  131.         movwf           TMR1H
  132.         clrf            TMR1L           ;Se carga con 32768 el TIMER1
  133.         movlw           b'11000000'     ;Habilita la interrupcion
  134.         movwf           INTCON          ;por Timer1
  135.         bcf             PIR1,TMR1IF     ;Inicializar la bandera en 0
  136.  
  137.  
  138. ;Inicializa la LCD que esta conectada por el puerto D y
  139. ;Muestra los mensajes en la pantalla
  140. call            UP_LCD          ;Configura puerto para el LCD
  141. call            LCD_INI         ;Inicia el LCD
  142. movlw           b'00001100'
  143. call            LCD_REG         ;LCD On, cursor y blink Off
  144. call            MOSTRAR_HORA
  145. bucle           clrwdt
  146. nop
  147. goto            bucle
  148.                                        
  149.  
  150. ;*********************************************************
  151. ;*********************************************************
  152.  
  153.  
  154. ;Sub rutina para convertir numeros decimales a BCD
  155.  
  156. Conver
  157.         movwf           Temporal
  158.         clrf            Decenas
  159.         clrf            Unidades
  160.  
  161. Conver_1
  162.         movlw           .10
  163.         subwf           Temporal,f
  164.         btfsc           3,0
  165.         goto            INCREMENTAR
  166.         movf            Temporal,w
  167.         addlw           .10
  168.         movwf           Unidades
  169.         return
  170.  
  171. INCREMENTAR
  172.         incf            Decenas,f
  173.         goto            Conver_1
  174.  
  175.  
  176. ;*********************************************************
  177. ;*********************************************************                             
  178.  
  179.  
  180. RETARDO_10
  181.         movlw           .4
  182.         movwf           VAR1
  183.         ciclo1
  184.                 movlw           .221
  185.                 movwf           VAR2
  186.         ciclo2
  187.                 decfsz          VAR2,F
  188.                 goto            ciclo2
  189.                 decfsz          VAR1,F
  190.                 goto            ciclo1
  191.         return
  192.  
  193.  
  194. ;*********************************************************
  195. ;*********************************************************                             
  196.  
  197.  
  198. MOSTRAR_HORA
  199.         movlw           0x97
  200.         call            LCD_REG
  201.         movf            hora,w
  202.         call            Conver
  203.         movf            Decenas,w
  204.         iorlw           0x30
  205.         call            LCD_DATO
  206.         movf            Unidades,w
  207.         iorlw           0x30
  208.         call            LCD_DATO
  209.         movlw           ':'
  210.         call            LCD_DATO
  211.         movf            min,w
  212.         call            Conver
  213.         movf            Decenas,w
  214.         iorlw           0x30
  215.         call            LCD_DATO
  216.         movf            Unidades,w
  217.         iorlw           0x30
  218.         call            LCD_DATO
  219.         movlw           ':'
  220.         call            LCD_DATO
  221.         movf            seg,w
  222.         call            Conver
  223.         movf            Decenas,w
  224.         iorlw           0x30
  225.         call            LCD_DATO
  226.         movf            Unidades,w
  227.         iorlw           0x30
  228.         call            LCD_DATO
  229.         return
  230.  
  231.  
  232. ;*********************************************************
  233. ;*********************************************************     
  234.                                
  235. end

_____________________________________________________________________________________________________


;LCD_PORTD.inc
#define ENABLE       bsf PORTE,2        ;Activa señal E
#define DISABLE      bcf PORTE,2        ;Desactiva señal E
#define LEER         bsf PORTE,1        ;Pone LCD en Modo RD
#define ESCRIBIR     bcf PORTE,1        ;Pone LCD en Modo WR
#define OFF_COMANDO  bcf PORTE,0        ;Desactiva RS (modo comando)
#define ON_COMANDO   bsf PORTE,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
            bcf      STATUS,RP1
                clrf    PORTD           ;RD <0-7> salidas digitales
                clrf   PORTE            ;Puerta E salidas
                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   PORTD           ;Puerta D como entrada
                bcf     STATUS,RP0      ;Selecciona el banco 0
                ENABLE                  ;Activa el LCD
                nop

LCD_BUSY_1   btfsc   PORTD,7         ;Chequea bit de Busy
                goto    LCD_BUSY_1      ;
                DISABLE                 ;Desactiva LCD
                bsf     STATUS,RP0                              
                clrf    PORTD           ;Puerta D 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   PORTD           ;Valor ASCII a sacar por portd
                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   PORTD           ;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
« Última modificación: 07 de Julio de 2009, 09:33:22 por un Moderador »

Desconectado jarpax

  • PIC10
  • *
  • Mensajes: 11
Re: Ayuda con reloj digital para 16f877A
« Respuesta #1 en: 16 de Julio de 2009, 23:37:41 »

amigo tendrias que revisar a que pines corresponden los de tu pantalla lcd, si no me equivoco
en los lcd 2x16 standar(los que encuentro por estas tiendas d epor aka  :))
la primer fila empiesa con la direccion 40, no recuerdo bien
la segunda empiesa con la 0, o sera al reves, weno fijate mas que todos con el bus de control,(rs,enable, r/w, contraste,alimentacion, tierra) que correspondan a sus respectivos lugares,
ahora mmmmm vi un modelo de lcd de una linea pero tenia las 80 direcciones empesaba con la direeccion 0, y en la mitad de donde vemos las letras empesaba la 40
(--------********)
-=direccion 00
*=apartir de la 40
tal ves se paresca pero no recuerdo su pinaje suerte  :-/

Desconectado cat256

  • PIC10
  • *
  • Mensajes: 2
Re: Ayuda con reloj digital para 16f877A
« Respuesta #2 en: 17 de Julio de 2009, 07:40:11 »
gracias jarpax.. el problema era la dirección.. y luego me habia equivocado en poner la frecuencia de reloj.. puse 32.768 y es 32.768k, muy importanta.. jiji