desktop

Curso de programación de PIC en PICBasic Pro

Hola amigo reyvilla te agradesco por el codigo esta muy muy bueno, en esta parte que activamos el boton se podria ponerle un pequeño antirrebote digo por si se le podria meter ruido en algun momento y si seria de esta manera o de que manera posible asegurarlo como para evitar que se active solo o talvez no sea necesario amigo
Código:
     if boton0 = 1  then
     pause 10
     if boton0 = 1 then
     while boton0  = 1
     I = I + 1
veo que guardas el el valor de I en la memoria del pic verdad
if boton0 = 1 then ;activo boton
WHILE boton0 = 1
I = I + 1
FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
PAUSEUS 10
NEXT
WEND
WRITE 00,I
goto verifica
endif
como podria hacer si le quisiera agregar 1 o 2 pulsadores mas cada uno con su respectivo led y que funcione de la misma manera que el primer pulsador con el primer led. tendria que agregarle 2 variables mas o podria trabajar con la misma en este caso la I.
si para 2 min
Código:
     FLAG0 = 120 'PARA UN TIEMPO DE 2min 
     toggle led_0
     I = 0
     ENDIF
le das 120 segundos verdad podria darle por decir 3600 para una hora en una rutina y en otra rutina
Código:
     FLAG0 = 60 'PARA UN TIEMPO DE 1min
     toggle led_0
     I = 0
     ENDIF
darle 14400 que seria 4 horas o cuanto de maximo de tiempo le podria colocar a cada uno.
 
Última edición:
Hola lo del antirebote en este caso no hace falta en caso de ruido para eso estan las pull-down que son las resistencias que mantienen 0V en cada uno de los pulsadores. Lo de grabar el valor era para poder compara el tiempo de pulsación y el tiempo de encendido del led y esa parte la puedes borrar. Los otros pulsadores necesitarías generar su propia rutina en cada sub-rutina, ejemplo en el inicio cada botón tendría que tener su propia rutina de temporizacion lo que si se mantendria seria la variable de referencia I ya que esa se borra. Y efectivamente como indicas si colocas un valor de 3600seg es una hora. El valor máximo seria de 65535seg que es el valor máximo para una variable tipo word y si colocas otro contador pues puedes extenderlo mucho mas. Cualquier otra cosa me avisas saludos
 
Reyvilla como estas amigo se me complica un poco agregarle un pulsador podrias orientarme y decirme por favor en que parte del codigo me estoy equivocando ya que no trabaja como devberia de ser
Código:
    MAIN:
     IF BOTON0 = 1 THEN GOTO UNO
     IF BOTON1 = 1 THEN GOTO DOS
   GOTO MAIN   

   UNO:  
     if boton0 = 1 then    
      WHILE boton0 = 1
       I = I + 1
        FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
         PAUSEUS 10
        NEXT
       WEND
      WRITE 00,I
     goto verifica      
    endif 
     
     if led_0 = 0 and led_1 = 0 and led_2 = 0 then
      goto UNO
     else
      goto temporiza
     endif       
    
     verifica:
       
       if i => 256 then
        i = 0
       goto UNO
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG0 = 5 'PARA UN TIEMPO DE 10 SEG
        toggle led_0
       I = 0
      ENDIF
     
       IF I <= 150 and i > 50 THEN 
        for aux = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG0 = 10 'PARA UN TIEMPO DE 1min
         toggle led_0
        I = 0
       ENDIF
     
       IF I <= 200 and i > 150 THEN  
        for aux = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG0 = 15 'PARA UN TIEMPO DE 2min 
       toggle led_0
      I = 0
     ENDIF  
     
     
   DOS:  
     if boton1 = 1 then    
      WHILE boton1 = 1
       I = I + 1
        FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
         PAUSEUS 10
        NEXT
       WEND
      WRITE 00,I
     goto verifica1      
    endif 
     
     if led_1 = 0 and led_0 = 0 and led_2 = 0 then
      goto DOS
     else
      goto temporiza
     endif       
    
     verifica1:
       
       if i => 256 then
        i = 0
       goto DOS
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG1 = 5 'PARA UN TIEMPO DE 10 SEG
        toggle led_1
       I = 0
      ENDIF
     
       IF I <= 150 and i > 50 THEN 
        for aux = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG1 = 10 'PARA PRUEBA 10 SEG
         toggle led_1
        I = 0
       ENDIF
     
       IF I <= 200 and i > 150 THEN  
        for aux = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG1 = 15 'PARA UN TIEMPO DE 15 SEG PRUEBA
       toggle led_1
      I = 0
     ENDIF       
      
     
     temporiza:
     IF MILISEGUNDO => 78 THEN  '998.4 MILISEGUNDOS + 1.14 = 999.54 ML  = 1 SEG APORX.
     MILISEGUNDO = 0
     
     
     IF led_0 = 1 AND TLed1 < FLAG0 THEN
     TLed1 = TLed1 + 1
     ELSE
     TLed1  = 0
     FLAG0  = 0
     Led_0  = 0
     endif       
     GOTO UNO
     
     IF led_1 = 1 AND TLed2 < FLAG1 THEN
     TLed2 = TLed2 + 1
     ELSE
     TLed2  = 0
     FLAG1  = 0
     Led_1  = 0
     ENDIF 
     endif       
     GOTO DOS     
     
    Disable
    MI_INTERRUPCION:
    PAUSEUS 13   'DIFERENCIA EN TIEMPO 13 * 78 = 1014 US = 1.14 MILISEGUNDOS 
                 'EL VALOR DEL TMR0 ES DE 206 Y  EL DEL PREESCALER DE 256
                 'ESO DA UN VALOR DE 12800uSEG OSEA 12.8SEG
                 'ESO MULTIPLICADO POR 78, 12.8 * 78 = 998.4 PARA APROXIMARLO MAS
                 'SE COMPENSO CON UNA PAUSA DE 13uSEG POR CADA MILISEGUNDO
                 
    MILISEGUNDO = MILISEGUNDO + 1

    TMR0 = 206
    INTCON = %10100000
    Resume 'VUELVE DESDE DONDE FUE INTERRUNPIDA
    Enable 'INTERRUMPE DESPUES DE LA CABECERA SEGUN MANUAL PBP 

    END
