HomeArticlesProjectsBlogContact
Articles
Start Here with PIC16F628
Colin Mitchell
Colin Mitchell
June 04, 2012
Make sure to subscribe to our newsletter and be the first to know the news.

Table Of Contents

01
UPGRADING FROM PIC16F84 TO PIC16F628
02
MAKING RA4 SOURCE A CURRENT
03
TWO "IN-CIRCUIT PROGRAMMING" MODES
04
PICkit-2 Starter Kit (from Microchip)
05
WHERE TO START:
06
PROGRAMMING THE PIC16F628
07
CONSTRUCTION
08
START HERE:
09
EVERYTHING IS BASED AROUND A "COMPUTER"
10
BLINK A LED
11
HOW THE LED BLINKS
12
EXPERIMENT 1
13
EXPERIMENT 2
14
EXPERIMENT 3
15
EXPERIMENT 4
16
EXPERIMENT 5
17
Start Here with PIC16F628

PIC16F628 PDF Data Sheet
Instruction Set for PIC16F628
PIC16F628A.INC
Library of Routines A-E E-P P-Z
Blank_F628.asm or Blank_F628.txt
Notepad++ or VS Code

START HERE
Updated 5/2/2009


The PIC16F628 is the starting point for PIC projects that require 6 to 15 “drive-lines.”
(For 1 to 5 “drive-lines” use PIC12F629.)


Obviously you shouldn’t have a soldering iron so hot that it fumes the solder.

The PIC16F628 has 2k of program space for your program (2048 lines of code), operates at 4MHz and is cheaper than the PIC16F84A. The 4MHz oscillator is divided by 4 to get 1uS for each instruction.

We use the type number: PIC16F628 to describe this microcontroller, but there are a number of part-numbers:

PIC16F628 - Internal 4MHz or 37kHz operation, 18pin PDIP package (see photo below).
PIC16F628A Internal 4MHz or 48kHz operation, plus low voltage programming, low speed clock mode, programmable BOR, on-chip voltage reference.
-I/P I indicates temperature range: I = -40°C to 85°C (normally 0°C to 70°C)
P = PDIP package (see photo below).>
E = -40°C to 125°C
F = standard VDD range 3v to 5.5v
LF = 2v to 5.5v
SO is surface mount SS is surface mount
-04 = 4MHz
-20 = 20MHz
A chip with -20 means the chip is capable of operating at 20MHz via an external crystal and will execute 5 instructions per second when the crystal is 20MHz. The chip has 4MHz and 37kHz internal oscillators. The chip advertised by R S Components ( www.rsaustralia.com) is PIC16F628-20/P.
The PIC16F628A-20 I/P has 4MHz and 48kHz internal oscillators.

pic16f628a
A PIC16F628A microcontroller - 4MHz

