HomeArticlesProjectsBlogContact
Articles
LEGO Chaser
Colin Mitchell
Colin Mitchell
May 11, 2010
Make sure to subscribe to our newsletter and be the first to know the news.

Buy Lego Chaser kit

  • PIC Programmer MkV

  • Instruction Set for PIC12F629

  • PIC12F629

  • PIC16F628 PDF Data Sheet

  • BlankF629.asm

  • PIC12F629.inc

See more projects using micros:

This project is constructed with surface-mount components and is small enough to be included in all types of models. It is about the size of a Lego block and that’s why we have called it LEGO CHASER.
This circuit uses a PIC12F629 microcontroller chip. This 8-pin chip produces 7 different animations on a 10 LED display. The animations are selected by the position of a 100k pot and when the animation is showing, the pot can be adjusted to increase the speed of the animation.
“Position 10” on the pot cycles through the 7 animations.


A kit of components (matrix board for the chip plus a short strip of blank PC board for the LEDs), surface-mount resistors, capacitors, transistor, diode, switch, cells, battery holder, pot and 20 yellow LEDs with programmed PIC12F629 chip is available for $15.00 plus $5.00 postage. Click the link above and you will be sent an email with the costs. This is an ideal project you get you into surface-mount technology and you can add it to a model layout or build it into a Lego brick for a junior member.

Wiring the two ten-LED displays

DisplayFront 1

DisplayTop 1
The project has two 10-LED displays. One on the front and one on the back. You can use only one display if required.


Two of the 7 animations

Here are the files:

 ;****************************************************************
;Started 10-1-2010      Lego Chaser 12F629.asm
;Two displays of 10 LEDs in a "LEGO BLOCK"
;100k pot serves two purposes.  Chip detects position of pot (1-10)
;when switched on. Pot adjusts speed of scan for each routine
;****************************************************************

    list      p=12F629
    radix     dec
    include "p12f629.inc"

    errorlevel  -302    ; Don't complain about BANK 1
    errorlevel  -301

    __CONFIG    _MCLRE_OFF & _CP_OFF
              & _WDT_OFF & _INTRC_OSC_NOCLKOUT  ;Internal osc.



;****************************************************************
; variables - names files and bit equates
;****************************************************************


        ;Files for 12F629 start at 20h


    ; globals
loops   equ     20h ;used in "Al-TO" and "All" subroutines
tempA   equ     21h ;used in _XmS delay
tempB   equ     22h ;used in Fire sub-routine
tempC   equ     23h ;used in Fire sub-routine
tempD   equ     24h ;used in Hole sub-routine
tempE   equ   25h   ;used in Hole sub-routine
tempF   equ   26h   ;used in Hole sub-routine
tempG   equ   27h
tempH   equ   28h
fetch   equ   29h   ;used in Join sub-routine



fileA   equ 2Ah     ;used for Show3_8 and hole
fileB   equ 2Bh ;pot
fileC   equ 2Ch ;pot
fileD   equ 2Dh

DelA    equ 2Eh ;used for delay sub-routines
DelB    equ 2Fh ;used for delay sub-routines
DelC    equ 3Ah ;used for delay sub-routines

temp        equ 3Bh ;used for Join sub-routine
temp1_5   equ   3Ch ;used for Join sub-routine
temp6_10  equ   3Dh ;used for Join sub-routine

filezz    equ   5Fh ;last available file

status        equ   03h
option_reg  equ     81h


    ; bits on GPIO

pin7        equ 0   ;GP0
pin6        equ 1   ;GP1
pin5        equ 2   ;GP2 and T0CkI
pin4        equ 3   ;GP3 input only
pin3        equ 4   ;GP4
pin2        equ 5   ;GP5


    ;bits

rp0     equ 5   ;bit 5 of the status register



;****************************************************************
;Beginning of program
;****************************************************************


Start   org   0x00          ;program starts at location 000