como que se complica en algunos moementos o mejor dicho no prende ni apaga como deveria de ser que parte estoy fallando amigo
 
saludos amigo cesarim, viendo tu código puedo notar un error al momento en el que usas la instrucción for- next, y ademas lo usas varias veces e tu codigo; para explicarte mejor tu lo usas así :
Código:
FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
         PAUSEUS 10
        NEXT
el error tuyo esta en que en la parte de "next" la forma correcta seria "next aux", y así sucesivamente a lo largo del código. Espero haberme echo entender saludos!
 
saludos amigo cesarim, viendo tu código puedo notar un error al momento en el que usas la instrucción for- next, y además lo usas varias veces en tu código; para explicarte mejor, tú lo usas así :
Código:
FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
         PAUSEUS 10
        NEXT
El error tuyo está en que, en la parte de "next" la forma correcta sería "next aux", y así sucesivamente a lo largo del código. Espero haberme hecho entender, saludos!
Esto no responde la pregunta de cesarim, es una aclaración sobre el uso del bucle For... Next

Veamos un ejemplo:

For Conteo = Inicio To Final {Step {-1} Incremento}
{Instrucciones}
Next {Conteo}

Lo que se encuentra dentro de los corchetes es opcional.
No es necesario escribir la variable Conteo después de Next. PE: "Next Conteo"
El compilador asume por orden los bucles For... Next y genera errores cuando están en desorden las terminaciones Next dentro de bucles anidados.

Por lo tanto al compilar el programa se obtendrá el mismo efecto si se escribe de esta forma...

For Conteo = 1 To 10
High PORTB.1
Pause 100
Low PORTB.1
Pause 100
Next

Que de esta otra forma...

For Conteo = 1 To 10
High PORTB.1
Pause 100
Low PORTB.1
Pause 100
Next Conteo

Ó de esta otra...

For Conteo = 1 To 10 Step 1
High PORTB.1
Pause 100
Low PORTB.1
Pause 100
Next

Porque se asume que la variable Conteo deberá ser incrementada de 1 en 1 hasta que llegue a 10.

Como el código de cesarim carece de comentarios relevantes, es muy difícil entender que es lo que quiere hacer.
Y por lo tanto dar una solución a su problema también lo es.
Aparte únicamente se refiere a una sola persona para la resolución a su problema y con ello se pierde la oportunidad de que otras personas le puedan sugerir como en tu caso, alguna colaboración extra.

Normas del Foro 23) Es de mala educación referir una consulta a un solo miembro de la Comunidad.
Además de que te pierdes la posibilidad de que otros miembros te respondan.

Saludos.
 
Última edición:
saludos amigos del foro espero no interpreten mal mi ayuda a mi codigo, se me es muy dificil entrar por motivos de trabajo al foro ya que no tengo internet en casa. el codigo que generosamente ustedes me estan ayudando a resolver y a terminar para mi ejercicio va quedando como me ayudo nuestro amigo reyvilla, pero al ponerle otro boton con otro relay que trabaje con los mismos tiempos de pulsacion que el primer boton no me funciona y eh ahi donde pido su ayuda ya que me gustaria no solo adecuarle 2 botones cada uno con su respectivo relay sino adecuarlo a 4 botones o pulsadores cada uno con sus respectivos relays. espero me sepan disculpar si me exprese mal o si no supe pedir la ayuda adecuada

