HomeArticlesProjectsBlogContact
Articles
NIM - The Stroop Game
Colin Mitchell
Colin Mitchell
July 26, 2014
Make sure to subscribe to our newsletter and be the first to know the news.

Table Of Contents

01
The CIRCUIT
02
CONSTRUCTION
03
MORE
04
NIM - PARTS LIST
05
JUST THE MICRO:
06
GOING FURTHER

[Kits are available](mailto:colin@elechelp.com?Subject=Buying components for Stroop Game&Body=Please e-mail the cost of components for the Stroop Game on prototype PC board by air mail to my country:****___**** and send details of how I can pay for it. My name is:____) for this project from
Talking Electronics for $12.00 plus $6.50 postage.

This project shows what can be done with an 8-pin microcontroller.

NIM is a game played with 19 matches.
The aim is to take one, two or three matches and leave your opponent with the last match.

With this project you play against the “computer” and try to win.
Computers are ideal to show “intelligence.”
By coding all the possible combinations and outcomes of a particular situation, the micro is able to diagnose a situation very quickly and come up with an answer that appears to have intelligence.
Alternatively you can approach a problem mathematically and come up with a result.
Many games have an underlying “strategy” and this game is an example.
By knowing this strategy and producing simple routines to analyse each stage of the game we can achieve a result that does not need any complex mathematical interpretation.
The result is called “linear programming” in which the micro advances down the program according to the input it gets.
This part of the program requires very few instructions. The bulk of the instructions are needed to produce a display.
Since we have only 5 lines to drive 9 segments of a 1.5 digit display, we must use clever circuitry to illuminate any or all the 9 segments.
This is done in a form of scanning/multiplexing, that has never been presented before.
Obviously we cannot “dump” or dive the LEDs constantly because this will only illuminate a maximum of 5 segments.
We need to “time-share” the segments with two on each output. This provides up to 10 segments from 5 lines.
The LEDs on each output are arranged so one segment turns on when the output is HIGH and the other turns on when the output is LOW.
To prevent the LEDs turning on when the output is not driving either, we put two LEDs on each segment.
This means the characteristic voltage drop across 4 LEDs is about 7v and none will turn on.
The remainder of the program is taken up providing effects, such as pulsing the display, debouncing the switch and timing the players response then producing the computers response after 2 seconds.

NIM Top
The complete NIM GAME

NIM Under
The surface-mount components are mounted on the underside

NIM Iso

The CIRCUIT

The circuit consists of a single tactile button, 18 LEDs and an 8-pin microcontroller
The one-and-a-half digit display is made up of individual LEDs, with two LEDs in series for each segment. This gives a voltage drop of approx 3.4v and a 22R current-limit resistor is needed. The diode on the input reduces the supply to 5.4v when the two lithium cells are new as the micro can only accept up to 5.5v.


NIM CIRCUIT
The display has 2 yellow LEDs in series for each segment

CONSTRUCTION

The project is built on a small PC board with the surface mount components on the underside. The surface mount LEDs are an old-style with three legs.
You just need tweezers, fine solder and a temperature-controller iron to produce a very neat result.
Place solder on one land then sit the component in place and heat the solder very quickly. The LEDs must be soldered very quickly otherwise they will lose their brightness. 3 extra LEDs are included in the kit as replacements for any LEDs that have been damaged.

MORE

For more details on modifying the program and burning the PIC chip, see Talking Electronics website and click on Elektor,EPE,Silicon Chip in the index.
You can find details of: PICkit-2 and Adapter connected for In-Circuit Programming at this link.

Here is the file you will need for “burning” your chip and/or modifying the program. It comes as .asm, .txt and .hex for using as a file to modify, or to read, or to burn a new chip:

  • Nim.asm
  • Nim.txt
  • Nim.hex
    The kit comes with a pre-programmed PIC chip, see parts list below.
;****************************************************************

    ;**Nim ** for 12F629.asm
    ;  5-7-2014


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

    __CONFIG

    _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT  ;Internal osc.


    ; globals
counter     equ     20h     ;this is the first available file
  tempA     equ     21h
  tempB     equ   22h
flickA      equ   23h
timerA      equ   24h

random      equ 25h

fileA       equ   26h
fileB       equ   27h
fileC       equ   28h
fileD       equ   29h

filezz      equ   5Fh     ;this is the 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


