de antemano gracias por ser tan pacientes y dar unas manos , tal ves esto que voy a proponer sea una estupides para la mayoria de aqui , pero como creo la mayoria en sus primeros pasos , trato de comprender un poco el idioma y la mejor manera ademas de leer mucho es hacer un poco de osada experiencia .
Bueno , llendo al grano mi dilema es que tengo un contador que arme , es el de pablin , el contador simple , y arme el programador con el cual programe el pic , el contador funciona bien , pero para el uso que necesito darle , tendria que modificar el tema que cuando mantengo precionado el boton de contar , comienza a sumar rapidamente y lo que tendria que modificar seria, o hacer que este tiempo sea mayor o en todo caso eliminar esta funcion , ya que el accionamiento del red swich tiene una pasada lenta y en algunos casos me suma dos o tres digitos de una ves. Estoy leyendo mucho sobre asembler y me doy algunos golpes , como con que poder editar(modificar y que ? ) del archivo .asm original y poder pasarlo a .hex o cuales serian los pasos a seguir para anular o modicar esta funcion , ej. que linea tocar y demas , perdon de nuevo por mi poco conocimiento , pero le estoy poniendo garra al tema y se que con ayuda , tiempo y dedicacion podre hacerlo. tratare a continuacion poner el .asm original y les agredeceria como hacer para pasarlo correctamente a hex .Como programador uso el de pablin y el icprog 1.05a muchas gracias..
;Contador de 4 digitos.
indo equ 00h ;registro de indireccion
pc equ 02h ;contador de programa
status equ 03h ;registro de estado
fsr equ 04h ;registro de seleccion
ptoa equ 05h ;puerto a
ptob equ 06h ;puerto b
rota equ 0fh ;variable para desplazamiento de display
trisa equ 85h ;configuracion puerto a
trisb equ 86h ;configuracion puerto b
dig1 equ 10h ;acumulador miles
dig2 equ 11h ;acumulador centenas
dig3 equ 12h ;acumulador decenas
dig4 equ 13h ;acumulador unidades
loops equ 1dh ;variables usadas en retardos
loops2 equ 1eh
z equ 02h ;flag de cero
ram equ 05h ;bit de seleccion de pagina de memoria
c equ 00h ;flag de acarreo
w equ 00h ;bit de destino a variable de trabajo
reset org 00
goto inicio
org 05h
retardo ;subrutina de retardo
movwf loops ;la variable de trabajo contiene la cant.
top2 movlw d"110" ;de ms a demorar
movwf loops2
top nop
nop
nop
nop
nop
nop
decfsz loops2 ;controla si termina 1mS
goto top
decfsz loops ;controla si termina el retardo completo
goto top2
retlw 0
s1000 ;rutina de incremento x 1000
clrf dig2 ;pone a cero las centenas
incf dig1 ;incrementa el contador de miles
movf dig1, w ;carga en work el conteo de los miles
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
clrf dig1 ;inicializa los miles
return
s100 ;rutina de incremento x 100
clrf dig3 ;pone a cero las decenas
incf dig2 ;incrementa el contador de centenas
movf dig2, w ;carga en work el conteo de las centenas
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s1000 ;incrementa los miles
return
s10 ;rutina de incremento x 10
clrf dig4 ;pone a cero las unidades
incf dig3 ;incrementa el contador de decenas
movf dig3, w ;carga en work el conteo de las decenas
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s100 ;incrementa las centenas
return
subir ;rutina de incremento
incf dig4 ;incrementa el contador de unidades
movf dig4, w ;carga en work el conteo de las unidades
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s10 ;incrementa las decenas
movlw d"250" ;retardo de 100ms
call retardo
return
tabla ;genera los numeros sobre el display
addwf pc ;agrega al cont. programa el valor de work
retlw b"00111111" ;genera el 0
retlw b"00011000" ;genera el 1
retlw b"01110110" ;genera el 2
retlw b"01111100" ;genera el 3
retlw b"01011001" ;genera el 4
retlw b"01101101" ;genera el 5
retlw b"01101111" ;genera el 6
retlw b"00111000" ;genera el 7
retlw b"01111111" ;genera el 8
retlw b"01111101" ;genera el 9
inicio ;programa principal
bsf status, ram ;selecciona el banco de memoria alto
movlw b"00010000" ;configura el puerto a
movwf trisa ;bit 4 entrada, demas bits salidas.
movlw 00h ;configura el puerto b
movwf trisb ;como salidas
bcf status, ram ;selecciona el banco de memoria bajo
clrf dig1 ;inicializa acumuladores
clrf dig2
clrf dig3
clrf dig4
movlw 00 ;envia ceros a los transistores para apagar
movwf ptoa ;todos los displays
empe btfss ptoa, 4 ;chequea el pulsador
call subir ;llama la rutina de incremento
movlw 08h ;iniciar un 1 en el registro de rotacion
movwf rota
movlw dig1 ;con el registro selector (fsr) se apunta
movwf fsr ;al primer dato que se va a mostrar
disp movlw 00h ;colocar en cero el dato del display
movwf ptob ;para apagarlos
movf rota, w ;pasa rotacion del 1 a la variable work
movwf ptoa ;enciende el transistor (display)
movf indo, w ;lee el dato del registro apuntado por fsr
call tabla ;genera el digito de 7 segmentos
movwf ptob ;envia el digito al puerto b
movlw 03h ;retardo de 3ms para visualizacion
call retardo
btfsc rota, 0 ;controla si terminaron las cuatro rotaciones
goto empe ;si termino, vuelve desde el comienzo
bcf status, c ;carry en cero para no afectar las rotaciones
rrf rota ;desplaza el 1 que enciende los displays
incf fsr ;incrementa el puntero. Apunta el proximo
goto disp ;digito a mostrar
end