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, a 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 it's programmed 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 of matchstick.

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 game. 
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, etc.

There are 3 additional articles to help you get into programming PIC chips

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 wires.


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. 

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 infinite impedance.
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 the time.
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 not marked.
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 require.
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 microcontrollers.
The scope of the information is considerable and the headlines of each are as follows:

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.


CREATING THE 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 tongue".

I'd much rather deal with instructions that you can see what they do.

Mike Halloran
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 each press.
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 pressed. 
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 B.
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 each section.
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 sub-routine.

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 doing.
Only change one item or idea at a time and test each change before making another change.