Autor Tema: como hacer que el pulsador ponga en pausa el display  (Leído 2265 veces)

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

Desconectado compi777

  • PIC10
  • *
  • Mensajes: 2
como hacer que el pulsador ponga en pausa el display
« en: 06 de Octubre de 2017, 18:17:11 »
Código: ASM
  1. LIST P=16F628A
  2. #include <p16F628a.inc>
  3.  
  4.    __CONFIG 3F10
  5.  
  6.   CONT   EQU  0X21
  7.   CONT2  EQU  0X22
  8.  
  9.  
  10.     ORG  0X00
  11.     GOTO INICIO
  12.     ORG  0X04
  13.  
  14.  
  15. DELAY_1MS
  16.        MOVLW .250
  17.        MOVWF CONT
  18. LOOP NOP
  19.      DECFSZ CONT,F
  20.      GOTO LOOP
  21. RETURN
  22.  
  23.  
  24. DELAY_250MS
  25.      MOVLW .250
  26.      MOVWF  CONT2
  27. LOOP2
  28.      CALL DELAY_1MS
  29.      DECFSZ CONT2,F
  30.      GOTO  LOOP2
  31. RETURN
  32.  
  33.    
  34.  
  35. INICIO
  36.  
  37. BSF STATUS,RP0
  38. CLRF TRISB
  39. BCF STATUS,RP0
  40. MOVLW 0X0F
  41. MOVWF PORTB
  42.  
  43. MOVLW   b'01111110'
  44. MOVWF PORTB
  45. CALL DELAY_250MS
  46. CALL DELAY_250MS
  47. CALL DELAY_250MS
  48. CALL DELAY_250MS
  49. MOVLW   b'00001100'    
  50. MOVWF PORTB
  51. CALL DELAY_250MS
  52. CALL DELAY_250MS
  53. CALL DELAY_250MS
  54. CALL DELAY_250MS       
  55. MOVLW   b'10110110'
  56. MOVWF PORTB
  57. CALL DELAY_250MS
  58. CALL DELAY_250MS
  59. CALL DELAY_250MS
  60. CALL DELAY_250MS
  61. MOVLW   b'10011110'
  62. MOVWF PORTB
  63. CALL DELAY_250MS
  64. CALL DELAY_250MS
  65. CALL DELAY_250MS
  66. CALL DELAY_250MS
  67. MOVLW   b'11001100'
  68. MOVWF PORTB
  69. CALL DELAY_250MS
  70. CALL DELAY_250MS
  71. CALL DELAY_250MS
  72. CALL DELAY_250MS
  73. MOVLW   b'11011010'
  74. MOVWF PORTB
  75. CALL DELAY_250MS
  76. CALL DELAY_250MS
  77. CALL DELAY_250MS
  78. CALL DELAY_250MS
  79. MOVLW   b'11111010'
  80. MOVWF PORTB
  81. CALL DELAY_250MS
  82. CALL DELAY_250MS
  83. CALL DELAY_250MS
  84. CALL DELAY_250MS
  85. MOVLW   b'00001110'
  86. MOVWF PORTB
  87. CALL DELAY_250MS
  88. CALL DELAY_250MS
  89. CALL DELAY_250MS
  90. CALL DELAY_250MS
  91. MOVLW   b'11111110'
  92. MOVWF PORTB
  93. CALL DELAY_250MS
  94. CALL DELAY_250MS
  95. CALL DELAY_250MS
  96. CALL DELAY_250MS
  97. MOVLW   b'11011110'
  98. MOVWF PORTB
  99. CALL DELAY_250MS
  100. CALL DELAY_250MS
  101. CALL DELAY_250MS
  102. CALL DELAY_250MS
  103.  
  104. MOVLW   b'11101110'
  105. MOVWF PORTB
  106. CALL DELAY_250MS
  107. CALL DELAY_250MS
  108. CALL DELAY_250MS
  109. CALL DELAY_250MS
  110. MOVLW   b'11111000'
  111. MOVWF PORTB
  112. CALL DELAY_250MS
  113. CALL DELAY_250MS
  114. CALL DELAY_250MS
  115. CALL DELAY_250MS
  116. MOVLW   b'01110010'
  117. MOVWF PORTB
  118. CALL DELAY_250MS
  119. CALL DELAY_250MS
  120. CALL DELAY_250MS
  121. CALL DELAY_250MS
  122. MOVLW   b'10111100'
  123. MOVWF PORTB
  124. CALL DELAY_250MS
  125. CALL DELAY_250MS
  126. CALL DELAY_250MS
  127. CALL DELAY_250MS
  128. MOVLW   b'11110010'
  129. MOVWF PORTB
  130. CALL DELAY_250MS
  131. CALL DELAY_250MS
  132. CALL DELAY_250MS
  133. CALL DELAY_250MS
  134. MOVLW   b'11100010'
  135. MOVWF PORTB
  136. CALL DELAY_250MS
  137. CALL DELAY_250MS
  138. CALL DELAY_250MS
  139. CALL DELAY_250MS
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146. GOTO INICIO
  147.  
  148.  
  149.  
  150.  
  151. end