Start   org 0x00        ;program starts at location 000
      nop
      nop
      nop
      nop             ;NOPs to get past reset vector address
      nop
      nop




SetUp     bsf     status, rp0   ;Bank 1
        movlw   b'11110111' ;Turn on T0CKI, prescale for TMR0 = 1:256
        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
    clrf    GPIO                ;Clear GPIO of junk
    goto    Main



    ;Delay 0.01 sec (10mS)


    ;1mS delay

_1mS    decfsz  fileA,1
      goto    _1mS
      retlw   00


_10mS   movlw   0Ah
        movwf   fileB
DelY    nop
      decfsz    fileA,1
      goto    DelY
      decfsz    fileB,1
      goto    DelY
      retlw     00

    ;100mS delay

_100mS  movlw     60h
          movwf   fileB
BB      call      _1mS
        decfsz  fileB,1
        goto      BB
        retlw     00


_500mS  movlw     32h
          movwf   fileC
CC      call      _10mS
        decfsz  fileC,1
        goto      CC
        retlw     00



    ;Clear the screen

clr500mS
        bsf   status, rp0 ;Bank 1
        movlw   b'11111111' ;
        movwf   TRISIO      ;
        bcf   status, rp0   ;bank 0
        call    _500mS
        retlw 00


_1to19
        clrf    fileD
        bsf   fileD,3       ;create 8h loops for each number  0000 1000
        call    show1
        bsf   fileD,3
        call    show2
        bsf   fileD,3
        call    show3
        bsf   fileD,3
        call    show4
        bsf   fileD,3
        call    show5
        bsf   fileD,3
        call    show6
        bsf   fileD,3
        call    show7
        bsf   fileD,3
        call    show8
        bsf   fileD,3
        call    show9
        bsf   fileD,3
        call    show10
        bsf   fileD,3
        call    show11
        bsf   fileD,3
        call    show12
        bsf   fileD,3
        call    show13
        bsf   fileD,3
        call    show14
        bsf   fileD,3
        call    show15
        bsf   fileD,3
        call    show16
        bsf   fileD,3
        call    show17
        bsf   fileD,3
        call    show18
        bsf   fileD,3
        call    show19
        retlw   00



show1     bsf       status, rp0     ;Bank 1
        movlw     b'11001101'   ;
        movwf     TRISIO        ;
        bcf     status, rp0 ;bank 0
        movlw     b'00100110'   ;
        movwf     GPIO
        call      _10mS
        bsf     status, rp0     ;Bank 1
        movlw     b'11111111'   ;Set GP1,2 4 5 input to reduce brightness
        movwf     TRISIO        ;
        bcf     status, rp0 ;bank 0
        call      _10mS
        decfsz  fileD,1         ;
        goto      show1
        retlw   00




show2   bsf     status, rp0     ;Bank 1
      movlw   b'11101001'     ;
      movwf   TRISIO          ;
      bcf       status, rp0   ;bank 0
      movlw   b'00010000'       ;
      movwf   GPIO
      call    _10mS
      bsf       status, rp0     ;Bank 1
      movlw   b'11011101'     ;
      movwf   TRISIO          ;
      bcf       status, rp0   ;bank 0
      movlw   b'00000010'     ;make GP 1 low
      movwf   GPIO
      call    _10mS
      decfsz    fileD,1         ;
      goto    show2
      retlw     00


show3   bsf     status, rp0     ;Bank 1
      movlw   b'11001101'     ;
      movwf   TRISIO          ;
      bcf       status, rp0   ;bank 0
      movlw   b'00000000'       ;
      movwf   GPIO
      call    _10mS
      bsf       status, rp0     ;Bank 1
              movlw b'11101101' ;
      movwf   TRISIO          ;
      bcf       status, rp0   ;bank 0
      movlw   b'00010010'       ;
      movwf   GPIO
      call    _10mS
      decfsz    fileD,1           ;
      goto    show3
      retlw     00


show4   bsf     status, rp0     ;Bank 1
      movlw   b'11011111'       ;
      movwf   TRISIO          ;
      bcf       status, rp0     ;bank 0
      movlw   b'00010000'       ;
      movwf   GPIO
      call    _10mS
      bsf       status, rp0     ;Bank 1
      movlw   b'11100001'       ;
      movwf   TRISIO          ;
      bcf       status, rp0     ;bank 0
      movlw   b'00000110'       ;
      movwf   GPIO
      call    _10mS
      decfsz    fileD,1           ;
      goto    show4
      retlw     00