SetUp   bsf   status,rp0    ;Bank 1
      movlw b'10000110' ;Turn off T0CKI, prescaler for TMR0=1:128
      movwf option_reg
      bcf     status,rp0    ;bank 0
      movlw 07h         ;Set up W to turn off Comparator ports
      movwf CMCON       ;must be placed in bank 0
      movlw 03fh
      movwf temp1_5    ;to turn off LEDs 1,2,3,4,5 at start
      movwf temp6_10   ;to turn off LEDs 6,7,8,9,10 at start
      clrf  GPIO       ;Clear GPIO of junk
      goto  Main


;*************************************
;* Tables                   *
;*************************************


Table1  addwf   02,1  ;Add W to the Program Counter to create a jump
              ;No LEDs on bit 7 is 0 & file cannot be 0ffh
            ;When bit7=1 delay for LEDs 1,2,3,4,5 is skipped
        retlw   b'01111111' ;outputs LEDs 5,6,7,8,9,10 OFF
        retlw   b'00111110' ;LED1 on   bit 6=0 = LEDs 1,2,3,4,5,
                ;    bit 6 = 1 = LEDs 6,7,8,9,10
    retlw   b'00111101'   ;LED2 on
    retlw   b'00111011'   ;LED3 on
    retlw   b'00101111'   ;LED4 on
    retlw   b'00011111'   ;LED5 on
    retlw   b'10111111'   ;LED5 off
    retlw   b'01111110'   ;LED6 on
    retlw   b'01111101'   ;LED7 on
    retlw   b'01111011'   ;LED8 on
    retlw   b'01101111'   ;LED9 on
    retlw   b'01011111'   ;LED10 on
    retlw   b'00111110'   ;LED1 on
    retlw   b'00111101'   ;LED2 on
    retlw   b'00111011'   ;LED3 on
    retlw   b'00101111'   ;LED4 on
    retlw   b'00011111'   ;LED5 on
    retlw   b'10111111'   ;LED5 off
    retlw   b'01011110'   ;LED6&10 on
    retlw   b'01011101'   ;LED7&10 on
    retlw   b'01011011'   ;LED8&10 on
    retlw   b'01001111'   ;LED9&10 on
    retlw   b'00111110'   ;LED1 on
    retlw   b'00111101'   ;LED2 on
    retlw   b'00111011'   ;LED3 on
    retlw   b'00101111'   ;LED4 on
    retlw   b'00011111'   ;LED5 on
    retlw   b'10111111'   ;LED5 off
    retlw   b'01001110'   ;LED6,9,10 on
    retlw   b'01001101'   ;LED7,9,10 on
    retlw   b'01001011'   ;LED8,9,10 on
    retlw   b'00111110'   ;LED1 on
    retlw   b'00111101'   ;LED2 on
    retlw   b'00111011'   ;LED3 on
    retlw   b'00101111'   ;LED4 on
    retlw   b'00011111'   ;LED5 on
    retlw   b'10111111'   ;LED5 off
    retlw   b'01001010'   ;LED6,8,9,10 on
    retlw   b'01001001'   ;LED7,8,9,10 on
    retlw   b'00111110'   ;LED1 on
    retlw   b'00111101'   ;LED2 on
    retlw   b'00111011'   ;LED3 on
    retlw   b'00101111'     ;LED4 on
    retlw   b'00011111'     ;LED5 on
    retlw   b'10111111'     ;LED5 off
    retlw   b'01001000'     ;LED6,7,8,9,10 on
    retlw   b'00111110'     ;LED1 on
    retlw   b'00111101'     ;LED2 on
    retlw   b'00111011'     ;LED3 on
    retlw   b'00101111'     ;LED4 on
    retlw   b'00011111'     ;LED5 on
    retlw   b'00011110'     ;LED1,5 on
    retlw   b'00011101'     ;LED2,5 on
    retlw   b'00011011'     ;LED3,5 on
    retlw   b'00001111'     ;LED4,5 on
    retlw   b'00001110'     ;LED1,4,5 on
    retlw   b'00001101'     ;LED2,4,5 on
    retlw   b'00001011'     ;LED3,4,5 on
    retlw   b'00001010'     ;LED1,3,4,5 on
    retlw   b'00001001'     ;LED2,3,4,5 on
    retlw   b'00001000'     ;LED1,2,3,4,5 on
    retlw   b'11111111'
    retlw b'11111111'

