;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