;7SEGasm

	LIST	p=16F628		;Decimos al ensamblador qué micro estamos usando
	include "P16F628.inc"	;Incluimos las definiciones de nuestro micro
	ERRORLEVEL	0,	-302	;suprime mensajes de "bank selection" al ensamblar
	__config 0x3D18			;configuramos (oscilador, tipo etc.)

	cblock 	0x20 			;Comienzo de los registros de proposito general
							;RAM en el Bank0
		MiNum				;Mi número contador
		count1 				;Usado en la rutina Delay
		counta 				;idem
		countb 				;idem
	endc
	
SEG_PORT Equ	PORTB		;Redefino Puerto donde conecto el Display 7Segmentos
SEG_TRIS Equ	TRISB

	org	0x0000				;org coloca el programa en el origen, 0x0000 para el 16F628,
							;Por aquí es por donde empieza el programa a ejecutarse
	movlw	0x07
	movwf	CMCON			;Deshabilito los comparadores
	bcf		STATUS, IRP
	bcf		STATUS,	RP1
   	bsf 	STATUS,	RP0		;Selecciono el Bank 1 para poder acceder a SEG_TRIS
	movlw	0x00
   	movwf 	SEG_TRIS		;Configuro todo el SEG_PORT para que sea de salida
	bcf		STATUS,	RP1
	bcf		STATUS,	RP0		;Selecciono de nuevo el Bank 0
	clrf	SEG_PORT		;Limpio Display antes de empezar
Inicio
	movlw	0x00			;Inicializo MiContador
	movwf	MiNum

Main
	movfw	MiNum			;Cargo en W Offset actual 
	Call 	Display
	Call 	Del250			;Espero 1/2 segundo
	Call 	Del250				
	incf	MiNum, f		;Incremento MiNumero
	movf	MiNum, w		;Cargo MiNum en W para testearlo y no pasarme de F
	sublw	0x10			;Le resto 10 Hex
	btfss	STATUS, Z		;Si el resultado es cero salto a Inicio
	goto 	Main			;En caso contrario a Main
	goto 	Inicio

Display
	Call LED_Table			; Cargo W con el Pattern a dibujar
	movwf SEG_PORT			; Envío el Pattern al PORT_SEG
    retlw 0x00

LED_Table
	addwf   PCL,f			;Sumo el Offset cargado al Program Counter (Low byte)
							;para saltar al retorno que me interesa 
    retlw   b'00111111'		;0
    retlw   b'00000110'		;1
    retlw   b'01011011'		;2
    retlw   b'01001111'		;3
    retlw   b'01100110'		;4
    retlw   b'01101101'		;5
    retlw   b'01111101'		;6
    retlw   b'00000111'		;7
    retlw   b'01111111'		;8
    retlw   b'01100111'		;9
    retlw   b'01110111'		;A
    retlw   b'01111100'		;B
    retlw   b'00111001'		;C
    retlw   b'01011110'		;D
    retlw   b'01111001'		;E
    retlw   b'01110001'		;F


;** Rutinas de Delay *************************************

Del250  movlw d'250'    ;delay 250 ms
        goto Delay

Delay   movwf count1

d1      movlw 0xC7      ;delay 1mS
        movwf counta
        movlw 0x01
        movwf countb
Delay_0
        decfsz counta, f
        goto $+2
        decfsz countb, f
        goto Delay_0

        decfsz count1 ,f
        goto d1
        retlw 0x00

	END
