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.
The complete NIM GAME
The surface-mount components are mounted on the
underside
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 l\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
|
|
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.
26/7/2014 |