Table2  addwf   02,1    ;Add W to the Program Counter to create a jump
    retlw   b'00001000' ;all LEDs on bit 6=0 = LEDs 1,2,3,4,5,
    retlw b'01001000'   ;bit 6 = 1 = LEDs 6,7,8,9,10
    retlw   b'00001001' ;LED1 off
    retlw   b'00001010' ;LED2 off
    retlw   b'00001100' ;LED3 off
    retlw   b'00011000' ;LED4 off
    retlw   b'00101000' ;LED5 off
    retlw   b'00001000' ;all on
    retlw b'01001001'   ;LED6 off
    retlw b'01001010'   ;LED7 off
    retlw b'01001100'   ;LED8 off
    retlw b'01011000'   ;LED9 off
    retlw b'01101000'   ;LED10 off
    retlw b'01011000'   ;LED9 off
    retlw b'01001100'   ;LED8 off
    retlw b'01001010'   ;LED7 off
    retlw b'01001001'   ;LED6 off
    retlw   b'00101000' ;LED 5 off
    retlw b'01001000'   ;all on
    retlw   b'00011000' ;LED 4 off
    retlw   b'00001100' ;LED 3 off
    retlw   b'00001010' ;LED2 off
    retlw   b'11111111'
    retlw b'11111111'




;*************************************
;* Delays                   *
;*************************************


    ;Delay 1-10mS

_5mS    movf      fileB,w      ;get value of pot to create delay-value
      movwf     DelB
      nop
      decfsz    DelA,1
      goto    $-2
      decfsz    DelB,1
      goto    $-4
      retlw     00


        ;Delay 0.05 sec (50mS)

_XmS    movf      tempA,0       ;value from pot position
      movwf   DelB        ;value for DelB from pot position
      decfsz    DelA,1
      goto    $-1
      decfsz    DelB,1
      goto    $-3
      retlw   00


    ;Delay 0.15 sec (150mS)

_150mS  decfsz  DelA,1
        goto      $-1
        decfsz  DelB,1
        goto      $-3
        retlw     00

    ;Delay 0.2 sec (200mS)

_200mS  nop
        decfsz  DelA,1
        goto      $-2
        decfsz  DelB,1
        goto      $-4
        retlw     00



;************************************
;* Sub routines         *
;************************************

    ;All the routines 1-10
    ;Routine10 displays all routines 1-9 three times then repeats

