| 
     PIC16F628 Data 
		(2.6MB .pdf)Instruction Set for PIC16F628
 PIC16F628A.INC
 Library of Routines 
		A-E  
		E-P    
		P-Z
 Blank_F628.asm 
		or  Blank_F628.txt
 Notepad.exe or Unzip 
Notepad.zip.
 
 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.
 
     
         
       
  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.
 
     
          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 Data 
		(2.6MB .pdf). 
     
          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 
			PIC16F628If 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 CURRENTRA4 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" MODESThe 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.
 
     
          
 
	
		
			| 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.
 |  
			| 
			 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 
						microcontrollerNote: 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 PIC16F628The 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. It has taken over from the 
PIC16F84A and is now the cheapest and best way to start in 
microcontroller-design.
 (The PIC12F629 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."
 
       
        BLINK A LEDHere 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.
 
 HOW THE LED BLINKS
 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.exe or Unzip 
Notepad.zip.
 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.
 Install IC Prog on 
your desktop or unzip 
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 2Experiment 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 34 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 44 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
 |  |  
    |  |    4-6-2012 
         
 
 |