Hola Lord,
Le adicione al codigo el boton para borrar la eeprom, oprimes el pulsador con el circuito apagado y al encenderlo y soltar el pulsador la memoria se pone en cero, que otra forma hay para poder borrar la eprom con el pulsador?.
"Contador de 10,20,30,40 pulsos con señalizacion en
"LCD y leds
"Codigo realizado por:
"MORFEUS - Colombia
"Giovanni Lafebre (LordLafebre) - Cuenca - Ecuador
"-----CONFIGURACION DEL LCD
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
"----DEFINICION DEL VALOR DE OSCILADOR A UTILIZAR
define OSC 4
"---------VARIABLES UTILIZADAS
Cont var byte "VARIABLE PARA EL 1º CONTEO
Cont1 var byte"VARIABLE PARA EL 2º CONTEO
Cont2 var byte "VARIABLE PARA EL 3º CONTEO
Cont4 var byte "VARIABLE PARA EL 4º CONTEO
temp var byte "VARIABLE PARA ALMACENAR DATO EN LA EEPROM Y SABER SI EL
"PROGRAMA SE ESTA EJECUTANDO LA PRIMERA VES
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" ESTE BLOQUE SE ENCARGA DE BORRAR LOS VALORES RETENIDOS EN LA ""
" EEPROM, PARA INICIAR DE NUEVO EL CONTEO EN LAS ENTRADAS SE ""
" OPRIME EL PULSADOR CON EL CIRCUITO APAGADO Y UNA VEZ ENCENDIDO""
" AL SOLTAR EL PULSADOR LA MEMORIA ESTARA EN CER0. ""
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
LED VAR PORTB.6 " LED INDICADOR
borra var PORTB.7 " PULSADOR CONECTADO A GND
low led " LED=OFF
if borra=0 then " SI PULSADOR ES PRESIONADO BORRA LA MEMORIA
write 1,0
write 2,0
write 3,0
write 4,0
high led " LED = ON
pause 1000 "
low led " LED=OFF
endif "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"----CONFIGURACION DEL PUERTO C 4 PRIMEROS BITS COMO ENTRADA LOS 4
"ULTIMOS COMO SALIDA
TRISC=%00001111
"TIEMPO DE ESPERA PARA EL LCD
pause 250
"mensaje para mostrar el estado de los 4 pulsadores
LCDOUT $FE,1,"#01 #02 #03 #04"
LCDOUT $FE,$C0,"000 000 000 000"
"se asigna 0 a la primera posicion de la eeprom(0) sirve para indicar que nunca
"se ha ejecutado este programa
eeprom 0,[0]
"carga el valor de la eeprom de la direccion 0 en la variable temp
read 0,temp
"si el programa nunca ha sido ejecutado salta a la subrutina grabar
if temp=0 then grabar
"lee los estados de la posicion de memoria para saber los valores
"de los contadores
read 1,cont
read 2,cont1
read 3,cont2
read 4,Cont4
"muestra en el lcd los valores de las variables
lcdout $FE,$C0,dec3 cont
lcdout $FE,$C4,dec3 cont1
lcdout $FE,$C8,dec3 cont2
lcdout $FE,$CC,dec3 Cont4
"condicional para saber si ha contado 10 veces
if cont >= 10 then
gosub EncenderLED
endif
"condicional para saber si ha contado 20 veces
if cont1 >= 20 then
gosub EncenderLED1
endif
"condicional para saber si ha contado 30 veces
if cont2 >= 30 then
gosub EncenderLED2
endif
"condicional para saber si ha contado 40 veces
if Cont4 >= 40 then
gosub EncenderLED3
endif
"si estas condiciones se cumplen salta a cada subrutina descrita
"programa principal
loop:
"todos los siguientes condicionales funcionan de la misma manera
"pero con diferentes pines y variables, pero el concepto es el mismo
"--------------------------------------------------------------------
"si el pulsante en C0 ha sido presionado
if PORTC.0=0 then
"incrementa al contador en 1
cont=cont+1
"almacema en la posicion de memoria el valor actual de cont
write 1,cont
"si cont iguala o supera a 10(que indicaria que el conteo se ha cumplido)
"entonces salta a la subrrutina que enciende el led para mostrar que el
"conteo se ha cumplido
if cont >= 10 then
gosub EncenderLED
endif
"muestra en el display el valor actual de cont, permitiendo ver el conteo
"exacto, es decir el numero de veces que se a pulsado el boton
lcdout $FE,$C0,dec3 cont
"tiempo de antirrebote de tecla, para que el conteo no se haga de una manera
"muy rapida
pause 200
endif
"--------------------------------------------------------------------
"todos los demas condicionales hacen la misma funcion
"--------------------------------------------------------------------
if PORTC.1=0 then
cont1=cont1+1
write 2,cont1
if cont1 >= 20 then
gosub EncenderLED1
endif
lcdout $FE,$C4,dec3 cont1
pause 200
endif
if PORTC.2=0 then
cont2=cont2+1
write 3,cont2
if cont2 >= 30 then
gosub EncenderLED2
endif
lcdout $FE,$C8,dec3 cont2
pause 200
endif
if PORTC.3=0 then
Cont4=Cont4+1
write 4,Cont4
if Cont4 >= 40 then
gosub EncenderLED3
endif
lcdout $FE,$CC,dec3 Cont4
pause 200
endif
goto loop
"-------------------------------------------------------
"subrutina para asignar el valor inicial a la eeprom(en este caso se
"inicia desde 0)
grabar:
"enceramos todos los contadores
cont=0:cont1=0:cont2=0:Cont4=0
write 0,1
write 1,0
write 2,0
write 3,0
write 4,0
goto loop
"estas subrrutinas son para encender los leds y dejarlos encendidos en caso
"de que el conteo ha llegado a su final para cada caso
"asi mismo se asigna el valor maximo de conteo por ejemplo 10 para que en los
"condicionales donde se pregunta if cont1 >= 10 then salten a la subrutina
"adecuada y mantenga encendido el led
EncenderLED:
high PORTC.7
cont=10
lcdout $FE,$C0,dec3 cont
return
EncenderLED1:
high PORTC.6
cont1=20
lcdout $FE,$C4,dec3 cont1
return
EncenderLED2:
high PORTC.5
cont2=30
lcdout $FE,$C8,dec3 cont2
return
EncenderLED3:
high PORTC.4
Cont4=40
lcdout $FE,$CC,dec3 cont4
return
end
Que opinas tu?
Saludos
morfeus