All call    Pot         ;get value of pot in fileB 1-10
    swapf   fileB,0     ;swap nibbles = x8 and put in w
    movwf   tempA

    movlw   03
    movwf   loops
    call    Show1         ;ScanLRL routine
    call    Show2
    call    Show3
    call    Show4
    call    Show5
    call    Show6
    call    Show7
    call    Show8
    call    Show9
    call    Show10
    call    Show9
    call    Show8
    call    Show7
    call    Show6
    call    Show5
    call    Show4
    call    Show3
    call    Show2
    decfsz  loops,1
    goto    $-19



    call    Pot           ;fileB will hold a value 1-10
    swapf   fileB,0       ;swap nibbles = x8 and put in w
    movwf   tempA

    movlw   03
    movwf   loops
    call    Show1_2       ;Scan2 routine
    call    Show2_3
    call    Show3_4
    call    Show4_5
    call    Show6_7
    call    Show7_8
    call    Show8_9
    call    Show9_10
    call    Show8_9
    call    Show7_8
    call    Show6_7
    call    Show4_5
    call    Show3_4
    call    Show2_3
    decfsz  loops,1
    goto    $-15

    movlw   03
    movwf   loops
    call    Show1_10        ;Bump routine
    call    Show2_9
    call    Show3_8
    call    Show4_7
    call    Show5_6
    call    Show5_6
    call    Show5_6
    call    Show4_7
    call    Show3_8
    call    Show2_9
    decfsz  loops,1
    goto    $-11


    movlw   03
    movwf   loops
    call    Show1_10        ;Cross-over routine
    call    Show2_9
    call    Show3_8
    call    Show4_7
    call    Show5_6
    call    Show4_7
    call    Show3_8
    call    Show2_9
    decfsz  loops,1
    goto    $-9

    call    Pot             ;fileB will hold a value 1-10
    swapf   fileB,0         ;swap nibbles = x8 and put in w
    movwf   tempA

    movlw   05      ;Fire routine
    movwf   tempC
    movlw   05
    movwf   tempB
    bsf   status, rp0   ;Bank 1
    movlw   b'11111000'   ;Set GP0,1,2 as output
    movwf   TRISIO
    bcf   status, rp0     ;bank 0
    movlw   b'00000000'   ;make GP0,1,2 low
    movwf   GPIO              ;turn on LEDs1,2,3
    call    _XmS

      bsf     status, rp0   ;Bank 1
    movlw   b'11111111'     ;Set GP0,1,2 as input
    movwf   TRISIO        ;
    bcf   status, rp0     ;bank 0
    movlw   b'00000000'   ;make GP0,1,2 low
    movwf   GPIO              ;turn off LEDs1,2,3
    call    _XmS
    decfsz  tempB,1
    goto    $-15

    movlw   05
    movwf   tempB
    bsf   status, rp0   ;Bank 1
    movlw   b'11001011'   ;Set GP2,4,5 as output
    movwf   TRISIO        ;
    bcf   status, rp0     ;bank 0
    movlw   b'00110100'   ;make GP2,4,5 high
    movwf   GPIO              ;turn on LEDs8,9,10
    call    _XmS

    bsf   status, rp0   ;Bank 1
    movlw   b'11111111'   ;Set GP0,1,2 as input
    movwf   TRISIO        ;
    bcf   status, rp0     ;bank 0
    movlw   b'00000000'   ;make GP0,1,2 low
    movwf   GPIO              ;turn off LEDs8,9,10
    call    _XmS
    decfsz  tempB,1
    goto    $-15
    decfsz  tempC,1
    goto    $-37

    movlw     05
    movwf     tempB
    call      Show1
    call      Show2
    call      Show3
    call      Show4
    call      Show5
    call      Show6
    call      Show7
    call      Show8
    call      Show9
    call      Show10
    call      Show9
    call      Show8
    call      Show7
    call      Show6
    call      Show5
    call      Show4
    call      Show3
    call      Show2
    decfsz  tempB,1
    goto      $-19

    call      Pot           ;fileB will hold a value 1-10
    swapf     fileB,0       ;swap nibbles = x8 and put in w
    movwf     tempA

    movlw     03            ;Hole routine
    movwf     loops
    call      Hole
    decfsz  loops,1
    goto      $-2


    movlw     03            ;Join routine
    movwf     loops
    call      Join
    decfsz  loops,1
    goto      $-2


    goto    All


    ;At Turn-On, project will detect pot position
  ;and flash LED 1-10 three times


At_TO   movlw   03
      movwf loops
      call  Pot           ;fileB will hold a value 1-10
      call  PotValue    ;PotValue will display LED 1-10 for 50mS
      call  _150mS
      bsf     status, rp0 ;Bank 1
      movlw b'11111111' ;Set all GPIO as input
      movwf TRISIO      ;turn off all LEDs
      bcf     status, rp0   ;bank 0
      call  _150mS
      decfsz    loops,1
      goto  $-9
      retlw 00

    ;LEDs bump in middle

