Circuit and construction
This project will keep
you amused for hours. It's a simple
COMBINATION LOCK with two buttons.
They must be pressed a special number of times and the first LED
will illuminate. For the next steps, the timing between the presses is important.
If you get it right, the next LED will come on. If you get it wrong,
LED will go out.
This project is compact and challenging and
teaches three different sections of electronics.
The heart of the circuit is a tiny PIC microcontroller (PIC12F629) and
when fitted to the board.
This involves IN-CIRCUIT PROGRAMMING and if you have not encountered
this before, this project will get you started.
You will also encounter surface-mount components and you can learn
programming to change some of the features of the project.
In all, this project offers lots of features on a PC board the size
WHERE DO YOU START?
This project comes as a kit for us$12.00 (plus us$7.00 postage
world-wide) from Talking Electronics. The chip is pre-programmed
and the kit is complete, including the button cells.
The PC board also has a programming socket so you can re-program the
chip to modify the complexity of the
The first thing to do is build the project and see how far you can
progress through the puzzle, by illuminating the LEDs on the board. You
can always re-load the program but this article is mainly designed to
get to into programming. It's the stepping-stone to greater things.
Writing a routine requiring the input from a switch, is one of the most
difficult to create as you have to exclude all the unwanted possibility
of pushing the switch at the wrong time or the wrong number of presses,
There are 3 additional articles to help you get into programming PIC
All the parts fit on a small PC
board, the size of a "match-stick." The only unusual
connections are the wires to hold the button cells in place. They slip
into the cut-outs on the board and make contact with the top and bottom
We have used surface-mount components as this is the way electronics is
going. It is cheaper to produce a surface-mount product than any of the
older styles. Surface-mount components can be fitted up to 10 times
faster and the board is smaller. We have not used the extremely small
surface-mount resistors as they are too small to have the resistance
value printed on them.
HOW THE CIRCUIT
All the operation of the circuit
is done inside the microcontroller. The only things you have to consider
are the voltage and stability of the supply. The 100n across the supply
prevents spikes and the voltage must not be above 5.5v as some PIC chips
will perform incorrectly with an over-voltage.
Each of the outputs we have used in this project are "Tri-state." This
means they can be HIGH, LOW or OPEN. In the "open" state they are
To turn on LED1, line A is HIGH and line B is LOW. All the other lines
are made OPEN by turning them into INPUT LINES.
The total resistance for the LED is about 100R and this allows about
25mA to flow.
To reduce the brightness of the LED, it is turned on for about 25% of
This combination for each bit of the IN-OUT port is stored as a
subroutine, such as LED1, LED2 etc.
To "turn on more than one LED at the same time" can be done if say LED1
and LED2 sub-routines are multiplexed. You will lean more about
multiplexing later in the series.
The programming socket uses an
adapter that connects into the output of PICkit2. Five of the 6 lines
from PICkit2 are used in the programming function. The 6th line of
PICkit2 will be available when expansion software is released.
A kit is available for this project under $12.00. It comes with a
pre-programmed microcontroller and all the surface-mount components in a
strip. These must not be removed until required as some components are
If you have not soldered surface-mount components before, we have
provided links to website address and movie clips to show exactly how to
solder them in place.
That's the brilliance of the web. It's just a clock away to anything you
The only thing it cannot give you is skill. But with a fine tipped
soldering iron and fine solder, the components can be soldered in place
quite easily. We have not supplied extremely small devices and the
resistors are clearly marked.
The only components needing care are the transistors and LEDs. But if
you have a temperature-controlled soldering iron, you can take up to 2
seconds to make a joint.
A lot of basic information has been
provided on the web, by Talking Electronics, for those starting the world of
The scope of the information is considerable and the headlines of each
are as follows:
WHERE TO NOW?
The next step is to learn PROGRAMMING. This project has been written in
ASSEMBLY CODE. We have used the 33 instructions that come with the chip
and these instructions are called mnemonics as they are groups of
letters or a word that tell you exactly what each instruction does.
We have not used any "shortcuts" or "tricks" or "advanced programming"
in our programs so you can follow every instruction to see exactly what
the micro is doing at every step.
Some instructions only do a very simple thing like setting or clearing a
bit in a file, but others will test a bit in a file and jump around the
next instruction if the bit is set, or decrement a file and jump around
the next instruction if the file is zero.
This means the instructions are classified as "quite powerful" when
compared to the early microprocessors.
There are actually thousands of instructions as each file from 20h to
64h can have any bit SET or CLEARED or DECREMENTED and lots more.
But the biggest selling point for the microcontroller is the RISC
feature (Reduced Instruction Set Computer) (Controller), where you only
have to learn about 33-35 instructions and reference the instruction to
the file you want to operate on.
We have written an article that starts you at the beginning and explains
how to layout a programming page (called an assembly page), provides a
list of every instruction for the PIC12F629 and explains all the things
you have to put on the page to get the assembler to assemble your
program and produce a .hex code. The article is:
Start Here with PIC12F629.
PROGRAM (How the project was created)
There are two ways to write a program. One way is to write very clever
code, using instructions other than those provided in the
List of Instructions, such as "$+2" or "bz."
The other is two write very simple sub-routines that are easy to
understand and easy to see what is being done.
This is what we have done. We call it "linear programming," where the
micro advances down the program, calling routines such as delay routines
and output routines as required.
Since there is over 1,000 lines available for your program, you don't
have to "save a line" by producing a very clever command. That's why
some of our routines are long, but easy to understand.
We have only used the 33 -35 instructions in the
List of Instructions. We have not used instructions like: "$+2" or "bz."
Programming in a higher language, such as BASIC, C, or any of the others
is like telling someone to put something together, such as a gearbox,
via an interpreter and over a phone-line. When things don't work, you
don't know where to start.
Here's an email from a frustrated programmer using "C":
I've lost count of
the hours I've spent chasing bugs that were 'my fault', because I didn't
know about a weird behavior of C or its preprocessor.
Personally, I would only program a
PIC in C if "tied to a horse, and dragged forty miles ... by my
I'd much rather deal with instructions that you can see what they do.
Ft. Lauderdale, FL, USA
Of course, high level programming has its advantages, but for the
projects we are presenting, it is much easier to use the
Instruction-Set for the PIC12F629 and avoid any frustrations.
The first thing to do is design the printed circuit board as this will
dictate which lines are used for the display.
Once this has been done, the program can be written.
Since each LED is turned on by a combination of two lines, the
activation of each LED has to be worked out and placed in a sub-routine.
These sub-routines are called LED0, LED1, LED2, etc.
The next item is to detect switch A and switch B. This is one of the
most difficult things to do as it involves "human interaction."
There are two problems with the switches in this project.
The first problem is debouncing each switch and the other is detecting
each switch individually.
Debouncing a mechanical switch is a big problem.
In most cases the microcontroller is advancing through the program so
quickly that when a switch is detected, it processes the result very
quickly and when the switch is released, the contacts bounce and make
contact a number of times before they separate. This has to be worked
out in the program so the switch does not give two or more reading for
The program also has to read the switch on the first pass and set a
debounce bit in a file so that it reads the switch only once.
Both switches are connected to the same input line and and the micro
discharges a 100n capacitor. The switch is then pressed and charges the
100n. After a delay period the micro looks at the input line to see if
the capacitor is charged to about 60%. The low value resistor on switch
A will charge the capacitor quickly and the micro firstly looks after
this time-period. If the line is HIGH the sub-routine returns with 01 in
W to signify switch A pressed. The micro then looks at a time-period
when switch B will charge the capacitor and if it is charged, W is
loaded with 02. Otherwise W returns with 0 to indicate no switch is
All this is done in the switch routine.
This this is not sufficient.
Another very clever programming feature has to be included.
The problem is this:
If switch A is pressed when the program is part way through the delay
before looking at the input, the capacitor will not be charged enough to
register a HIGH and and the sub-routine will then extend the time,
expecting to detect switch B. Thus switch A will be detected as switch
To prevent this, the sub-routine does a pass to see if any switch is
pressed and the carries out a determination. This way the switch is
guaranteed to be pressed before the sub-routine is processed.
The solution to the CODE PUZZLE
is not going to be provided in the article. This would spoil the whole
purpose of the project.
The only way to get the solution is to read the assembly program
containing all the assembly code and notation for each line as well as
You will appreciate writing the program in assembly code (mnemonics) as
almost anything can be written and when it doesn't work, it's just a
matter of preparing a short sub-program and making the micro "goto" it.
In the sub-routine you can see the value of a particular register by
decrementing it and outputting to a LED in a series of flashes or
putting a "goto" in a sub-routine and seeing if the micro gets to the
particular location by outputting to a LED if the micro reaches the
ADDING YOUR OWN
This is an ideal project to test
your programming skills. You can change any of the codes or create an
entirely new code for any section.
But before you do, here is the way to do it:
Suppose you want to change the code at section 3.
The first ting to do is change to the last instruction in "Set Up" to:
goto Out2, so the micro will immediately go to the
beginning of section 3, turn on LED2 for 2 seconds and then produce a
blank screen at the beginning of section 3.
Read the program at section 3 and understand what each instruction is
Only change one item or idea at a time and test each change before
making another change.