show5   bsf     status, rp0     ;Bank 1
      movlw   b'11101001'       ;
      movwf   TRISIO          ;
      bcf       status, rp0     ;bank 0
      movlw   b'00000100'       ;
      movwf   GPIO
      call    _10mS
      bsf       status, rp0     ;Bank 1
      movlw   b'11001111'       ;
      movwf   TRISIO          ;
      bcf       status, rp0     ;bank 0
      movlw   b'00010000'       ;
      movwf   GPIO

    call      _10mS
    decfsz  fileD,1               ;
    goto      show5
    retlw   00



show6   bsf   status, rp0   ;Bank 1
      movlw b'11101001'     ;
      movwf TRISIO        ;
      bcf     status, rp0       ;bank 0
      movlw b'00000000'     ;
      movwf GPIO
      call  _10mS
      bsf     status, rp0   ;Bank 1
      movlw b'11001011'     ;
      movwf TRISIO        ;
      bcf     status, rp0       ;bank 0
      movlw b'00010100'     ;
      movwf GPIO

    call      _10mS
    decfsz  fileD,1             ;
    goto      show6
    retlw   00


show7   bsf   status, rp0   ;Bank 1
      movlw b'11101101'     ;
      movwf TRISIO        ;
      bcf     status, rp0       ;bank 0
      movlw b'00000001'     ;
      movwf GPIO
      call  _10mS
      bsf     status, rp0   ;Bank 1
      movlw b'11111101'     ;
      movwf TRISIO        ;
      bcf     status, rp0       ;bank 0
      movlw b'00000011'     ;
      movwf GPIO

    call      _10mS
    decfsz  fileD,1             ;
    goto      show7
    retlw   00



show8     bsf     status, rp0 ;Bank 1
        movlw   b'11001001' ;
        movwf   TRISIO      ;
        bcf   status, rp0   ;bank 0
        movlw   b'00000000' ;
        movwf   GPIO
        call    _10mS
        bsf   status, rp0 ;Bank 1
        movlw   b'11101001' ;
        movwf   TRISIO      ;
        bcf   status, rp0   ;bank 0
        movlw   b'00010110' ;
        movwf   GPIO

    call      _10mS
    decfsz  fileD,1             ;
    goto      show8
    retlw   00


show9   bsf   status, rp0   ;Bank 1
      movlw b'11101001'   ;
      movwf TRISIO        ;
      bcf     status, rp0       ;bank 0
      movlw b'00000100'     ;
      movwf GPIO
      call  _10mS
      bsf     status, rp0   ;Bank 1
      movlw b'11001101'     ;
      movwf TRISIO        ;
      bcf     status, rp0       ;bank 0
      movlw b'00010010'     ;
      movwf GPIO

      call    _10mS
      decfsz    fileD,1          ;
      goto    show9
      retlw     00


show10  bsf   status, rp0   ;Bank 1
        movlw   b'11101000'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00000001'     ;
        movwf   GPIO
        call    _10mS
        bsf   status, rp0   ;Bank 1
        movlw   b'11101000'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00010111'     ;
        movwf   GPIO

        call      _10mS
        decfsz  fileD,1         ;
        goto      show10
        retlw   00


show11  bsf   status, rp0   ;Bank 1
        movlw   b'11111100'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00100111'     ;
        movwf   GPIO
        call    _10mS
        bsf   status, rp0   ;Bank 1
        movlw   b'11101110'     ;
        movwf   TRISIO        ;
        bcf     status, rp0     ;bank 0
        movlw   b'00000001'     ;
        movwf   GPIO

        call      _10mS
        decfsz  fileD,1         ;
        goto      show11
        retlw   00

show12  bsf   status, rp0   ;Bank 1
        movlw   b'11101000'   ;
        movwf   TRISIO        ;
        bcf   status, rp0     ;bank 0
        movlw   b'00010001'   ;
        movwf   GPIO
        call    _10mS
        bsf   status, rp0   ;Bank 1
        movlw   b'11011100'   ;
        movwf   TRISIO        ;
        bcf   status, rp0     ;bank 0
        movlw   b'00000011'     ;
        movwf   GPIO
        call    _10mS
        decfsz  fileD,1       ;
        goto    show12
        retlw 00