Bump    call    Show1_10
      call  Show2_9
      call  Show3_8
      call  Show4_7
      call  Show5_6
      call  Show5_6
      call  Show5_6
      call  Show4_7
      call  Show3_8
      call  Show2_9
      goto  Routine3



    ;Fire 3 left, 3 right, scan back/forth

Fire    movlw   05
      movwf tempC
      movlw 05
      movwf tempB
      bsf     status, rp0       ;Bank 1
            movlw   b'11111000' ;Set GP0,1,2 as output
      movwf TRISIO
      bcf     status, rp0         ;bank 0
      movlw b'00000000'       ;make GP0,1,2 low
      movwf GPIO                  ;turn on LEDs1,2,3
      call  _XmS

      bsf     status, rp0       ;Bank 1
      movlw b'11111111'       ;Set GP0,1,2 as input
      movwf TRISIO            ;
      bcf     status, rp0         ;bank 0
      movlw b'00000000'       ;make GP0,1,2 low
      movwf GPIO                  ;turn off LEDs1,2,3
      call  _XmS
      decfsz    tempB,1
      goto  $-15

      movlw 05
      movwf tempB
      bsf     status, rp0       ;Bank 1
      movlw b'11001011'       ;Set GP2,4,5 as output
      movwf TRISIO            ;
      bcf     status, rp0         ;bank 0
      movlw b'00110100'       ;make GP2,4,5 high
      movwf GPIO                  ;turn on LEDs8,9,10
      call  _XmS

      bsf   status, rp0           ;Bank 1
      movlw b'11111111'       ;Set GP0,1,2 as input
      movwf TRISIO            ;
      bcf   status, rp0         ;bank 0
      movlw b'00000000'       ;make GP0,1,2 low
      movwf GPIO                  ;turn off LEDs8,9,10
      call  _XmS
      decfsz    tempB,1
      goto  $-15
      decfsz    tempC,1
      goto  $-37

      movlw 05
      movwf tempB
      call  Show1
      call  Show2
      call  Show3
      call  Show4
      call  Show5
      call  Show6
      call  Show7
      call  Show8
      call  Show9
      call  Show10
      call  Show9
      call  Show8
      call  Show7
      call  Show6
      call  Show5
      call  Show4
      call  Show3
      call  Show2
      decfsz    tempB,1
      goto  $-19
      retlw 00



    ;Get Routine

GetRoutine
      decfsz    fileB,1
      goto    $+2
      goto    Routine1
      decfsz    fileB,1
      goto    $+2
      goto    Routine2
      decfsz    fileB,1
      goto    $+2
      goto    Routine3
      decfsz    fileB,1
      goto    $+2
      goto    Routine4
      decfsz    fileB,1
      goto    $+2
      goto    Routine5
      decfsz    fileB,1
      goto    $+2
      goto    Routine6
      decfsz    fileB,1
      goto    $+2
      goto    Routine7
      decfsz    fileB,1
      goto    $+2
      goto    Routine8
      decfsz    fileB,1
      goto    $+2
      goto    Routine9
      decfsz    fileB,1
      goto    $+2
      goto    Routine10
      retlw   00              ;no value to be shown


    ;Hole All LEDs are illuminated and a hole runs RLR