el problema que tengo radica aca creo yo y no se de que manera intentarle
Código:
  MAIN:
     IF BOTON0 = 1 THEN GOTO UNO ;aca le indico que lea boton0 si no esta presionado 
     IF BOTON1 = 1 THEN GOTO DOS ;entonces pase a leer boton1 y si detecta que se                                        
   GOTO MAIN   ;presiono cualquiera de estos dos entonces salta a su rutina adecuada
                     ;o si no sigue leyendo hasta que detecte el boton activado

   UNO:  
     if boton0 = 1 then    
      WHILE boton0 = 1
       I = I + 1
        FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
         PAUSEUS 10
        NEXT
       WEND
      WRITE 00,I
     goto verifica      
    endif 
     
     if led_0 = 0 and led_1 = 0 and led_2 = 0 then
      goto UNO
     else
      goto temporiza
     endif       
    
     verifica:
       
       if i => 256 then
        i = 0
       goto UNO
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG0 = 5 'PARA UN TIEMPO DE 10 SEG
        toggle led_0
       I = 0
      ENDIF
     
       IF I <= 150 and i > 50 THEN 
        for aux = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG0 = 10 'PARA UN TIEMPO DE 1min
         toggle led_0
        I = 0
       ENDIF
     
       IF I <= 200 and i > 150 THEN  
        for aux = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG0 = 15 'PARA UN TIEMPO DE 2min 
       toggle led_0
      I = 0
     ENDIF  
     
   ;el punto es que al pulsar un boton cualquiera de los dos se encienden los dos leds y no 
   ;deveria hacer eso deveria solamente prender un led y al activar el otro boton encender 
   ;el otro led es lo que me marea que manera adecuada podria hacerlo con dos o tres o hasta 
   ; cuatro pulsadores mas  
   DOS:  
     if boton1 = 1 then    
      WHILE boton1 = 1
       I = I + 1
        FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
         PAUSEUS 10
        NEXT
       WEND
      WRITE 00,I
     goto verifica1      
    endif 
     
     if led_1 = 0 and led_0 = 0 and led_2 = 0 then
      goto DOS
     else
      goto temporiza
     endif       
    
     verifica1:
       
       if i => 256 then
        i = 0
       goto DOS
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG1 = 5 'PARA UN TIEMPO DE 10 SEG
        toggle led_1
       I = 0
      ENDIF
     
       IF I <= 150 and i > 50 THEN 
        for aux = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG1 = 10 'PARA PRUEBA 10 SEG
         toggle led_1
        I = 0
       ENDIF
     
       IF I <= 200 and i > 150 THEN  
        for aux = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG1 = 15 'PARA UN TIEMPO DE 15 SEG PRUEBA
       toggle led_1
      I = 0
     ENDIF       
      
     
     temporiza:
     IF MILISEGUNDO => 78 THEN  '998.4 MILISEGUNDOS + 1.14 = 999.54 ML  = 1 SEG APORX.
     MILISEGUNDO = 0
     
     
     IF led_0 = 1 AND TLed1 < FLAG0 THEN
     TLed1 = TLed1 + 1
     ELSE
     TLed1  = 0
     FLAG0  = 0
     Led_0  = 0
     endif       
     GOTO UNO
     
     IF led_1 = 1 AND TLed2 < FLAG1 THEN
     TLed2 = TLed2 + 1
     ELSE
     TLed2  = 0
     FLAG1  = 0
     Led_1  = 0
     ENDIF 
     endif       
     GOTO DOS     
     
    Disable
    MI_INTERRUPCION:
    PAUSEUS 13   'DIFERENCIA EN TIEMPO 13 * 78 = 1014 US = 1.14 MILISEGUNDOS 
                 'EL VALOR DEL TMR0 ES DE 206 Y  EL DEL PREESCALER DE 256
                 'ESO DA UN VALOR DE 12800uSEG OSEA 12.8SEG
                 'ESO MULTIPLICADO POR 78, 12.8 * 78 = 998.4 PARA APROXIMARLO MAS
                 'SE COMPENSO CON UNA PAUSA DE 13uSEG POR CADA MILISEGUNDO
                 
    MILISEGUNDO = MILISEGUNDO + 1

    TMR0 = 206
    INTCON = %10100000
    Resume 'VUELVE DESDE DONDE FUE INTERRUNPIDA
    Enable 'INTERRUMPE DESPUES DE LA CABECERA SEGUN MANUAL PBP 

    END
por favor espero su ayuda
 
Última edición:
buenas noches compañeros de foros de electrónica me podrían colaborar explicándome una parte de este código que publicaron en post del foro, hay parte del código que no la entiendo.

Código:
ADCON1 = %10000010  
TrisB  = %00000001
TrisC  = %00000000
TrisD  = %00000001
PortB  = %00000000
PortC  = %00000000


LPV     con 70    'Porcentaje minimo de bateria
LB      var word
adVal   var word					
aVal    var word		
aACC    var byte
L       var byte

Lcdout $fe, 1   				
Lcdout "Lubeck "			
Pause 50       		
aval=0

Inicio: 
 'Inserta tu codigo Aqui...
 gosub ACC	
 gosub adc
Goto inicio      				
End

ACC:
 if aacc<>portb.0 then                        ; en esta parte dicen que aacc no es igual a portb.0
   LCDOUT $FE,64                               ; cargan en en la memoria CG RAM
   LCDOUT $1F,$11,$1B,$E,$4,$4,$4,$4  ; mostrar el carácter personalizado de un enchufe 
   LCDOUT $A,$1F,$11,$1B,$E,$4,$4,$4
   LCDOUT $0,$A,$1F,$11,$1B,$E,$4,$4
   LCDOUT $0,$0,$A,$1F,$11,$1B,$E,$4
   LCDOUT $0,$0,$0,$A,$1F,$11,$1B,$E
   LCDOUT $0,$0,$0,$0,$A,$1F,$11,$1B
   LCDOUT $0,$0,$0,$0,$0,$A,$1F,$11
   LCDOUT $0,$0,$0,$0,$0,$0,$A,$1F
   if not PortB.0 then                         ; esta parte no la se expresar bien y no se lo que hace
    for L=7 to 0 step-1                        ; hace que se muestre el carácter como si estuviera 
     lcdout $FE,$8F,l                           ; desconectando de la luz.
     pause 50
    next L
   else                                             ; 
    for L=0 to 7
     lcdout $FE,$8F,l
     pause 50
    next L
   endif
   LCDOUT $FE,$8F,"E"
   pause 2000
  aacc=  portb.0   
 endif
return
 
ADC:
 ADCIN 0, adval			
 lb=(1024/100)*LPV;LB = 717
 L=(adval-lb)/((1024-lb)/7) 
 if aacc=0 or l+1<7 then			
  if aval<>adval then
   LCDOUT $FE,64 
   lcdout $0E,$11,$1B,$15,$1B,$11,$1F,$1F
   lcdout $0E,$11,$11,$11,$11,$11,$11,$1F
   lcdout $0E,$11,$11,$11,$11,$11,$1F,$1F
   lcdout $0E,$11,$11,$11,$11,$1F,$1F,$1F
   lcdout $0E,$11,$11,$11,$1F,$1F,$1F,$1F
   lcdout $0E,$11,$11,$1F,$1F,$1F,$1F,$1F
   lcdout $0E,$11,$1F,$1F,$1F,$1F,$1F,$1F
   lcdout $0E,$1F,$1F,$1F,$1F,$1F,$1F,$1F
   LCDOUT $FE,$8F,l+1
   pause 2000
  endif
 else  
  LCDOUT $FE,$8F,"C"
 endif 
 aval=adval		
Return
end

el archivo de proteus y el codigo estan en el post de Solo Ejemplos PICBASICPRO-PROTEUS UPS para microcontroladores. Estaría muy agradecido si me pudieran explicar bien el funcionamiento de este código ya que me serviría de mucho para el proyecto que quiero realizar.
Cordial saludo
 