show13  bsf   status, rp0     ;Bank 1
        movlw   b'11001100'   ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00000001'     ;
        movwf   GPIO
        call    _10mS
        bsf   status, rp0     ;Bank 1
        movlw   b'11101100'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00010011'     ;
        movwf   GPIO
        call    _10mS
        decfsz  fileD,1         ;
        goto    show13
        retlw 00


show14  bsf   status, rp0   ;Bank 1
        movlw   b'11001010'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00000101'     ;
        movwf   GPIO
        call    _10mS
        bsf   status, rp0   ;Bank 1
        movlw   b'11111100'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00000011'     ;
        movwf   GPIO
        call    _10mS
        decfsz  fileD,1         ;
        goto    show14
        retlw 00



show15  bsf   status, rp0   ;Bank 1
        movlw   b'11101000'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00000101'     ;
        movwf   GPIO
        call    _10mS
        bsf   status, rp0   ;Bank 1
        movlw   b'11001110'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00010001'     ;
        movwf   GPIO

        call      _10mS
        decfsz  fileD,1         ;
        goto      show15
        retlw   00



show16  bsf   status, rp0   ;Bank 1
        movlw   b'11101000'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00000001'     ;
        movwf   GPIO
        call    _10mS
        bsf   status, rp0   ;Bank 1
        movlw   b'11001010'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00010101'     ;
        movwf   GPIO

        call      _10mS
        decfsz  fileD,1         ;
        goto      show16
        retlw   00

show17  bsf   status, rp0   ;Bank 1
        movlw   b'11101100'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00000001'     ;
        movwf   GPIO
        call    _10mS
        bsf   status, rp0   ;Bank 1
        movlw   b'11111100'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00000011'     ;
        movwf   GPIO

        call      _10mS
        decfsz  fileD,1         ;
        goto      show17
        retlw   00



show18  bsf   status, rp0   ;Bank 1
        movlw   b'11001000'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00000001'     ;
        movwf   GPIO
        call    _10mS
        bsf   status, rp0   ;Bank 1
        movlw   b'11100000'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00010111'     ;
        movwf   GPIO

    call      _10mS
    decfsz  fileD,1               ;
    goto      show18
    retlw   00


show19  bsf   status, rp0   ;Bank 1
        movlw   b'11101000'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00000101'     ;
        movwf   GPIO
        call    _10mS
        bsf   status, rp0   ;Bank 1
        movlw   b'11001100'     ;
        movwf   TRISIO        ;
        bcf   status, rp0       ;bank 0
        movlw   b'00010011'     ;
        movwf   GPIO

        call      _10mS
        decfsz  fileD,1         ;
        goto      show19
        retlw   00


showU   bsf   status, rp0     ;Bank 1
      movlw b'11101011'       ;
      movwf TRISIO          ;
      bcf   status, rp0       ;bank 0
      movlw b'00000000'       ;
      movwf GPIO
      call  _10mS
      bsf     status, rp0     ;Bank 1
      movlw b'11101001'       ;
      movwf TRISIO          ;
      bcf     status, rp0         ;bank 0
      movlw b'00010110'       ;
      movwf GPIO

      call    _10mS
      decfsz    fileD,1           ;
      goto    showU
      retlw     00

showL   bsf   status, rp0   ;Bank 1
      movlw b'11111011'     ;
      movwf TRISIO        ;
      bcf     status, rp0       ;bank 0
      movlw b'00000000'     ;
      movwf GPIO
      call  _10mS
      bsf     status, rp0   ;Bank 1
      movlw b'11101011'     ;
      movwf TRISIO        ;
      bcf     status, rp0       ;bank 0
      movlw b'00010100'     ;
      movwf GPIO

      call    _10mS
      decfsz    fileD,1         ;
      goto    showL
      retlw     00

showO   bsf   status, rp0   ;Bank 1
      movlw b'11101001'     ;
      movwf TRISIO        ;
      bcf     status, rp0       ;bank 0
      movlw b'00000000'     ;
      movwf GPIO
      call  _10mS
      bsf     status, rp0   ;Bank 1
      movlw b'11101001'     ;
      movwf TRISIO        ;
      bcf     status, rp0       ;bank 0
      movlw b'00010110'     ;
      movwf GPIO

      call    _10mS
      decfsz    fileD,1         ;
      goto    showO
      retlw     00