Hole    clrf    fetch       ;used to fetch down the table
      movlw 05h       ;a
      movwf fileA       ;5 loops for multiplexing
      movf  fetch,w     ;_b
      call  Table2    ;bit6=0=LEDs 1,2,3,4,5
      movwf temp        ;is bit 6=0?
      btfsc temp,6
      goto  $+2
      movwf temp1_5   ;temp storage
      movf  temp1_5,w   ;reclaim previous value
      bsf   status, rp0 ;Bank 1
      movwf TRISIO      ;Set GPIO's as in/out
      bcf   status, rp0 ;bank 0
      clrf  GPIO          ;turn on LEDs 1,2,3,4,5
      btfsc temp,7      ;when bit7=1  delay is skipped
      goto  $+.17
      call  _5mS            ;
      movf  fetch,w
      call  Table2
      movwf temp          ;is bit 6=1?
      btfss temp,6
      goto  $+2
      movwf temp6_10    ;temp storage
      movf  temp6_10,w;reclaim previous value
      bsf   status, rp0 ;Bank 1
      movwf TRISIO      ;Set GPIO's as in/out
      bcf   status, rp0 ;bank 0
      movlw 0ffh
      movwf GPIO          ;turn on LEDs 6,7,8,9,10
      call  _5mS
      decfsz    fileA,1
      goto  $-.28         ;_b
      incf  fetch,1
      movf  temp,0
      xorlw 0ffh
      btfsc status,z
      retlw 00
      goto  $-.36         ;_a



    ;Join LEDS run across screen and join at right hand side


Join    clrf    fetch       ;used to fetch down the table
      movlw 05h ;_a
      movwf fileA       ;5 loops for multiplexing
      movf  fetch,w   ;_b
      call  Table1      ;bit6=0=LEDs 1,2,3,4,5
      movwf temp          ;is bit 6=0?
      btfsc temp,6
      goto  $+2
      movwf temp1_5     ;temp storage
      movf  temp1_5,w   ;reclaim previous value
      bsf     status, rp0 ;Bank 1
      movwf TRISIO      ;Set GPIO's as in/out
      bcf     status, rp0   ;bank 0
      clrf  GPIO          ;turn on LEDs 1,2,3,4,5
      btfsc temp,7      ;when bit7=1  delay is skipped
      goto  $+.17
      call  _5mS
      movf  fetch,w
      call  Table1
      movwf temp          ;is bit 6=1?
      btfss temp,6
      goto  $+2
      movwf temp6_10    ;temp storage
      movf  temp6_10,w  ;reclaim previous value
      bsf     status, rp0 ;Bank 1
      movwf TRISIO      ;Set GPIO's as in/out
      bcf     status, rp0   ;bank 0
      movlw 0ffh
      movwf GPIO          ;turn on LEDs 6,7,8,9,10
      call  _5mS
      decfsz    fileA,1
      goto  $-.28         ;_b
      incf  fetch,1
      movf  temp,0
      xorlw 0ffh
      btfsc status,z
      retlw 00
      goto  $-.36         ;_a



    ;Detects position of 100k pot - produces a result 1-10
    ;for routines or speed of scanning


Pot   clrf  fileB         ;create value for 1-5 routines
      incf  fileB,1     ;to enable 1 on display
      bsf     status, rp0 ;Bank 1
            movlw   b'11101111' ;Set GP4 as output
      movwf TRISIO    ;
      bcf     status, rp0   ;bank 0
      movlw b'00010000' ;make GP4 high
      movwf GPIO          ;to discharge 100n


      movlw 38h         ;short delay
      movwf DelA
      nop
      decfsz    DelA,1
      goto  $-2

      movlw b'00000000' ;make GP4 low
      movwf GPIO            ;

      bsf   status, rp0 ;Bank 1
            movlw   b'11111111' ;Set GP3,4 as input
      movwf TRISIO    ;
      bcf   status, rp0 ;bank 0

      btfsc GPIO,3      ;see if 100n has charged
      goto  $+3
      incf  fileB,1     ;incr loops
      goto  $-.14

      retlw 00          ;fileB will hold a value 1-10




    ;Show pot value on display, 1-10

PotValue  decfsz    fileB,1
          goto    $+2
          goto    show1
          decfsz    fileB,1
          goto    $+2
          goto    show2
          decfsz    fileB,1
          goto    $+2
          goto    show3
          decfsz    fileB,1
          goto    $+2
          goto    show4
          decfsz    fileB,1
          goto    $+2
          goto    show5
          decfsz    fileB,1
          goto    $+2
          goto    show6
          decfsz    fileB,1
          goto    $+2
          goto    show7
          decfsz    fileB,1
          goto    $+2
          goto    show8
          decfsz    fileB,1
          goto    $+2
          goto    show9
          decfsz    fileB,1
          goto    $+2
          goto    show10
          retlw   00        ;no value to be shown




    ;Scan back/forth


