;Barledasm

	LIST	p=16F628		;Decimos al ensamblador qué micro estamos usando
	include "P16F628.inc"	;Incluimos las definiciones de nuestro micro
	__config 0x3D18			;configuramos (oscilador, tipo etc.)

	cblock 	0x20 			;Comienzo de los registros de proposito general
							;RAM en el Bank0
		count1 				;Usado en la rutina Delay
		counta 				;idem
		countb 				;idem
	endc
	
	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 TRISA y TRISB
	movlw	0x00
   	movwf 	TRISB			;Configuro todo el PortB para que sea de salida
	movlw	b'00000001'
   	movwf 	TRISA			;Configuro el bit 0 de PortA para que sea de entrada
	bcf		STATUS,	RP1
	bcf		STATUS,	RP0		;Selecciono de nuevo el Bank 0
	Call	WshBarled		;Pongo a cero todo el PortB

Loop
	btfss	PORTA, 0		;Salta si el bit 0 de PortA es '1'	
	Call	Up
	btfsc	PORTA, 0		;Salta si el bit 0 de PortA es '0'	 
	Call	Down
	goto	Loop			;Salto al comienzo y así hasta el infinito

Up
	Call	Pb0				;Poner a '1' el Bit 0 de PortB el resto a '0'
	Call	Pb1				;Poner a '1' el Bit 1 de PortB el resto a '0'
	Call	Pb2				;Poner a '1' el Bit 2 de PortB el resto a '0'
	Call	Pb3				;Poner a '1' el Bit 3 de PortB el resto a '0'
	Call	Pb4				;Poner a '1' el Bit 4 de PortB el resto a '0'
	Call	Pb5				;Poner a '1' el Bit 5 de PortB el resto a '0'
	Call	Pb6				;Poner a '1' el Bit 6 de PortB el resto a '0'
	Call	Pb7				;Poner a '1' el Bit 7 de PortB el resto a '0'
	retlw 	0x00

Down
	Call	Pb7				;Poner a '1' el Bit 7 de PortB el resto a '0'
	Call	Pb6				;Poner a '1' el Bit 6 de PortB el resto a '0'
	Call	Pb5				;Poner a '1' el Bit 5 de PortB el resto a '0'
	Call	Pb4				;Poner a '1' el Bit 4 de PortB el resto a '0'
	Call	Pb3				;Poner a '1' el Bit 3 de PortB el resto a '0'
	Call	Pb2				;Poner a '1' el Bit 2 de PortB el resto a '0'
	Call	Pb1				;Poner a '1' el Bit 1 de PortB el resto a '0'
	Call	Pb0				;Poner a '1' el Bit 0 de PortB el resto a '0'
	retlw 	0x00

Pb0
	movlw	b'00000001'		;Pongo a '1' el bit 0 de PortB
	call	SendPB			;Manda al Port B, espera, limpia, espera y vuelve
	retlw 	0x00

Pb1
	movlw	b'00000010'		;Pongo a '1' el bit 1 de PortB
	call	SendPB			;Manda al Port B, espera, limpia, espera y vuelve
	retlw 	0x00

Pb2
	movlw	b'00000100'		;Pongo a '1' el bit 2 de PortB
	call	SendPB			;Manda al Port B, espera, limpia, espera y vuelve
	retlw 	0x00

Pb3
	movlw	b'00001000'		;Pongo a '1' el bit 3 de PortB
	call	SendPB			;Manda al Port B, espera, limpia, espera y vuelve
	retlw 	0x00

Pb4
	movlw	b'00010000'		;Pongo a '1' el bit 4 de PortB
	call	SendPB			;Manda al Port B, espera, limpia, espera y vuelve
	retlw 	0x00

Pb5
	movlw	b'00100000'		;Pongo a '1' el bit 5 de PortB
	call	SendPB			;Manda al Port B, espera, limpia, espera y vuelve
	retlw 	0x00

Pb6
	movlw	b'01000000'		;Pongo a '1' el bit 6 de PortB
	call	SendPB			;Manda al Port B, espera, limpia, espera y vuelve
	retlw 	0x00

Pb7
	movlw	b'10000000'		;Pongo a '1' el bit 7 de PortB
	call	SendPB			;Manda al Port B, espera, limpia, espera y vuelve
	retlw 	0x00

SendPB
	movwf	PORTB			;Mando el contenido de W al PortB
	call	Delay			;Llamo a la rutina que espera ...
	call 	WshBarled		;Llamo a la rutina que pone a cero PortB
	call	Delay			;Llamo de nuevo a la rutina que espera ...
	retlw 	0x00

WshBarled
	movlw	b'00000000'		;Pongo a '0' todos los bits de PortB
	movwf	PORTB
	retlw 	0x00

Delay
	movlw	d'250'			;Espero 250 ms (Para un reloj de 4 MHz)
	movwf	count1
d1	movlw	0xC7
	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      