hola buenas tardes. de antemano muchas gracias por la atención prestada.
pude instalar proteus 8, pbp v4, tengo un pic 16f84a y un lcd 16*2 ; mirando varios de todos los ejemplos aquí mostrados he hecho varias practicas pequeñas ya que no se nada de programación. pero tengo muchas ganas de aprender de todos ustedes.

En este primer programa mantengo presionado un pulsador y durante el tiempo que lo mantengo presionado el pulsador sale en pantalla un mensaje.

En el 2do programa, la idea es que al presionar 1 vez el pulsador, aparezca el mensaje, luego al presionar el pulsador por segunda vez, el mensaje desaparezca. No lo he podido lograr, una vez presionado el pulsador, sale un mensaje intermitente y el pulsador no responde mas. sin embargo lo coloco para que me ayuden, me corrijan y me expliquen

Programa 1
Código:
DEFINE LCD_DREG PORTA 'UTILIZAR 4 BITS DEL PUERTO A PARA TX DE DATOS
DEFINE LCD_DBIT 0     'DESDE EL BIT A.0 AL BIT A.3
DEFINE LCD_RSREG PORTA 'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO A
DEFINE LCD_RSBIT 4    'EN EL BIT A.4
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3

TRISA=0  'ESTABLECER EL PUERTO A COMO SALIDA
TRISB=1 ; RB0,RB1 SON ENTRADAS
PAUSE 500 ' PAUSE DE MEDIO SEGUNDO

;CONFIGURACION DE ENTRADAS AL PIC 16F84a
Symbol PULSADOR = PORTB.0   ; BOTON DE AJUSTE PARA HORA


IF PULSADOR = 1 THEN
LCDOUT $FE, 1 ' LIMPIAR VISOR
LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
LCDOUT $FE, $0C                                        'APAGAR EL CURSOR
ENDIF

IF PULSADOR = 0 THEN
LCDOUT $FE, 1 ' LIMPIAR VISOR
ENDIF
Programa 2
Código:
DEFINE LCD_DREG PORTA 'UTILIZAR 4 BITS DEL PUERTO A PARA TX DE DATOS
DEFINE LCD_DBIT 0     'DESDE EL BIT A.0 AL BIT A.3
DEFINE LCD_RSREG PORTA 'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO A
DEFINE LCD_RSBIT 4    'EN EL BIT A.4
DEFINE LCD_EREG PORTB  'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3

TRISA=0 'ESTABLECER EL PUERTO A COMO SALIDA
TRISB=1 ; RB0,RB1 SON ENTRADAS
PAUSE 500  ' PAUSE DE MEDIO SEGUNDO

;CONFIGURACION DE ENTRADAS AL PIC 16F84a
Symbol PULSADOR = PORTB.0   ; BOTON DE AJUSTE PARA HORA

CONTADOR VAR BYTE

INICIO: 

   IF PULSADOR  THEN
   CONTADOR = CONTADOR + 1 
   GOSUB AUMENTAR
   ENDIF
GOTO INICIO

AUMENTAR:

   IF CONTADOR = 1 THEN
   GOSUB PRENDER
   ENDIF
   IF CONTADOR = 2 THEN
   GOSUB APAGAR
   ENDIF
GOTO AUMENTAR

PRENDER:
   LCDOUT $FE, 1 ' LIMPIAR VISOR
   LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
   LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
   LCDOUT $FE, $0C                                        'APAGAR EL CURSOR
GOTO AUMENTAR

APAGAR:
   LCDOUT $FE, 1 ' LIMPIAR VISOR
GOTO AUMENTAR
                                  
END
Muchas gracias por la atención prestada, disculpen la ignorancia pero por algo se empieza. ...
 
Última edición por un moderador:
hola jesusmolo porque no ensayas en la etiqueta apagar colocar la bandera contador otra vez en cero y en inicio en la parte de if pulsador colocale si pulsador=1 ó pulsador=0 segun como tengas el pulsador configurado si con resistencia pull-up ó pull-down.
 
En este primer programa mantengo presionado un pulsador y durante el tiempo que lo mantengo presionado el pulsador sale en pantalla un mensaje.

En el 2do programa, la idea es que al presionar 1 vez el pulsador, aparezca el mensaje, luego al presionar el pulsador por segunda vez, el mensaje desaparezca. No lo he podido lograr, una vez presionado el pulsador, sale un mensaje intermitente y el pulsador no responde mas. sin embargo lo coloco para que me ayuden, me corrijan y me expliquen
Para el programa 1 puedes hacerlo de esta forma:
Código:
Symbol Pulsador = PORTB.0

Inicio:
    LCDOut $FE,1        ; Inicializar la pantalla.
    
Programa:
    If Pulsador Then                ; Si Pulsador = 1
    While Pulsador                  ; Mientras Pulsador = 1
    LCDOut $FE,$80,"HOLA"           ; Escribir en línea 1
    LCDOut $FE,$C0,"ELECTRONICA"    ; Escribir en línea 2
    Pause 100
    Wend                            ; Pulsador ahora está en 0
    LCDOut $FE,1                    ; Limpiar la pantalla
    EndIf
    GoTo Programa
Para el segundo programa de esta otra forma:
Código:
Symbol Pulsador = PORTB.0

; Declaración de variables.
B0          Var Byte
Contador    Var Byte

Inicio:
    LCDOut $FE,1        ; Inicializar la pantalla.
    Clear               ; Limpiar variables.
    
Programa:
    Button Pulsador,1,255,255,B0,0,Programa
    Contador = Contador + 1         ; Incrementar Contador
    If Contador = 1 Then            ; Si Contador llegó a 1...
    LCDOut $FE,$80,"HOLA"           ; Escribir en línea 1
    LCDOut $FE,$C0,"ELECTRONICA"    ; Escribir en línea 2
    Pause 100
    Else                            ; Si es superior a 1...
    LCDOut $FE,1                    ; Borrar la pantalla.
    Contador = 0                    ; Regresar Contador a 0
    EndIf
    GoTo Programa
    
    End