ScanLRL call    Show1
        call    Show2
        call    Show3
        call    Show4
        call    Show5
        call    Show6
        call    Show7
        call    Show8
        call    Show9
        call    Show10
        call    Show9
        call    Show8
        call    Show7
        call    Show6
        call    Show5
        call    Show4
        call    Show3
        call    Show2
        goto    Routine1


    ;Scan back/forth 2 LEDs


Scan2   call    Show1_2
      call  Show2_3
      call  Show3_4
      call  Show4_5
      call  Show6_7
      call  Show7_8
      call  Show8_9
      call  Show9_10
      call  Show8_9
      call  Show7_8
      call  Show6_7
      call  Show4_5
      call  Show3_4
      call  Show2_3
      goto  Routine2


Show1   movlw   b'11111110' ;Set GP0 as output
        goto    GPIOlow


Show2   movlw   b'11111101' ;Set GP1 as output
        goto    GPIOlow


Show3   movlw   b'11111011' ;Set GP2 as output
        goto    GPIOlow

Show4   movlw   b'11101111' ;Set GP4 as output
        goto    GPIOlow


Show5   movlw   b'11011111' ;Set GP5 as output
          goto  GPIOlow


Show6   movlw   b'11111110' ;Set GP0 as output
        goto    GPIOhi

Show7   movlw   b'11111101' ;Set GP1 as output
        goto    GPIOhi

Show8   movlw   b'11111011' ;Set GP2 as output
        goto    GPIOhi

Show9   movlw   b'11101111' ;Set GP4 as output
        goto    GPIOhi

Show10  movlw   b'11011111' ;Set GP5 as output
          goto  GPIOhi

GPIOlow tris    gpio          ;
        movlw   b'00000000'
        movwf   GPIO              ;
        goto    _XmS



GPIOhi  tris    gpio
        movlw   b'11111111'
        movwf   GPIO              ;
        goto    _XmS



Show1_2 movlw   b'11111100' ;Set GP0,1 as output
          goto  GPIOlow


Show2_3 movlw   b'11111001' ;Set GP1,2 as output
          goto  GPIOlow

Show3_4 movlw   b'11101011' ;Set GP2,4 as output
          goto  GPIOlow


Show4_5 movlw   b'11001111' ;Set GP4,5 as output
          goto  GPIOlow

Show5_6 bsf status, rp0     ;Bank 1
        movlw   b'11011110' ;Set GP0,5 as output
        movwf   TRISIO      ;
        bcf status, rp0   ;bank 0
        movlw   b'00000001' ;make GP5 low GP0 HIGH
        movwf   GPIO            ;turn on LED5&6
        goto    _XmS


Show6_7 movlw   b'11111100' ;Set GP0,1 as output
          goto  GPIOhi


Show7_8 movlw   b'11111001' ;Set GP1,2 as output
          goto  GPIOhi


Show8_9 movlw   b'11101011' ;Set GP2,4 as output
          goto  GPIOhi



Show9_10 movlw  b'11001111' ;Set GP4,5 as output
           goto   GPIOhi


        ;subroutines for Cross-over


Show1_10  bsf     status, rp0   ;Bank 1
          movlw b'11011110'   ;Set GP0,5 as output
          movwf TRISIO        ;
          bcf     status, rp0     ;bank 0
          movlw b'00100000'   ;make GP0 low GP5 high
          movwf GPIO              ;turn on LED1&10
          goto  _XmS


Show2_9 bsf   status, rp0     ;Bank 1
        movlw   b'11101101'     ;Set GP1,4 as output
        movwf   TRISIO          ;
        bcf   status, rp0       ;bank 0
        movlw   b'00010000'     ;make GP1 low GP4 high
        movwf   GPIO                ;turn on LED2&9
        goto    _XmS


