;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 propósito general
;RAM en el Bank0
MiNum ;Mi número contador
count1 ;Usado en la rutina Delay
counta ;ídem
countb ;ídem
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