showE   bsf   status, rp0   ;Bank 1
      movlw b'11111001'     ;
      movwf TRISIO        ;
      bcf     status, rp0       ;bank 0
      movlw b'00000000'     ;
      movwf GPIO
      call  _10mS
      bsf     status, rp0   ;Bank 1
      movlw b'11001011'     ;
      movwf TRISIO        ;
      bcf     status, rp0       ;bank 0
      movlw b'00010100'     ;
      movwf GPIO

      call    _10mS
      decfsz    fileD,1         ;
      goto    showE
      retlw     00



flicker movlw     10h
          movwf   flickA
ff      bsf     status, rp0     ;Bank 1
        movlw     b'11111111'       ;
        movwf     TRISIO          ;
        bcf     status, rp0     ;bank 0
        call      _1mS
        call      _1mS
        decfsz  flickA,1
        goto      ff
        retlw   00






Main    clrf    fileD
        call    _1to19      ;show numbers 1 to 19 on display
Maina   bsf   fileD,3
      call  show19
      btfsc GPIO,3      ;will be zero when button pushed
      goto  Maina



        movlw   10h
        movwf   tempA
Main19  bsf   fileD,1
        call    show19
        call    flicker
        decfsz  tempA,1
        goto    Main19
Main19a bsf   fileD,3
        call    show19
        btfss   GPIO,3
        goto    Main19a

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main18c bsf   fileD,3
        call    show18
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main18      ;player has pushed button
        decfsz  timerA,1
        goto    Main18c
        goto    comp18    ;player has ended his turn (run out of time)





Main18  movlw   10h
          movwf tempA
Main18a movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show18
        call    flicker
        decfsz  tempA,1
        goto    Main18a
Main18b bsf   fileD,3
        call    show18
        btfss   GPIO,3
        goto    Main18b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main17c bsf   fileD,3
        call    show17
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main17      ;player has pushed button
        decfsz  timerA,1
        goto    Main17c
        goto    comp17


Main17  movlw   10h
          movwf tempA
Main17a movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show17
        call    flicker
        decfsz  tempA,1
        goto    Main17a
Main17b bsf   fileD,3
        call    show17
        btfss   GPIO,3      ;button must be released to get past here
        goto    Main17b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main16c bsf   fileD,3
        call    show16
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main16      ;player has pushed button
        decfsz  timerA,1
        goto    Main16c
        goto    comp16
Main16  movlw   10h
        movwf   tempA
Main16a movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show16
        call    flicker
        decfsz  tempA,1
        goto    Main16a
Main16b bsf   fileD,3
        call    show16
        btfss   GPIO,3
        goto    Main16b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main15c bsf   fileD,3
        call    show15
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main15      ;player has pushed button
        decfsz  timerA,1
        goto    Main15c
        goto    comp15





Main15  movlw   10h
          movwf tempA
Main15a movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show15
        call    flicker
        decfsz  tempA,1
        goto    Main15a
Main15b bsf   fileD,3
        call    show15
        btfss   GPIO,3
        goto    Main15b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main14c bsf   fileD,3
        call    show14
        call    _1mS
        btfss   GPIO,3        ;will be zero when button pushed
        goto    Main14          ;player has pushed button
        decfsz  timerA,1
        goto    Main14c
        goto    comp14

Main14  movlw   10h
          movwf tempA
Main14a movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show14
        call    flicker
        decfsz  tempA,1
        goto    Main14a
Main14b bsf   fileD,3
        call    show14
        btfss   GPIO,3        ;button must be released to get past here
        goto    Main14b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main13c bsf fileD,3
        call    show13
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main13        ;player has pushed button
        decfsz  timerA,1
        goto    Main13c
        goto    comp13      ;player has ended his turn (run out of time)


Main13  movlw   10h
          movwf tempA
Main13a movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show13
        call    flicker
        decfsz  tempA,1
        goto    Main13a
Main13b bsf   fileD,3
        call    show13
        btfss   GPIO,3        ;button must be released to get past here
        goto    Main13b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main12c bsf fileD,3
        call    show12
        call    _1mS
        btfss   GPIO,3        ;will be zero when button pushed
        goto    Main12        ;player has pushed button
        decfsz  timerA,1
        goto    Main12c
        goto    comp12


Main12  movlw   10h
          movwf tempA
Main12a movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show12
        call    flicker
        decfsz  tempA,1
        goto    Main12a