Show3_8 movlw   05h
        movwf   fileA
        bsf   status, rp0     ;Bank 1
        movlw   b'11111011'     ;Set GP2, as output
        movwf   TRISIO          ;
        bcf status, rp0       ;bank 0
        movlw   b'00000000'     ;make GP0 low
        movwf   GPIO                ;turn on LED3
        call    _5mS
        bsf   status, rp0     ;Bank 1
        movlw   b'11111011'     ;Set GP2, as output
        movwf   TRISIO          ;
        bcf   status, rp0       ;bank 0
        movlw   b'00000100'     ;make GP0 high
        movwf   GPIO                ;turn on LED8
        call    _5mS
        decfsz  fileA,1
        goto    $-.15
        retlw   00


Show4_7 bsf   status, rp0     ;Bank 1
        movlw   b'11101101'     ;Set GP4,1 as output
        movwf   TRISIO          ;
        bcf   status, rp0       ;bank 0
        movlw   b'00000010'     ;make GP0 low
        movwf   GPIO                ;turn on LED4&7
        goto    _XmS




    ;Cross-over LEDs cross-over in the middle

Xover   call    Show1_10
      call  Show2_9
      call  Show3_8
      call  Show4_7
      call  Show5_6
      call  Show4_7
      call  Show3_8
      call  Show2_9
      goto  Routine4



;*************************************
;* Main                             *
;*************************************


Main    call    At_TO       ;at Turn-On LED 1-10 will flash 3 times
      call  Pot           ;fileB will hold a value 1-10
      goto  getRoutine  ;returns with Routine 1-10

Routine1
      call  Pot           ;get value of pot in fileB 1-10
      swapf fileB,0       ;swap nibbles = x8 and put in w
      movwf tempA
      goto  ScanLRL

Routine2
      call  Pot           ;get value of pot in fileB 1-10
      swapf fileB,0       ;swap nibbles = x8 and put in w
      movwf tempA
      goto  Scan2

Routine3
      call  Pot           ;get value of pot in fileB 1-10
      swapf fileB,0       ;swap nibbles = x8 and put in w
      movwf tempA
      goto  Bump


Routine4
      call  Pot           ;get value of pot in fileB 1-10
      swapf fileB,0       ;swap nibbles = x8 and put in w
      movwf tempA
      goto  Xover

Routine5
      call  Pot           ;get value of pot in fileB 1-10
      swapf fileB,0       ;swap nibbles = x8 and put in w
      movwf tempA
      call  Fire
      goto  $-1


Routine6
      call  Pot           ;get value of pot in fileB 1-10
      swapf fileB,0       ;swap nibbles = x8 and put in w
      movwf tempA
      call  Hole
      goto  $-1

Routine7
      call  Pot           ;get value of pot in fileB 1-10
      swapf fileB,0       ;swap nibbles = x8 and put in w
      movwf tempA
      call  Join
      goto  Routine7

Routine8
      call  Pot           ;get value of pot in fileB 1-10
      swapf fileB,0       ;swap nibbles = x8 and put in w
      movwf tempA
      call  Hole
      goto  $-1


Routine9
      call  Pot           ;get value of pot in fileB 1-10
      swapf fileB,0       ;swap nibbles = x8 and put in w
      movwf tempA
      call  Hole
      goto  $-1


Routine10
      call  Pot           ;get value of pot in fileB 1-10
      swapf fileB,0       ;swap nibbles = x8 and put in w
      movwf tempA
      goto  All

    ;oscillator calibration

      call  03ffh
      movwf OSCCAL

    end

Colin Mitchell

Colin Mitchell

Expertise

electronics
writing
PIC-Chips

Social Media

instagramtwitterwebsite

Related Posts

TODO
Transistor Test
© 2021, All Rights Reserved.

Quick Links

Advertise with usAbout UsContact Us

Social Media