Necesito la reformulacion del codigo para que el pulsador funcione como pausa y reanudacion en RB0
« Última modificación: 06 de Octubre de 2017, 18:24:33 por compi777 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:como hacer que el pulsador ponga en pausa el display
« Respuesta #1 en: 06 de Octubre de 2017, 20:23:07 »
La repuesta esta en:

- Usar una interrupcion de algun Timer para llegar a 1 segundo.
- Usar tablas para tener todos los datos

Luego te quedaria algo asi ( no voy a ser tan especifico ), y voy a suponer que el Timer hace una interrupcion cada 10ms.


Código: ASM
  1. LIST P=16F628A
  2. #include <p16F628a.inc>
  3.  
  4.    __CONFIG 3F10
  5.  
  6.   CONT   EQU  0X21
  7.   INDICE  EQU  0X22
  8.   FLAG    EQU   0x23
  9.  
  10.  
  11.     ORG  0X00
  12.     GOTO INICIO
  13.     ORG  0X04
  14.     GOTO  INTERRUPT
  15.  
  16. TABLA
  17.     ADDWF PCL, F
  18.     RETLW b'01111110' ; Este dato va a ser tomado con W = 0
  19.     RETLW b'00001100' ; W = 1
  20.     RETLW 2
  21.     RETLW 3
  22.     RETLW 4
  23.     RETLW 5
  24.     RETLW 6
  25.     RETLW 7
  26.     RETLW 8
  27.     RETLW 9
  28.  
  29.  
  30. INTERRUPT
  31.     ; Aca pongo el codigo de entrada de la interrupcion
  32.     ; Buscar el codigo en el datasheet
  33.  
  34.     BTFSC INTCON,T0IF
  35.     CALL TMR0_INT
  36.  
  37.     ; Aca va el codigo de salida de la interrupcion
  38.     ; Se encuentra en el mismo lugar que el de entrada
  39.  
  40.     RETFIE
  41.  
  42. ; Subrutina de interrupcion de Timer y envio al puerto
  43. TMR0_INT  
  44.     BCF   INTCON, T0IF    ; Limpio Flag
  45.     BTFSS  FLAG, 0        ; Esta activo el contador?
  46.     RETURN
  47.     DECFSZ CONT, F
  48.     RETURN
  49.     MOVLW d'100'    ; Reestablesco el contador, 100 * 10ms = 1000ms = 1s
  50.     MOVWF CONT
  51.     MOVF  INDICE, W ; Cargo el numero de indice que quiero obtener de la tabla
  52.     CALL  TABLA     ; Llamo la tabla, el resultado queda en W
  53.     MOVWF PORTB     ; Pongo los datos en el PORTB
  54.     INCF  INDICE, F ; Incremento para el proxima ves que pase 1 segundo
  55.     MOVWF INDICE, W ; Reviso si llego al maximo
  56.     XORLW 0xA       ; En este ejemplo son solo 10 datos
  57.     BTFSC STATUS, Z ; Si lo hace 0, es que el valor era 0xA
  58.     CLRF  INDICE, F ; Limpio Indice en caso que sea 0xA
  59.     RETURN
  60.  
  61.    
  62.  
  63. INICIO
  64.  
  65.       ; Inicio de configuracion dr modulos
  66.  
  67.       BANKSEL TRISB   ; Bank 1
  68.       MOVLW 0x1
  69.       MOVWF TRISB     ; RB0 como entrada
  70.       BANKSEL PORTB   ; Bank 0
  71.  
  72.       ; Aca configurar el Timer
  73.  
  74.       ; Set de valores iniciales, para que funcione todo
  75.       MOVLW d'100'
  76.       MOVWF CONT
  77.       CLRF  FLAG
  78.  
  79.       ; Mostramos el primer valor
  80.       MOVLW 0x0
  81.       CALL  TABLA
  82.       MOVWF PORTB   ; Aca mostre el valor
  83.       MOVLW 0x1
  84.       MOVWF INDICE  ; Aca seteo el proximo valor
  85.  
  86.  
  87. LOOP
  88.       ;Comienza el loop infinito
  89.  
  90.       ; Supongo que cuando se presiona el boton, RB0 se pone en 0 logico
  91.      
  92.       BTFSC   PORTB,0
  93.       GOTO  LOOP            ; Espero hasta que se presione, sino vuelvo
  94.       CALL    DEMORA_10MS   ; Si detecte que se presiono, uso una demora como antirebote
  95. LOOP_AUX:
  96.       BTFSS   PORTB,0       ; Espero que se suelte el boton, asi evito que entre muchas veces aca
  97.       GOTO LOOP_AUX         ;
  98.       MOVLW 0x1
  99.       XORWF FLAG, F         ; Procedo a invertir el bit 0 del registro "FLAG", este bit
  100.  
  101.       GOTO LOOP
  102.  
  103.  
  104.   END

De todas formas vas a tener que entender que hace el programa. Algo asi :P


 

anything