Main12b bsf   fileD,3
        call    show12
        btfss   GPIO,3      ;button must be released to get past here
        goto    Main12b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main11c bsf fileD,3
        call    show11
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main11      ;player has pushed button
        decfsz  timerA,1
        goto    Main11c
        goto    comp11


Main11  movlw   10h
          movwf tempA
Main11a movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show11
        call    flicker
        decfsz  tempA,1
        goto    Main11a
Main11b bsf   fileD,3
        call    show11
        btfss   GPIO,3
        goto    Main11b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main10c bsf fileD,3
        call    show10
        call    _1mS
        btfss   GPIO,3        ;will be zero when button pushed
        goto    Main10          ;player has pushed button
        decfsz  timerA,1
        goto    Main10c
        goto    comp10


Main10  movlw   10h
            movwf   tempA
Main10a movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show10
        call    flicker
        decfsz  tempA,1
        goto    Main10a
Main10b bsf   fileD,3
        call    show10
        btfss   GPIO,3
        goto    Main10b

        call    clr500mS

        movlw   01Fh
        movwf   timerA
Main9c  bsf fileD,3
        call    show9
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main9         ;player has pushed button
        decfsz  timerA,1
        goto    Main9c
        goto    comp9



Main9     movlw 10h
          movwf tempA
Main9a  movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show9
        call    flicker
        decfsz  tempA,1
        goto    Main9a
Main9b  bsf   fileD,3
        call    show9
        btfss   GPIO,3
        goto    Main9b

        call    clr500mS

        movlw   01Fh
        movwf   timerA
Main8c  bsf   fileD,3
        call    show8
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main8       ;player has pushed button
        decfsz  timerA,1
        goto    Main8c
        goto    comp8


Main8     movlw 10h
          movwf tempA
Main8a  movf    tempA,0
        movwf   flickA
        bsf     fileD,1
        call    show8
        call    flicker
        decfsz  tempA,1
        goto    Main8a
Main8b  bsf fileD,3
        call    show8
        btfss   GPIO,3
        goto    Main8b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main7c  bsf   fileD,3
        call    show7
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main7           ;player has pushed button
        decfsz  timerA,1
        goto    Main7c
        goto    comp7

Main7     movlw 10h
          movwf tempA
Main7a  movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show7
        call    flicker
        decfsz  tempA,1
        goto    Main7a
Main7b  bsf fileD,3
        call    show7
        btfss   GPIO,3
        goto    Main7b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main6c  bsf fileD,3
        call    show6
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main6         ;player has pushed button
        decfsz  timerA,1
        goto    Main6c
        goto    comp6


Main6     movlw 10h
          movwf tempA
Main6a  movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show6
        call    flicker
        decfsz  tempA,1
        goto    Main6a
Main6b  bsf   fileD,3
        call    show6
        btfss   GPIO,3      ;button must be released to get past here
        goto    Main6b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main5c  bsf   fileD,3
        call    show5
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main5         ;player has pushed button
        decfsz  timerA,1
        goto    Main5c
        goto    comp5



Main5     movlw 10h
          movwf tempA
Main5a  movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show5
        call    flicker
        decfsz  tempA,1
        goto    Main5a
Main5b  bsf   fileD,3
        call    show5
        btfss   GPIO,3      ;button must be released to get past here
        goto    Main5b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main4c  bsf   fileD,3
        call    show4
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main4         ;player has pushed button
        decfsz  timerA,1
        goto    Main4c
        goto    comp4


Main4   movlw   10h
        movwf   tempA
Main4a  movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show4
        call    flicker
        decfsz  tempA,1
        goto    Main4a
Main4b  bsf   fileD,3
        call    show4
        btfss   GPIO,3      ;button must be released to get past here
        goto    Main4b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main3c  bsf fileD,3
        call    show3
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main3         ;player has pushed button
        decfsz  timerA,1
        goto    Main3c
        goto    comp3

Main3     movlw 10h
          movwf tempA
Main3a  movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show3
        call    flicker
        decfsz  tempA,1
        goto    Main3a
Main3b  bsf   fileD,3
        call    show3
        btfss   GPIO,3      ;button must be released to get past here
        goto    Main3b

          call  clr500mS

        movlw   01Fh
        movwf   timerA
Main2c  bsf fileD,3
        call    show2
        call    _1mS
        btfss   GPIO,3      ;will be zero when button pushed
        goto    Main2         ;player has pushed button
        decfsz  timerA,1
        goto    Main2c
        goto    Main1c    ;player has ended his turn (run out of time)