Nota que estás usando el pin RA4 para el pin RS de la pantalla y el pin RA4 es con drenador abierto.
Para utilizar ese pin y obtener los dos estados lógicos que se requieren, debes colocar una resistencia Pull-Up.

Adjunto los códigos y la simulación por si requieres saber la conexión.

Saludos.
 

Adjuntos

  • Programas 1 y 2.rar
    21.4 KB · Visitas: 68
hola jesusmolo porque no ensayas en la etiqueta apagar colocar la bandera contador otra vez en cero y en inicio en la parte de if pulsador colocale si pulsador=1 ó pulsador=0 según como tengas el pulsador configurado si con resistencia pull-up ó pull-down.

hola juancaca, de antemano gracias por tu pronta respuesta, te comento que siguiendo tus indicaciones o corrígeme si me equivoque en algo, hice lo siguiente:

Código:
DEFINE LCD_DREG PORTA 'UTILIZAR 4 BITS DEL PUERTO A PARA TX DE DATOS
DEFINE LCD_DBIT 0     'DESDE EL BIT A.0 AL BIT A.3
DEFINE LCD_RSREG PORTA 'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO A
DEFINE LCD_RSBIT 4    'EN EL BIT A.4
DEFINE LCD_EREG PORTB  'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3

TRISA=0 'ESTABLECER EL PUERTO A COMO SALIDA
TRISB=1 ; RB0,RB1 SON ENTRADAS
PAUSE 500  ' PAUSE DE MEDIO SEGUNDO

;CONFIGURACION DE ENTRADAS AL PIC 16F84a
Symbol PULSADOR = PORTB.0   ; BOTON DE AJUSTE PARA HORA

CONTADOR VAR BYTE

INICIO: 

   IF PULSADOR = 1  THEN
   CONTADOR = CONTADOR + 1 
   GOSUB AUMENTAR
   ENDIF
GOTO INICIO

AUMENTAR:

   IF CONTADOR = 1 THEN
   GOSUB PRENDER
   ENDIF
   IF CONTADOR = 2 THEN
   GOSUB APAGAR
   ENDIF
GOTO AUMENTAR

PRENDER:
   LCDOUT $FE, 1 ' LIMPIAR VISOR
   LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
   LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
   LCDOUT $FE, $0C                                        'APAGAR EL CURSOR
GOTO AUMENTAR

APAGAR:
   CONTADOR = 0
   LCDOUT $FE, 1 ' LIMPIAR VISOR
GOTO AUMENTAR
                                  
END

La resistencia es PULL DOWN en PORTB.0, me sigue apareciendo el mensaje intermitente.
Probare ahora como me indica D@rkbytes y les comentaré.
De todas maneras muchas gracias juancaca por tu tiempo. (y)

Adjunto el diagrama en proteus.
 

Adjuntos

  • PULSADOR MENSAJE.png
    PULSADOR MENSAJE.png
    20.7 KB · Visitas: 47
Última edición por un moderador:
Para el programa 1 puedes hacerlo de esta forma:
Código:
Symbol Pulsador = PORTB.0

Inicio:
    LCDOut $FE,1        ; Inicializar la pantalla.
    
Programa:
    If Pulsador Then                ; Si Pulsador = 1
    While Pulsador                  ; Mientras Pulsador = 1
    LCDOut $FE,$80,"HOLA"           ; Escribir en línea 1
    LCDOut $FE,$C0,"ELECTRONICA"    ; Escribir en línea 2
    Pause 100
    Wend                            ; Pulsador ahora está en 0
    LCDOut $FE,1                    ; Limpiar la pantalla
    EndIf
    GoTo Programa
Para el segundo programa de esta otra forma:
Código:
Symbol Pulsador = PORTB.0

; Declaración de variables.
B0          Var Byte
Contador    Var Byte

Inicio:
    LCDOut $FE,1        ; Inicializar la pantalla.
    Clear               ; Limpiar variables.
    
Programa:
    Button Pulsador,1,255,255,B0,0,Programa
    Contador = Contador + 1         ; Incrementar Contador
    If Contador = 1 Then            ; Si Contador llegó a 1...
    LCDOut $FE,$80,"HOLA"           ; Escribir en línea 1
    LCDOut $FE,$C0,"ELECTRONICA"    ; Escribir en línea 2
    Pause 100
    Else                            ; Si es superior a 1...
    LCDOut $FE,1                    ; Borrar la pantalla.
    Contador = 0                    ; Regresar Contador a 0
    EndIf
    GoTo Programa
    
    End
Nota que estás usando el pin RA4 para el pin RS de la pantalla y el pin RA4 es con drenador abierto.
Para utilizar ese pin y obtener los dos estados lógicos que se requieren, debes colocar una resistencia Pull-Up.

Adjunto los códigos y la simulación por si requieres saber la conexión.

Saludos.

hola D@rkbytes buenas tardes, muchas gracias por tan pronta, corta y acertada respuesta, hermanazo :aplauso:, con respuestas como estas, haces que los que apenas empezamos y veiamos la programacion de pic como algo muy complejo; le tomemos empeño y ganas de seguir explorando. :apreton: :aplauso: (y)

si no es molestia me gustaria que me expliacaras 2 dudas que tengo:

1.- esta instruccion del 2do programa.

Button Pulsador,1,255,255,B0,0,Programa


2.- La funcion del pulsador de reset en el pin MCRL, del pic es borrar todo rastro de programa grabado, para poder grabar otros programas? o tiene otra funsión? es necesario colocarlo en todos los ejercicios que quiera hacer? o al momento que yo quiera montar el ejercicio fisicamente no lo coloco para no borrar por accidende el programa?

Nuevamente muchas gracias compañero. :apreton: :aplauso: (y)
 
hola juancaca, de antemano gracias por tu pronta respuesta, te comento que siguiendo tus indicaciones o corrígeme si me equivoque en algo, hice lo siguiente:

Código:
DEFINE LCD_DREG PORTA 'UTILIZAR 4 BITS DEL PUERTO A PARA TX DE DATOS
DEFINE LCD_DBIT 0     'DESDE EL BIT A.0 AL BIT A.3
DEFINE LCD_RSREG PORTA 'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO A
DEFINE LCD_RSBIT 4    'EN EL BIT A.4
DEFINE LCD_EREG PORTB  'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3

TRISA=0 'ESTABLECER EL PUERTO A COMO SALIDA
TRISB=1 ; RB0,RB1 SON ENTRADAS
PAUSE 500  ' PAUSE DE MEDIO SEGUNDO

;CONFIGURACION DE ENTRADAS AL PIC 16F84a
Symbol PULSADOR = PORTB.0   ; BOTON DE AJUSTE PARA HORA

CONTADOR VAR BYTE

INICIO: 

   IF PULSADOR = 1  THEN
   CONTADOR = CONTADOR + 1 
   GOSUB AUMENTAR
   ENDIF
GOTO INICIO

AUMENTAR:

   IF CONTADOR = 1 THEN
   GOSUB PRENDER
   ENDIF
   IF CONTADOR = 2 THEN
   GOSUB APAGAR
   ENDIF
GOTO AUMENTAR

PRENDER:
   LCDOUT $FE, 1 ' LIMPIAR VISOR
   LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
   LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
   LCDOUT $FE, $0C                                        'APAGAR EL CURSOR
GOTO AUMENTAR

APAGAR:
   CONTADOR = 0
   LCDOUT $FE, 1 ' LIMPIAR VISOR
GOTO AUMENTAR
                                  
END

La resistencia es PULL DOWN en PORTB.0, me sigue apareciendo el mensaje intermitente.
Probare ahora como me indica D@rkbytes y les comentaré.
De todas maneras muchas gracias juancaca por tu tiempo. (y)

Adjunto el diagrama en proteus.

hola jesusmolo mirando tu codigo le hice unas modificaciones y ya me funciona e hice otro muy parecido al de D@rkbytes y tambien funciona

codigo 1

Código:
INICIO: 

    IF PULSADOR = 1 THEN
        while pulsador=1
        wend
        pause 200
        CONTADOR = CONTADOR + 1 
        GOSUB AUMENTAR
    ENDIF
GOTO INICIO

AUMENTAR:

    IF CONTADOR = 1 THEN
        GOSUB PRENDER
    ENDIF
    IF CONTADOR = 2 THEN
        GOSUB APAGAR
    ENDIF
GOTO inicio

PRENDER:
    LCDOUT $FE, 1 ' LIMPIAR VISOR
    LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
    LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
    'LCDOUT $FE, $0C 'APAGAR EL CURSOR
return 

APAGAR:
    
    CONTADOR = 0
    LCDOUT $FE, 1 ' LIMPIAR VISOR
return

END

codigo 2

Código:
INICIO: 

    IF PULSADOR = 1 THEN
        while pulsador=1
        wend
        pause 200
        CONTADOR = CONTADOR + 1 
        if contador=1 then
            LCDOUT $FE, 1 ' LIMPIAR VISOR
            LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
            LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA 
        else
            contador=2
            LCDOUT $FE, 1 ' LIMPIAR VISOR
            CONTADOR = 0
        endif    
    ENDIF
GOTO INICIO
end
espero te sirva
cordial saludo
 
si no es molestia me gustaría que me explicaras 2 dudas que tengo:

1.- esta instrucción del 2do programa.

Button Pulsador,1,255,255,B0,0,Programa


2.- La función del pulsador de reset en el pin MCRL, del pic es borrar todo rastro de programa grabado, para poder grabar otros programas? o tiene otra función? es necesario colocarlo en todos los ejercicios que quiera hacer? o al momento que yo quiera montar el ejercicio físicamente no lo coloco para no borrar por accidente el programa?
Para la primer pregunta mira por aquí: Instrucción Button PBP

La función del pin MCLR es resetear el microcontrolador, no borra el programa interno.
Al llevar este pin a un estado lógico 0 el microcontrolador reinicia el programa desde el vector de reset.
Sin embargo no reinicia los valores almacenados en la memoria RAM.
Por ese motivo hay que iniciar las variables con el valor deseado antes de la ejecución del programa.

En el PIC16F84A y algunos otros, por ejemplo los PIC16F87X/A este pin puede colocarse directamente a VCC.
De esta forma no se podrá resetear el microcontrolador por accidente.
La única forma de que se borre el programa es regrabando el microcontrolador o que éste se dañe.
En otros microcontroladores PIC el pin MCLR puede también ser usado como entrada.

Cualquier duda sobre el funcionamiento del PIC que uses se encuentra en su hoja de datos.
hola D@rkbytes buenas tardes, muchas gracias por tan pronta, corta y acertada respuesta, hermanazo :aplauso:, con respuestas como estas, haces que los que apenas empezamos y veíamos la programación de pic como algo muy complejo; le tomemos empeño y ganas de seguir explorando. :apreton: :aplauso: (y)
De nada. (y)
Continúa leyendo este Tema y encontrarás mucha información.

Saludos.
 
hola jesusmolo mirando tu codigo le hice unas modificaciones y ya me funciona e hice otro muy parecido al de D@rkbytes y tambien funciona

codigo 1

Código:
INICIO: 

    IF PULSADOR = 1 THEN
        while pulsador=1
        wend
        pause 200
        CONTADOR = CONTADOR + 1 
        GOSUB AUMENTAR
    ENDIF
GOTO INICIO

AUMENTAR:

    IF CONTADOR = 1 THEN
        GOSUB PRENDER
    ENDIF
    IF CONTADOR = 2 THEN
        GOSUB APAGAR
    ENDIF
GOTO inicio