A “drive-line” is an input/output line capable of driving up to 25mA. But this chip has one line that is input-only and this must be taken into account when designing a circuit. The input-only line for PIC16F628 is RA5 - pin 4 and one line that is “input and half-output” (RA4 - pin 3). (Other chips in the PIC range also have one line that is either input-only or can only produce a low-output - this applies to the PIC16F84. RA4 (pin 3) is an input pin but when used as an output, it will only sink 25mA. It will not source any current. And the PIC12F629 has GP3 (pin 4) as input only.
We found RA4 of a PIC16F84 is a sinking-line only and this is not covered anywhere in any data sheet. To overcome this you need to add an emitter-follower transistor with a 2k2 to the positive and the line from the chip connected to the base. See the circuit below.
Port B is a “full port” with 8 in-out lines but RB6 and RB7 are used for “In-Circuit Programming” and these lines must be able to rise HIGH when the chip is programmed “In-Circuit.”
The PICkit-2 programmer does not have the full 25mA “drive-capability” and thus the lines must be lightly loaded.
If it is programmed “out of circuit,” RB6 and RB7 can be used to sink and source 25mA as per any of the other lines.
Port A has 6 in-out lines plus one input only line (RA5 - pin 4) and one “input and half-output” (RA4 - pin 3). Thus the total is 14 plus one input and “half-output” and one input-only. The other two pins on the chip are for power (5v) and connection to 0v.

The first thing to do is fit the microcontroller to an 18 pin socket so it can be easily taken in out of a project. Wipe the pins of the socket with hair-grease so it is easy to remove. Move the chip from one place to another with the socket attached. This makes it much easier to remove from the project and the programmer and prevents your fingers getting spiked. Make sure pin 1 on the chip aligns with the notch at the end of the socket. You can also put a white dot over pin1 to to make identification easy.

18PiniCand socket
Fit the chip to a socket for easy handling

Here is the pinout for the PIC16F628:


The function of each pin

For a full explanation of each pin, refer to PIC16F628 PDF Data Sheet.


Port A (RA) and Port B (RB) pins clearly identified

Using a PIC in a circuit is very simple. Here is a circuit to drive a LED. All you have to do is create about 30 lines of code and the LED can be made to flash.
Pre-written code is available HERE as a .asm or HERE as a .txt file
Helpful information on how to write a program is available A-E E-P P-Z


Simplest PIC16F628 circuit - the chip is sourcing

UPGRADING FROM PIC16F84 TO PIC16F628

If you are upgrading from a PIC16F (or C) 84 (A), the pinout is below. Note all the port pins are in the same positions on both chips. Port B is identical. Port A on the PIC16F84 has 4 in/out and 1 “input and “half-output”. The PIC16F628 has 6 in/out, one “input and half-output” (RA4) and 1 input only (RA5).

The thing you have to remember is:
On both the PIC16F84 and PIC16F628, RA4 is an “input and half-output”. When used as an output, these pins will only sink 25mA and source 0mA. To make the pin source, connect the base of a transistor to the pin and put the transistor in emitter-follower mode by connecting the collector to the positive rail as in the diagram below. RA5 on a PIC16F628 is input only.

MAKING RA4 SOURCE A CURRENT

RA4 will not deliver a current to a load. To make it deliver a current, the following circuit can be used. Place a 2k2 on the base, to positive. When the pin is HIGH (or as an input) the emitter will source (deliver) 25mA (or more) as the base is being pulled HIGH by the 2k2. The current via the emitter is equal to the base current multiplied by the gain of the transistor. When the output of the micro is LOW, the base will be pulled low by the pin and the emitter will be low. The circuit below will not allow for sinking a current. But it makes the pin source just like the other outputs. Don’t forget, the maximum current for the chip, via all the pins is less than 250mA, to prevent overheating, so if you want to deliver a higher current, this type of buffer circuit can be used.


Making RA4 for ‘F84 or ‘F628 an output

If you want to sink and source from RA4 for ‘F84 or ‘F628, one of the following circuits can be used:


Making RA4 for ‘F84 or ‘F628 a HIGH/LOW output

Circuit A has a HIGH of 4v and a LOW of about 1v and an output of about 100mA. Circuit B has a HIGH of about 5.4v and a LOW of about 0.6v and an output of about 250mA. Note: circuit B inverts the output pin of the chip. There is a point when circuit B actually creates a short across the power rail, when the output of the chip is changing from low-to-high or high-to-low, but this interval is so brief that the transistors and power rail will not be adversely affected.


PIC16F84 Pinouts

TWO “IN-CIRCUIT PROGRAMMING” MODES

The PIC16F628 chip can be programmed “in-circuit” providing the programming pins are not used as output pins. If they are used as output pins, the programmer will not have enough current to pull the pin high to produce a guaranteed clock or data pulse. However the pins can be lightly-loaded and the programmer will work.
The PIC16F628 chip has 2 ways it can be programmed. It has Low-Voltage Programming and High-Voltage Programming. Both ways can be done “In-Circuit.” The method we are using is called High-Voltage Programming as pin 4 receives a voltage slightly higher than 13.5v to activate the chip into programming mode.
To activate the Low-Voltage Programming method, the chip must be initially programmed via High-Voltage and the LVP bit set to “1” so that either Low-Voltage or High- Voltage Programming can be done “in-Circuit.” In this state, Pin 10, RB5 cannot be used as in-out as it must receive a HIGH so the chip goes into LVP mode. In this case you lose an in-out pin and that’s why we have not chosen this mode.
We have chosen High-Voltage In-Circuit Programming mode.

Here are the programming connections. A separate programming board can be made to connect to the PICkit-2. We can call this board a PROGRAMMING BOARD as its only function is to program the chip. The board will look just like the circuit below. The chip is then removed and fitted to the project you are working on. Alternatively the chip can be programmed while in the project you are currently designing if you include this socket and wiring.


In-circuit Programming connections

The programming socket on your project can be can be 5 pins as shown in the photo below and identified as Clock, Data, 0v, 5v and Vpp. The pins match the extension socket shown in the picture. The extension “lead” consisting of a plug and socket fits into the 6 pins of the Microchip programmer PICkit-2 and brings out the 5 lines we need for In-Circuit Programming. (we do not use the first line)
The third photo/diagram below shows the Programming Socket on the circuit diagram above. You can see how the PICkit-2 programmer sits at the back of your project and the extension board fits over the 5 pins.
If your project operates on 4.5v, turn the power OFF as this low voltage will upset the programmer.

ProgrammingSocket

PICkit-2 Starter Kit (from Microchip)

Here are the details of the PICkit-2 programmer:
This programmer is the cheapest and best for programming PIC chips and is available directly from Microchip for $50.00 plus postage. It comes with CD’s and an extra PC board containing a PIC16F690 and components such as LEDs, a push button and a pot to get you started in programming. The programmer detects the type of chip being programmed and has features that help you to program the chip and avoid mistakes and faults. It’s a beautiful piece of equipment. It connects to the USB port on a lap-top. If you do not have access to a USB port, use the Multi Chip Programmer from Talking Electronics. Here is another Programmer Cct.

PICkit2StarterKitPic 2
Price: USD$50.00 plus postage

The PICkit 2 Starter Kit contains a PICkit 2 Microcontroller Programmer and a PICkit 2 Low Pin Count Demo Board containing a PIC16F690 PDIP for getting started with programming baseline and midrange flash microcontrollers. PICkit 2 takes advantage of Microchips Full-Speed USB device, thereby significantly speeding up development programming. The PICkit 2 Low Pin Count Demo Board supports 8-, 14-, and 20-pin PICmicros. In addition to the PIC16F690, the board comes with 4 LEDs, a pushbutton, and a pot. Also included are 12 lessons to help get developers up to speed quickly on programming PICmicro MCUs.

DV164120 (purchase via Microchip Direct)

Features of PICkit 2 Starter Kit

  • Low pin count demo board supporting 8/14/20-pin mid range PIC microcontrollers
  • 20-pin PIC16F690 Midrange microcontroller
    Note: Requires the AC162061 ICD Header and AC164110 adapter to debug.
  • A series of 12 Lessons on assembly programming that cover I/O, A/D converters, timers, interrupts, and data tables (All source code files are provided)
  • Getting Started in PICBASIC PRO tutorial on developing and debugging in BASIC with a FREE microEngineering Labs PICBASIC PRO™ Demo Compiler (contained on the PICkit-2 CD)
  • HI-TECH PICC™ LITE C Compiler on PICkit-2 CD.
  • FREE! Microchip’s MPLAB IDE software for a complete code development environment

http://www.microchipdirect.com/productsearch.aspx?Keywords=DV164120

The PICkit-2 comes with a lead to connect between the PICkit-2 and the USB port of your laptop but you will still need to build the extension plug-and-socket described above to fit between the PICkit-2 programmer and your project, so the PIC16F628 can be programmed. You will be able to program “in circuit” if you put 5 pins on the project you are designing and connect to the programming socket on the PICkit-2 programmer. Or you can build a separate board called a PROGRAMMING BOARD and use the extension plug-and-socket.
The 16F690 in the demo board is a complex chip and way-beyond the needs of a beginner.
You still need to follow our instructions and build some of our simple projects if you want to start at the beginning of programming.
If you think you can come in on the “third rung of the ladder” you are fooling yourself. You must do everything slowly and methodically if you don’t want to get frustrated. You must start at the beginning.

WHERE TO START:

If you are converting a program from one micro to another (in the PIC family), here is a comparison chart. It shows the locations of the Special File Registers (from 000 to 06 or 1F). These include registers such as OPTION, TIMER, STATUS etc and the input/output port(s) 05 (RA) and 06 (RB). The 25 files in PIC12C508A (36 files for PIC16C84, 68 files for PIC16F84 and 224 files for PIC16F628) are for temporary storage during the running of a program and are accessed by this type of instruction:

movlw 0ffh
movwf 27h (this puts 1111 1111 into file 27h)

or movlw 080h
movwf 20h (this puts the hex value 80 into file 20h)

bsf 22h,3 (sets bit 3 in file 22hex)

If you access file 05 by loading it with a value such as 03, (and the file has been set as an output via the TRIS register, the following two instructions will output a HIGH on the two lowest output lines RA0 and RA1:
movlw 03h
movwf 05h

The Comparison Chart will help you see where the ports are located and the size of memory for your program.
Note: the first temporary storage file for PIC16F628 is 20h.

PROGRAMMING THE PIC16F628

The first thing you will want to do is program the PIC16F628. Don’t start with a complex project like “Simon.” Start with a simple project to turn a LED “on and off.” To do this we have chosen the Simon PC board for a set of 10 experiments to start you in the world of programming. We will use the PC board to carry out the experiments.


PIC16F628 circuit for experiments

CONSTRUCTION

Construction and testing of the PC board for this project is covered in the SIMON project.

START HERE:

This project gets you started with the PIC16F628 microcontroller with 10 experiments.
It’s the starting-point to learn about the wonderful word of “computer projects.”
You will be encouraged to add your own lines of code and experiment with modifications to each experiment.
Remember to old saying: I see, I do, I learn.

EVERYTHING IS BASED AROUND A “COMPUTER”

Most new products are designed around a “computer”
Devices such as talking key-chains, whistle detectors to locate your keys, remote controls for garage doors or cars, remote controls for TV, DVD, cable TV etc - house alarms and toys are all designed around a single “computer” chip.
The reason is simple. It’s economics.
A “computer” chip is one that has many functions, can “remember” codes and inputs from the user.
Rather than design a circuit using lots of transistors, chips and components, it is much cheaper to use a single chip. It takes less board-space, costs less to produce and creates a smaller product.
All new designs are going for compactness and the latest trend is to produce something smaller than the previous model.
And it all revolves around the heart of the product - a chip.
There are two choices. The chip can be a custom-design or “off the shelf.”
Designing a chip will cost thousands of dollars. But in most cases you can buy one that will perform the task for you, for only a few dollars.
Which would you choose?
Obviously a readily-available chip.
These “universal” chips are called microcontrollers and are equivalent to buying a blank book such as an exercise book and writing your own story.
One of the smallest and cheapest microcontrollers on the market is the PIC16F628 PDF Data Sheet. It has taken over from the PIC16F84A and is now the cheapest and best way to start in microcontroller-design.
(The PIC12F629 Data Sheet is about half the size and will be covered in another article - it has taken over from the PIC12C508A).
The PIC16F628 is an 18 pin chip with 15 pins that can be connected to external devices such as globes, switches, relays, microphones, photo devices, motors, etc. Sometimes you will need a transistor or other components between the chip and the device to get the external item to “talk” to the chip. This is called INTERFACING and will be covered in our discussion.
Even though the PIC16F628 is very small as far a microcontrollers are concerned, it can take the place of 10 or more individual chips.
Projects, such as a house alarm, can be designed around the chip or you can get it to perform “intelligent” commands such as playing a game of Tic Tac Toe or remember a sequence of events such as in the project: Simon.
It has also been used in an automatic dialer project, taking the place of 17 chips. The new design has 100-number capability. The old design could only dial 10 numbers!
This is where electronics is heading.
Every year, electronics is reducing is size, increasing in performance and halving in cost.
New products are being released all the time using microcontrollers.
Devices such as auto-dialers for monitoring heart patients or diabetes suffers, automatically dial a central station and download data to monitor the patient. The computer decides if an alarm is to be raised.
The world is crying-out for devices to assist those unable to perform important tasks.
But to be able to turn an idea into reality, you have to know the capability of electronics and be able to carry out the design-work. You will lose-out heavily if you pass your idea to another authority.
This is what this article is all about.
It shows some of the capabilities of a microcontroller and how to get from the concept-stage to the finished product.
It’s all a matter of doing things in small steps and when these are combined together, you have something that will perform a task.
When it comes to programming, these small steps are called sub-routines and they carry out a simple operation such as recognizing the push of a button, turning on a LED or creating a tone from a “speaker.”

Here is a simple program that blinks (flashes) a LED on pin 6 (RB0) of a PIC16F628.

 ;****************************************************************
;* Name of Project: Flash A LED on RB0      *;
;****************************************************************

    list P = 16F628 ;microcontroller identity
            ; e.g: 0x033 = hex value

    __Config 0x3FF5

;****************************************************************
;Program
;****************************************************************
    org 0x00        ;start of program
    bsf status,rp0       ; select bank 1
    movlw   b'00001110' ;
    movwf   option_reg
    bcf trisB,0     ; make bit,0 of Port B output
    bcf status,rp0      ;select programming area - bank0
    movlw   b'00000001' ;
    xorwf   portB,f     ;
    sleep
    end

The program above is very simple, but how does it work?
There are a lot of hidden answers in the program.
Let’s go through the instructions, one at a time.
The first instruction tells the assembler to put the next instruction at location 000 in the “program space” in the microcontroller. There are 2048 locations in a PIC16F628 for your program.
The second instruction tells the micro to go to a location in the micro where special purpose files are located.
The third instruction makes bits 1, 2 and 3 = “1” (the first bit is bit,0).
These bits are placed in the Option Register and bit 1 and 2 increase the timing of the Watch Dog Timer by 64 times by adding a prescaler. The normal timing of the WDT is 18mS. It is now 1.15seconds.
The next instruction clears bit 0 of the register that makes each line of port B either an input or an output. When a bit is “0” the corresponding line is and output.
The next instruction bring the micro back to the programming area.
The next instruction put “1” into the working register.
XORWF has the effect of changing bits in a register to the opposite value, when the bit in the working register is “1”. In our case the lowest bit will change from its unknown starting value to the opposite value.
The sleep instruction puts the micro to rest with any output pins remaining HIGH.
“end” signifies the end of the program to the compiler.

The micro executes each instruction in 1 microsecond and there are 7 instructions. It then comes to the sleep instruction.
The micro goes to sleep and the Watch Dog Timer executes 64 lots of 18mS and wakes up the chip. The micro then goes to location 000 and executes the 7 instructions again.
The instruction XORWF changes the lowest bit in Port B to the opposite value and goes to sleep again. This is how the LED is turned on and off.
This is not the normal way to produce a delay, but it shows how the sleep instruction works and how the WDT operates.

The place to start writing a program is on a page already laid-out with preliminary details. It is a .asm page and is called “Blank_F628.asm” Save it as: Blank_F628.asm or view it as: Blank_F628.txt

Here is Blank_F628.asm:

 ;****************************************************************
;* Name of Project:             *
;*                  *
;****************************************************************

list P = 16F628         ;microcontroller
list P = PIC16F628

include <p16F628.inc>   ;registers for F628


__Config 3F18h ;_cp_off & _lpv_off & _pwrte_off & _wdt_off & _intRC_oscI/O
;code protection - off
;low-voltage programming - off
;power-up timer -  off
;watchdog timer - off
;use internal RC for 4MHz - all pins for in-out

;****************************************************************
; Port definitions
;****************************************************************

PortA_Config    equ 0xf1 ;bit7: in,in,in,in,out,out,out,in :bit0
PortB_Config    equ 0x0f ;bit7: out,out,out,out,in,in,in,in :bit0

;****************************************************************
; variables - these are sample names and files
;****************************************************************

        ;Files for F628 start at 20h but to make programs easily
        ;  convertible from F84A to F628, we start at 20h.


timera      equ 0x20    ;general purpose timer
timerb      equ 0x21    ;general purpose timer
timerc      equ 0x22    ;general purpose timer
timerd      equ 0x23    ;general purpose timer
key     equ 0x25    ;key last pressed
steptemp    equ 0x27    ;temporary step memory
stepsgood       equ 0x28    ;number of steps
Alarm_state equ 0x29    ;contains alarm state
State_save  equ 0x2A
Win_save        equ 0x2B
tmr_Flg1    equ 0x2C    ;Register of  timer flags
tmr_Flg2    equ 0x2D    ;Register of more timer flags
Pulse_flgs      equ 0X2E    ;Pulse LED flags
mi_flgs     equ 0x2F    ;miscellaneous flags
count_clicks    equ 0x30
table_i     equ 0x31    ;table index

;-------------Miscellaneous flags

flg_RAoff       equ 0   ;Used to insure a double-click
flg_Zone2       equ 1   ;Used to turn off motion detector (ZONE) 2
flg_Deboun      equ 2   ;debouncing in progress
flg_Waita       equ 3   ;timer-2 flags
flg_Waitb       equ 4   ;  "       "
flg_Trig        equ 5   ;  "       "
flg_Amp_On      equ 6
flg_TEMP_On     equ 7

;****************************************************************
;Beginning of program
;****************************************************************
reset:  org 0x00    ;reset vector address
    goto    SetUp   ;goto SetUp
    nop
    nop
    nop
    ORG     4       ;interrupts go to this location
    GOTO    isr1    ;Goto to Interrupt Service Routine

;****************************************************************
;* port A and B initialisation          *
;****************************************************************

SetUp   bcf status,rp1      ;select bank 1
    bsf status,rp0

    movlw   PortA_Config    ;PortA Configuration
    movwf   0x05            ;This is the trisa file
    movlw   PortB_Config    ;PortB Configuration
    movwf   0x06            ;This is the trisb file

    movlw   0x88            ;Fosc/4;No prescaler
    movwf   option          ;Timer configuration

    bcf status,rp0          ;select programming area - bank0
    clrf    0x05        ;Clear Port A of junk
    clrf    0x06        ;Clear Port B of junk
    movlw   0x07            ;turn comparators off and enable
    movwf   cmcon           ;    pins for I/O functions
    goto    Main

;****************************************************************
;* Tables go here               *
;****************************************************************

Table1  addwf 02,1
    retlw 0x08
    retlw 0x1A
    retlw 0xBE
    retlw 0xFF

 ;****************************************************************
;* Interrupt Service Routine goes here      *
;****************************************************************
isr1    movlw   0x80
        movwf   0x2A

;****************************************************************
;* Delay sub-routines go here           *
;****************************************************************

Delay1  XXX     ;Look at input line
    XXX     ;Input LOW
    retlw 0x00

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

Main    XXX
    btfss 06,3  ;Test the input line
    XXX
    XXX
    call Delay1
    XXX
    bsf  0x06,0 ;Make the lowest output HIGH
    XXX
    call Table1
    XXX
    goto Main

    END

To work on Blank_F628.asm, click on Notepad in our Programming folder on the left-side of the screen and load it with the Blank_F628.asm file by sliding it into Notepad. Rename the file immediately and work on the renamed file.
Open Notepad++ or VS Code.
Click on “Blank_F628.asm” file and slide it onto the open Notepad. It will then show in Notepad. Rename the file and save it. Work on the NEW file.
The “Blank_F628.asm” file may appear to be complex, so we have produced a simple version with only the essential details. This is shown in Experiment 1. Click on experiment 1, click on Notepad.exe in the window, slide Expt-1.asm into Notepad.
You can now work on Expt-1.asm
If you want to burn the first experiment into a PIC16F628, you can assemble the .asm file in MPASM to create a .hex file. To do this, place MPASM in a folder such as desktop. Create a short-cut for MPASM.exe and place it on your desktop (or unzip MPASM.zip).
Click on MPASM and it will open.
Place all the .asm and .hex into a folder and call it Experiments.
Locate Expt-1.asm in the folder and load it into MPASM.
Use:
Radix: Default, Warning Level: Default, Hex Output: Default, Generated Files: Error File and List file, Do not tick: Case Sensitive, Macro Expansion: Default, Processor PIC16F628, Tab Size: 8, Tick: Save settings on exit.
Click: Assemble.
Your Expt-1.hex file will be put into the same folder as our Expt-1.hex file, so give your program another name so it does not overwrite the original file.
To burn a PIC16F628, you will need the Multi Chip Programmer. Make sure the programmer is the latest version with 628 on the underside of the PCB.
Connect it to your computer via the serial cable supplied in the kit and the green LED will illuminate.
If you have a laptop, you will have to use MicroChip programmer PICkit-2. This programmer connects to your USB port.
Unzip and Install IC Prog.zip
Click on the folder on the top left-hand side and locate Expt-1.hex
Make sure you have selected PIC16F628 before loading the .hex file.
The configuration settings will be automatically set according to the configuration value supplied in the program - or you can change anything before burning the new program.
Fit a chip into the programmer board (If you use PICkit-2, see above for the layout of the programming board and the plug-and-socket to connect the board to PICkit-2 and use the programming software that comes on a CD with the kit) and click on the “lightning” icon for IC Prog.
The programmer will now burn the program into the chip. The LEDs on the Multi-Chip Programmer will show the action taking place.
When the chip is “burnt,” place it in the socket on the project and push the red button. The red LED will illuminate.
This might seem a lot of work to create a simple effect, but the same amount of work will produce a compete project, such as a simple video game or health monitor - it’s just the size of the program will be different.

Now we will start on a few Experiments:

EXPERIMENT 1

In SetUp, the instructions: movlw 0x07 movwf cmcon turn comparators off and enable all pins for I/O functions - especially RB4 (pin 10), as it is the Low Voltage Programming pin and when it is enabled for low-voltage in-circuit programming, this pin will not operate as an in-out pin.
When the red push-button is pressed, the red LED illuminates. When the button is released, the LED extinguishes.
Experiment 1 consists of 6 lines of code in a sub-routine called Main.
All the other instructions set-up the micro so the ports are ready to “talk” to the outside devices.
The first thing to remember is the micro NEVER stops. It keeps executing instructions at 1,000,000 per second. This means the main sub-routine must be a loop. This is what we have done.
The first instruction in Main: btfss 06,0 is called a “bit testing instruction.” It tests bit zero of Port B to see if the push-button has put a HIGH or LOW on the input. The micro “reads” the value on the line and if it is above about 4v, it is interpreted as a HIGH. If it is below about 2v, it is a LOW.
If it is HIGH, the micro jumps to the third instruction and sets bit 4 of Port B and this turns ON the LED. The micro then goes to Main and executes btfss 06,0 again and the remaining instructions. The micro keeps looping these instructions while the push-button is pressed.
When the button is released, the first instruction finds the input is not set (not HIGH) and goes to the second instruction where it is told to go to Main1. At Main 1 the micro clears bit 4 of
Port B and this turns OFF the LED. The micro then goes to the next instruction where it is told to go to Main. This creates another loop that keeps the LED off. There are two slightly different loops and the micro is constantly looping one of them.

 ;****************************************************************
;* Name of Project: Experiment 1        *
;* Push red button RB0 to turn on red LED RB4   *
;****************************************************************

    list P = 16F628 ;microcontroller identity
        ; e.g: 0x033 = hex value

    __Config 3F18h

;****************************************************************
;Equates
;****************************************************************
status  equ 0x03
cmcon   equ 0x1F
rp1     equ 0x06    ;this is bit 6 in file 03
rp0     equ 0x05    ;this is bit 5 in file 03

;****************************************************************
;Beginning of program
;****************************************************************
reset:  org 0x00    ;reset vector address
    goto    SetUp   ;goto set-up
    nop
    nop
    nop
    org 4   ;interrupts go to this location
    goto    isr1    ;goto to Interrupt Routine  - not used
            ;    in these experiments.
            ;isr1 must be written at address 004
            ;   otherwise bcf status,rp1 will be
            ;   placed at address 01 by assembler!

;****************************************************************
;* Port A and B initialisation          *
;****************************************************************

SetUp   bcf status,rp1  ;select bank 1 (must be = 0)
    bsf status,rp0      ; also to select bank 1

    movlw   0xFF        ;make all Port A inputs
    movwf   0x05
    movlw   0x0F        ; out out out out  in in in in
    movwf   0x06        ;

    bcf status,rp0      ;select programming area - bank0
    movlw   0x07        ;turn comparators off and enable
    movwf   cmcon       ;    pins for I/O functions
    goto    Main

;****************************************************************
;* Interrupt Service Routine will go here (not used)    *
;****************************************************************
isr1

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

Main    btfss   0x06,0  ;Port B, input bit 0 = red button pushed?
    goto    Main1
    bsf 0x06,4  ;Port B, output bit 4 = turn on red LED
    goto    Main
Main1   bcf 0x06,4  ;Port B, output bit 4 = turn off red LED
    goto    Main

    END

EXPERIMENT 2

Experiment 2 adds the orange button and orange LED.
The program will recognise only one button at a time.

 ;****************************************************************
;* Name of Project: Experiment 2        *
;* Push red button to turn on red LED       *
;*  and orange button to turn on orange LED     *
;****************************************************************

    list P = 16F628 ;microcontroller identity
            ; e.g: 0x033 = hex value

    __Config 3F18h

;****************************************************************
;Equates
;****************************************************************
status  equ 0x03
cmcon   equ 0x1F
rp1     equ 0x06
rp0     equ 0x05


;****************************************************************
;Beginning of program
;****************************************************************
reset:  org 0x00    ;reset vector address
    goto    SetUp   ;goto set-up
    nop
    nop
    nop
    org 4   ;interrupts go to this location
    goto    isr1    ;goto to Interrupt Routine  - not used
            ;isr1 must be written at address 004
            ;   otherwise bcf status,rp1 will be
            ;   placed at address 01 by assembler!

;****************************************************************
;* Port A and B initialisation          *
;****************************************************************

SetUp   bcf status,rp1      ;select bank 1 (must be = 0)
    bsf status,rp0       ; also to select bank 1

    movlw   0xFF        ;make all Port A inputs
    movwf   0x05
    movlw   0x0F        ;out out out out    in in in in
    movwf   0x06        ;

    bcf status,rp0      ;select programming area - bank0
    movlw   0x07        ;turn comparators off and enable
    movwf   cmcon       ;    pins for I/O functions
    goto    Main

;****************************************************************
;* Interrupt Service Routine will go here (not used)    *
;****************************************************************
isr1

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

Main    btfsc   0x06,0  ;Port B, input bit 0 = red button pushed?
    goto    Main1   ;Yes
    btfsc   0x06,3  ;Port B, input bit 3 = orange button pushed?
    goto    Main2   ;Yes
    clrf    0x06    ;turn off all LEDs
    goto    Main
Main1   bsf 0x06,4  ;Port B, output bit 4 = turn on red LED
    goto    Main
Main2   bsf 0x06,7  ;Port B, output bit 7 = turn on orange LED
    goto    Main

    END

EXPERIMENT 3

4 push-buttons display 4 LEDs.
This is an extension of experiment 2. It is your job to copy and paste Main into a .asm file, add the set-up instructions and create a .hex file via MPASM:

 ;****************************************************************
;* Name of Project: Experiment 3        *
;* 4 push-buttons and 4 LEDs            *
;****************************************************************
See above for set-up instructions

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

Main    btfsc   0x06,0  ;Port B, input bit 0 = red button pushed?
    goto    Main1   ;Yes
    btfsc   0x06,1  ;Port B, input bit 1 = green button pushed?
    goto    Main2   ;Yes
    btfsc   0x06,2  ;Port B, input bit 2 = yellow button pushed?
    goto    Main3   ;Yes
    btfsc   0x06,3  ;Port B, input bit 3 = orange button pushed?
    goto    Main4   ;Yes
    clrf    0x06    ;turn off all LEDs
    goto    Main
Main1   bsf 0x06,4  ;Port B, output bit 4 = turn on red LED
    goto    Main
Main2   bsf 0x06,5  ;Port B, output bit 5 = turn on green LED
    goto    Main
Main3   bsf 0x06,6  ;Port B, output bit 6 = turn on yellow LED
    goto    Main
Main4   bsf 0x06,7  ;Port B, output bit 7 = turn on orange LED
    goto    Main
    END

EXPERIMENT 4

4 push-buttons in “toggle-mode.” Push red button momentarily and it turns on red LED. Push the button again and the LED turns off.
The program requires “switch-debounce” instructions.
All switches suffer from “bounce” this is the action of the two contacts coming together and moving away very quickly, during the time when the button is pressed or released.
You may think the contacts simply open and close, but they can make a number of connections during the process of coming together or parting. This is due to dirt on the contacts and the rough surface. The micro is executing the program so quickly that it sees these bounces as “opening and closing” and doesn’t know if the LED should be ON or OFF.
To solve this problem we need to put a delay between button-presses of approx 1/10th second (100,000 instructions!).
This means the program will only see the press of a button or the release during each 1/10th second operation.
To change the state of a LED we use an instruction that toggles the corresponding bit on the output port. The instruction is XORWF. The working register (w) is loaded with the bit we want to toggle.
The output port is XOR’ed with w and the result is placed in file 06 (the output port).
You need to know how the XOR function works to understand how the result is produced and this is covered in the PIC Programming Course - XOR.
We will use file 30h for the flag file and files 20h and 21h for the delay sub-routine.
The delay provide “heavy debounce” for the keys and prevents fast-pushing being detected.
The micro is looping the Main routine very quickly and it needs to know when a button has been released so it can perform a toggle action when it detects a button is pressed for the second time.
This information is kept in a “flags file” (file 30h) and the four lowest bits 0, 1, 2, and 3 are used.
To prevent a key “repeating” the flag-bit must be set and cleared. When a key is detected, the flag is tested to see if it is clear. If so, the LED is toggled and the flag is set.
The micro will very quickly produce a second-pass where it detects the key again. It will find the flag is set and no action is taken. When the key is released, the flag bit is cleared.

 ;****************************************************************
;* Name of Project: Experiment 4        *
;* 4 push-buttons and 4 LEDs            *
;****************************************************************

    list P = 16F628 ;microcontroller identity
            ; e.g: 0x033 = hex value

    __Config 3F18h

****************************************************************
;Equates
;****************************************************************
status  equ 0x03
cmcon   equ 0x1F
rp1     equ 0x06    ;this is bit 6 in file 03
rp0     equ 0x05    ;this is bit 5 in file 03
portA   equ 0x05    ;file 5 is Port A
portB   equ 0x06    ;file 6 is Port B
flags   equ 0x30    ;flag file
decrA   equ 0x20    ;file to decrement
decrB   equ 0x21    ;file to decrement


****************************************************************
;Beginning of program
;****************************************************************
reset:  org 0x00    ;reset vector address
    goto    SetUp   ;goto set-up
    nop
    nop
    nop
    org 4           ;interrupts go to this location
    goto    isr1    ;goto to Interrupt Routine  - not used
                    ;isr1 must be written at address 004
                    ;   otherwise bcf status,rp1 will be
                    ;   placed at address 01 by assembler!

;****************************************************************
;* Port A and B initialisation          *
;****************************************************************

SetUp   bcf status,rp1      ;select bank 1 (must be = 0)
    bsf status,rp0       ; also to select bank 1

    movlw   0xFF        ;make all Port A inputs
    movwf   portA
    movlw   0x0F        ; out out out out    in in in in
    movwf   portB       ;

    bcf status,rp0      ;select programming area - bank0
    movlw   0x07        ;turn comparators off and enable
    movwf   cmcon       ;    pins for I/O functions
    goto    Main

;****************************************************************
;* Interrupt Service Routine will go here (not used)    *
;****************************************************************
isr1

;****************************************************************
;Delay sub-routine - approx 130mS
;****************************************************************
delay   movlw   0x80    ;load 80h into w
    movwf       decrA   ;shift 80h into the file for decrementing
delx    nop
    decfsz      decrB,1 ;decrement the file
    goto        delx
    decfsz      decrA,1 ;decrement the file
    goto        delx
    retlw       0x00    ;return

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

Main    clrf    flags
MainA   call    delay   ;1/10 second delay
    btfsc   portB,0     ;file06, input bit 0 = red button pushed?
    goto    Main1   ;Yes
    btfsc   portB,1     ;file06, input bit 1 = green button pushed?
    goto    Main2   ;Yes
    btfsc   portB,2     ;file06, input bit 2 = yellow button pushed?
    goto    Main3   ;Yes
    btfsc   portB,3     ;file06, input bit 3 = orange button pushed?
    goto    Main4   ;Yes
    clrf    flags       ;clear flag file
    goto    MainA   ;No. Loop again

Main1   btfsc   flags,0 ;test red flag
    goto    MainA   ;return if flag is SET
    movlw   0x10        ;set the bit for the red LED
    xorwf   portB,1     ;put answer into file 06 to toggle LED
    bsf flags,0     ;set the red flag
    goto    MainA

Main2   btfsc   flags,1 ;test green flag
    goto    MainA   ;return if flag is SET
    movlw   0x20        ;set the bit for the green LED
    xorwf   portB,1     ;put answer into file 06 to toggle LED
    bsf flags,1     ;set the green flag
    goto    MainA

Main3   btfsc   flags,2 ;test yellow flag
    goto    MainA   ;return if flag is SET
    movlw   0x40        ;set the bit for the yellow LED
    xorwf   portB,1     ;put answer into file 06 to toggle LED
    bsf flags,2     ;set the yellow flag
    goto    MainA

Main4   btfsc   flags,3 ;test orange flag
    goto    MainA   ;return if flag is SET
    movlw   0x80        ;set the bit for the orange LED
    xorwf   portB,1     ;put answer into file 06 to toggle LED
    bsf flags,3     ;set the orange flag
    goto    MainA

    END

EXPERIMENT 5

The buttons can be configured to almost anything. That’s the advantage of using a programmable chip as the basis of the project. They can be configured to turn on any LED or two or three LEDs at the same time or a single button may need to be pressed a number of times to produce an effect.
This experiment is a puzzle. One of the buttons turns on a LED.
It must be pressed in a “time-sequence.” Another button resets the sequence.
You are not told which button to press or the sequence. You have to find out yourself.
You will surprised at the difficulty.
This type of sequence can be used to activate an alarm or entry code to a house or room.
Added security can be provided by locking the system for 15 minutes if more than 10 pushes are detected.
Burn the program into the chip and try to work out the sequence.

 ;****************************************************************
;* Name of Project: Experiment 5        *
;* Push-button puzzle.       Push a button a number     *
;     of times to turn on a LED         *
;****************************************************************

    list P = 16F628 ;microcontroller identity
            ; e.g: 0x033 = hex value

    __Config 3F18h

****************************************************************
;Equates
;****************************************************************
status  equ 0x03
cmcon   equ 0x1F
rp1     equ 0x06    ;this is bit 6 in file 03
rp0     equ 0x05    ;this is bit 5 in file 03
portA   equ 0x05    ;file 5 is Port A
portB   equ 0x06    ;file 6 is Port B
flags   equ 0x30    ;flag file
timerA  equ 0x20    ;file to decrement
timerB  equ 0x21    ;file to decrement
timerC  equ 0x22    ;file to decrement
counter equ 0x23    ;file to increment

****************************************************************
;Beginning of program
;****************************************************************
reset:  org 0x00    ;reset vector address
    goto    SetUp   ;goto set-up
    nop
    nop
    nop
    org 4   ;interrupts go to this location
    goto    isr1    ;goto to Interrupt Routine  - not used
            ;isr1 must be written at address 004
            ;   otherwise bcf status,rp1 will be
            ;   placed at address 01 by assembler!

;****************************************************************
;* Port A and B initialisation          *
;****************************************************************

SetUp   bcf status,rp1      ;select bank 1 (must be = 0)
    bsf status,rp0       ; also to select bank 1

    movlw   0xFF        ;make all Port A inputs
    movwf   portA
    movlw   0x0F        ; out out out out    in in in in
    movwf   portB       ;

    bcf status,rp0      ;select programming area - bank0
    movlw   0x07        ;turn comparators off and enable
    movwf   cmcon       ;    pins for I/O functions
    goto    Main

;****************************************************************
;* Interrupt Service Routine will go here (not used)    *
;****************************************************************
isr1

;****************************************************************
;timer sub-routine - approx 130mS
;****************************************************************
Delay   movlw   0x80    ;load 80h into w
    movwf   timerA      ;shift 80h into the file for decrementing
Delay1  nop
    decfsz  timerB,1    ;decrement the file
    goto    Delay1
    decfsz  timerA,1    ;decrement the file
    goto    Delay1
    retlw   0x00        ;return
;****************************************************************
;* Main                     *
;****************************************************************

Main    clrf    flags
    clrf    counter
MainA   movlw   0x01
    movwf   decrC
    call    delay   ;250mS delay
    btfsc   portB,1 ;file06, input bit 1 = green button pushed?
    goto    Main2   ;Yes
    btfsc   portB,2 ;file06, input bit 2 = yellow button pushed?
    goto    Main3   ;Yes
    btfsc   portB,3 ;file06, input bit 3 = orange button pushed?
    goto    Main4   ;Yes
    clrf    flags   ;clear flag file
    goto    MainA   ;No. Loop again

Main1   btfsc   flags,0 ;test red flag
    goto    MainA   ;return if flag is SET
    movlw   0x10    ;set the bit for the red LED
    xorwf   portB,1 ;put answer into file 06 to toggle LED
    bsf flags,0 ;set the red flag
    goto    MainA

Main2   btfsc   flags,1 ;test green flag
    goto    MainA   ;return if flag is SET
    movlw   0x20    ;set the bit for the green LED
    xorwf   portB,1 ;put answer into file 06 to toggle LED
    bsf flags,1 ;set the green flag
    goto    MainA

Main3   btfsc   flags,2 ;test yellow flag
    goto    MainA   ;return if flag is SET
    movlw   0x40    ;set the bit for the yellow LED
    xorwf   portB,1 ;put answer into file 06 to toggle LED
    bsf flags,2 ;set the yellow flag
    goto    MainA

Main4   btfsc   flags,3 ;test orange flag
    goto    MainA   ;return if flag is SET
    movlw   0x80    ;set the bit for the orange LED
    xorwf   portB,1 ;put answer into file 06 to toggle LED
    bsf flags,3 ;set the orange flag
    goto    MainA

    END

Start Here with PIC16F628

This project uses the Simon PCB

Go to Simon project for details.

Kits for Simon can be obtained from Talking Electronics:
http://www.talkingelectronics.com


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