Main2     movlw 10h
          movwf tempA
Main2a  movf    tempA,0
        movwf   flickA
        bsf   fileD,1
        call    show2
        call    flicker
        decfsz  tempA,1
        goto    Main2a
Main2b  bsf   fileD,3
        call    show2
        btfss   GPIO,3      ;button must be released to get past here
        goto    Main2b

          call  clr500mS

        bsf   fileD,7
        call    show1
        call    clr500mS
        bsf   fileD,6
        call    showO
        call    clr500mS
        goto    Main

Main1c  clrf    fileD
        call    clr500mS
        bsf   fileD,4
        call    show1
        call    clr500mS
        bsf   fileD,4
        call    show1
        call    clr500mS
        bsf   fileD,4
        call    show1
        call    clr500mS
        call    clr500mS
        bsf   fileD,4
        call    showU
        call    clr500mS
        bsf   fileD,4
        call    showL
        call    clr500mS
        bsf   fileD,4
        call    showO
        call    clr500mS
        bsf   fileD,4
        call    show5
        call    clr500mS
        bsf   fileD,4
        call    showE
        call    clr500mS
        call    clr500mS
        goto    Main


comp18  call    clr500mS
        bsf   fileD,6
        call    show17
        call    clr500mS
        goto    Main16c

comp17  call    clr500mS
          goto  Main16c


comp16  call    clr500mS
        bsf   fileD,6
        call    show15
        call    clr500mS
        bsf   fileD,6
        call    show14
        call    clr500mS
        goto    Main13c

comp15  call    clr500mS
        bsf   fileD,6
        call    show14
        call    clr500mS
        goto    Main13c

comp14  call    clr500mS
          goto  Main13c

comp13  call    clr500mS
          goto  Main12c

comp12  call    clr500mS
        bsf   fileD,6
        call    show11
        call    clr500mS
        bsf   fileD,6
        call    show10
        call    clr500mS
        goto    Main9c

comp11  call    clr500mS
        bsf   fileD,7
        call    show10
        call    clr500mS
        goto    Main9c

comp10  call    clr500mS
          goto  Main9c


comp9     call  clr500mS
          goto  Main8c



comp8     call  clr500mS
        bsf   fileD,6
        call    show7
        call    clr500mS
        bsf   fileD,6
        call    show6
        call    clr500mS
        goto    Main5c

comp7     call  clr500mS
        bsf   fileD,6
        call    show6
        call    clr500mS
        goto    Main5c

comp6     call  clr500mS
          goto  Main5c


comp5     call  clr500mS
          goto  Main4c

comp4     call  clr500mS
        bsf   fileD,6
        call    show3
        call    clr500mS
        bsf   fileD,6
        call    show2
        goto    Main1c


comp3     call  clr500mS
        bsf   fileD,6
        call    show2
        goto    Main1c




    end

NIM - PARTS LIST

Cost: au$12.00 plus $6.50 postage
[Kits are available](mailto:colin@elechelp.com?Subject=Buying components for Stroop Game&Body=Please e-mail the cost of components for the Stroop Game on prototype PC board by air mail to my country:****___**** and send details of how I can pay for it. My name is:____)

  • 5 - 22R SM resistors (220)

  • 1 - 47k SM resistor (4702) or (473)

  • 1 - 100n SM capacitor

  • 18 - Yellow SM LEDs

  • 1 - SPDT mini slide switch

  • 1 - mini tactile push button

  • 1 - PIC12F629 chip (with NIM routine)

  • 1 - 8 pin IC socket

  • 1 - 1N4148 diode

  • 2 - 3v lithium cells

  • 1 - coin-cell battery holder

  • 20cm - very fine solder

  • 1 - NIM PC board

JUST THE MICRO:

Pre-programmed PIC12F629 micro with NIM routine $5.00 plus $3.00 post

GOING FURTHER

This project is one of a number of projects using a PIC microcontroller.
The overall concept of Talking Electronics is to show what can be done with a “micro” and you can add this project to PIC Fx-1 where you can study the program and add extra routines to produce individual effects.
You can then “burn” or flash” your program into a new chip by using the PIC Fx-1 project and see what results you get.

This project has been designed for a greeting card. Instead of opening a $6.00 card to see the words “Happy Birthday,” you get a game using electronics.


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