PRENDER:
    LCDOUT $FE, 1 ' LIMPIAR VISOR
    LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
    LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
    'LCDOUT $FE, $0C 'APAGAR EL CURSOR
return 

APAGAR:
    
    CONTADOR = 0
    LCDOUT $FE, 1 ' LIMPIAR VISOR
return

END

codigo 2

Código:
INICIO: 

    IF PULSADOR = 1 THEN
        while pulsador=1
        wend
        pause 200
        CONTADOR = CONTADOR + 1 
        if contador=1 then
            LCDOUT $FE, 1 ' LIMPIAR VISOR
            LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
            LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA 
        else
            contador=2
            LCDOUT $FE, 1 ' LIMPIAR VISOR
            CONTADOR = 0
        endif    
    ENDIF
GOTO INICIO
end
espero te sirva
cordial saludo

juancaca, muchas gracias por tan variadas soluciones, me doy cuenta que todo esta en el empeño y la creatividad que uno desarrolle para cada problema. :apreton::aplauso:(y)
 
Última edición:
Amigos despues de casi 2 semanas de trabajo puedo entrar con un poco de calma al foro, es dificil para mi ya que del trabajo soy exclavo, ayer estuve intentando modificar el codigo del codigo sobre los pulsadores pero aun no le encuentro el logaritmo adecuado para que trabaje como deberia de ser. este es el primer codigo que un amigo del foro me ayudo y trabaja perfecto con un solo pulsador activando su respectivo relay
Código:
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_CLKOUT    
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF            
@ DEVICE LVP_OFF               
@ DEVICE CPD_ON             
@ DEVICE PROTECT_ON 
       
DEFINE OSC 4 

CMCON = 7

TRISB = %00000000 
TRISA = %11110001 
PORTA = %00000000
PORTB = %00000000

TLED1       VAR word 
TLED2       VAR word 
TLED3       VAR WORD 

MinutO      var byte   
Segundo     Var Byte     
MAS_TIEMPO  VAR BYTE
INITIO      VAR BYTE
I           var byte

FLAG        VAR WORD
FLAG0       VAR word
FLAG1       VAR word
FLAG2       VAR word

AUX         VAR BYTE
MILISEGUNDO var byte



;******POTENCIA******///////****** 
LED_0       var PORTB.0  
LED_1       VAR PORTB.1 
LED_2       VAR PORTB.2 
LED_3       VAR PORTB.3
Trbuz       VAR PORTB.7
;********************///////******

;******PULSADORES****///////****** 
                
BOTON0      VAR PortA.0 
BOTON1      VAR PortA.6
BOTON2      VAR PortA.7
;********************///////******

TMR0 = 206
OPTION_REG = %10000111 'preescaller 256 
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

FLAG0=0
FLAG1=0
flag2=0
i=0
    

     INICIO:  
   
     if boton0 = 1 then    ;activo boton
     WHILE boton0 = 1
     I = I + 1
     FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
     PAUSEUS 10
     NEXT
     WEND
     WRITE 00,I
     goto verifica      
     endif 
     
     if led_0 = 0 and led_1 = 0 and led_2 = 0 then
     goto inicio
     else
     goto temporiza
     endif       
    
     verifica:
       
     if i => 256 then
     i = 0
     goto inicio
     endif
     
     IF I <= 50  THEN 
     SOUND Trbuz,[110,5] 
     Trbuz = 0
     FLAG0 = 10 'PARA UN TIEMPO DE 10 SEG
     toggle led_0
     I = 0
     ENDIF
     
     IF I <= 150 and i > 50 THEN 
     for aux = 0 to 1
     SOUND Trbuz,[110,5]
     pause 300
     next
     Trbuz = 0
     FLAG0 = 60 'PARA UN TIEMPO DE 1min
     toggle led_0
     I = 0
     ENDIF
     
     IF I <= 200 and i > 150 THEN  
     for aux = 0 to 2
     SOUND Trbuz,[110,5]
     pause 300
     next 
     Trbuz = 0
     FLAG0 = 120 'PARA UN TIEMPO DE 2min 
     toggle led_0
     I = 0
     ENDIF    
     
     temporiza:
     IF MILISEGUNDO => 78 THEN  '998.4 MILISEGUNDOS + 1.14 = 999.54 ML  = 1 SEG APORX.
     MILISEGUNDO = 0
     
     
     IF led_0 = 1 AND TLed1 < FLAG0 THEN
     TLed1 = TLed1 + 1
     ELSE
     TLed1  = 0
     FLAG0  = 0
     Led_0  = 0
     ENDIF 
     endif       
     GOTO INICIO
     
    Disable
    MI_INTERRUPCION:
    PAUSEUS 13   'DIFERENCIA EN TIEMPO 13 * 78 = 1014 US = 1.14 MILISEGUNDOS 
                 'EL VALOR DEL TMR0 ES DE 206 Y  EL DEL PREESCALER DE 256
                 'ESO DA UN VALOR DE 12800uSEG OSEA 12.8SEG
                 'ESO MULTIPLICADO POR 78, 12.8 * 78 = 998.4 PARA APROXIMARLO MAS
                 'SE COMPENSO CON UNA PAUSA DE 13uSEG POR CADA MILISEGUNDO
                 
    MILISEGUNDO = MILISEGUNDO + 1

    TMR0 = 206
    INTCON = %10100000
    Resume 'VUELVE DESDE DONDE FUE INTERRUNPIDA
    Enable 'INTERRUMPE DESPUES DE LA CABECERA SEGUN MANUAL PBP 

    END

pero al agregarle el segundo pulsador con su respectivo relay y que haga las mismas funciones que el primero ya no trabaja de la misma manera y se loquea o hace cosas que no le estoy indicando aca les dejo el codigo que trato de implementar espero poder explicarme bien y recibir su ayuda
Código:
TMR0 = 206
OPTION_REG = %10000111 'preescaller 256 
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

FLAG0=0
FLAG1=0
FLAG2=0
i=0

    MAIN:
      IF BOTON0 = 1 THEN 
      GOTO UNOOO
      endif
      IF BOTON1 = 1 THEN 
      GOsub DOS
      endif
    GOTO MAIN   

   UNOOO:  
     IF BOTON0 = 1 THEN   
      WHILE BOTON0 = 1
       I = I + 1
        FOR AUX0 = 0 TO 1000 
         PAUSEUS 10
        NEXT 
       WEND
      goto verifica      
     endif
     
     if LED_0 = 0 then
      goto UNOOO    
     else
      goto temporiza
     endif   
    return

     verifica:
       
       if i => 256 then
        i = 0
       goto UNOOO
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG0 = 5 'PARA UN TIEMPO DE 5 SEG
        toggle LED_0
       I = 0
      ENDIF
     
       IF I <= 150 and i > 50 THEN 
        for AUX0 = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG0 = 10 'PARA UN TIEMPO DE 10 seg
         toggle LED_0
        I = 0
       ENDIF
        
       IF I <= 200 and i > 150 THEN  
        for AUX0 = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG0 = 15 'PARA UN TIEMPO DE 15 seg 
       toggle LED_0
      I = 0
     ENDIF 
   return  
     
   DOS:  
     if BOTON1 = 1 then    
      WHILE BOTON1 = 1
       I = I + 1
        FOR AUX1 = 0 TO 1000 
         PAUSEUS 10
        NEXT
       WEND
     goSUB verifica1      
    endif      
    
     if LED_0 = 0 then
      goto DOS    
     else
      goto temporiza
     endif                
    return
    
     verifica1:
       
       if i => 256 then
        i = 0
       goto DOS
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG0 = 5 'PARA UN TIEMPO DE 5 SEG
        toggle LED_1
       I = 0
      ENDIF
        
       IF I <= 150 and i > 50 THEN 
        for AUX0 = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG0 = 10 'PARA UN TIEMPO DE 10seg
         toggle LED_1
        I = 0
       ENDIF
       
       IF I <= 200 and i > 150 THEN  
        for AUX0 = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG0 = 15 'PARA UN TIEMPO DE 15 seg
       toggle LED_1
      I = 0
     ENDIF   
    return  
     
     temporiza:
     IF MILISEGUNDO => 78 THEN  '
     MILISEGUNDO = 0
     
     
     IF LED_0 = 1 AND TLed1 < FLAG0 THEN
     TLed1 = TLed1 + 1
     ELSE
     TLed1  = 0
     FLAG0  = 0
     LED_0  = 0
     I      = 0
     endif       
     GOTO UNOOO
     
     IF LED_1 = 1 AND TLed2 < FLAG1 THEN
     TLed2 = TLed2 + 1
     ELSE
     TLed2  = 0
     FLAG1  = 0
     LED_1  = 0
     I      = 0
     ENDIF 
     endif       
     GOTO DOS     
     
    Disable
    MI_INTERRUPCION:
    PAUSEUS 13   
                 
    MILISEGUNDO = MILISEGUNDO + 1

    TMR0 = 206
    INTCON = %10100000
    Resume 
    Enable 

    END
la simulacion tambien lo adjunto
 

Adjuntos

  • PULSADOR NUEVO COD.rar
    35.6 KB · Visitas: 74
Hola, amigos foreros,estoy tratando de aprender a programar microcontroladores,pero se me hace un poco dificil ya que en donde vivo no conosco a alguien que sepa de esto,tampoco hay centros de educacion para esto,el caso es que me compre un programador de pic y unos cuantos pic para probar,el caso es que estoy tratando de hacer un contador ascendente y descendente con dos pulsadores, un display de 7 segmentos y un pic 16F84A,en internet encontre lo que necesitaba para hacerlo funcionar, pero uno de 0 a 9 y de hecho funciona,pero quiero que cuente de 0 a 6 y viceversa y que donde va el cero ponga el 1 y donde va el 1 ponga el 0, es decir 1,0,2,3,4,5,6 y viceversa 5,4,3,2,0,1,aqui dejo el esquema y el archivo .asm y el .hex para que alguien me ayude a modificarlo, de antemano muchas gracias.
 

Adjuntos

  • Contador.zip
    102.3 KB · Visitas: 75
Hola amigos.
Hace tiempo vengo siguiendo este hilo y me asalta una duda con respecto al reloj ds1307.
en el siguiente tramo de codigo, como hago para pasarlo a 12horas el reloj
Se supone que debo escribir el bit 6 del registro 2 en 1 sea %01000000, pero se me borra la hora:oops: sera haciendo una and, u or bueno mientras pido ayuda(y)

grabarRTC:

I2CWRITE DPIN,CPIN,%11010000,0,[$00] ;setear 00 segundos
Pause 10 ;retardo para finalizar grabación
I2CWRITE DPIN,CPIN,%11010000,1,[$39] ;setear 39 minutos
Pause 10
I2CWRITE DPIN,CPIN,%11010000,2,[$12] ;setear las 23 horas
Pause 10
I2CWRITE DPIN,CPIN,%11010000,3,[$5] ;setear día lunes ,D=1,L=2
Pause 10 ;M=3 , M=4, J=5, V=6, S=7
I2CWRITE DPIN,CPIN,%11010000,4,[$06] ;setear día 27 del mes
Pause 10
I2CWRITE DPIN,CPIN,%11010000,5,[$8] ;setear mes agosto
Pause 50
I2CWRITE DPIN,CPIN,%11010000,6,[$09] ;setear año 09
Pause 10
I2CWRITE DPIN,CPIN,%11010000,7,[$10] ;control %00010000 para
Pause 10 ;encender el led cada 1 seg.


WRITE 0,1 ;escribe en la memoria 0 el valor de 1 para que no
;se vuelva a grabar otra vez estos datos en el RTC

goto inicio ;ir a presentar los datos en el LCD

end
 
Atrás
Arriba