Anda di halaman 1dari 63

INTRODUCTION TO PIC MICROCONTROLLERS

• The PIC was originally designed as a Peripheral Interface Controller


(PIC) for a 16-bit microprocessor.
• It was essentially an I/O controller and was designed to be very fast.
• It had a small microcoded instruction set.
• The PIC16F84 (or PIC16F84A) microcontroller is unique because its
program memory is made using Flash technology.
• It can be programmed, tested in-circuit and reprogrammed if necessary in
a matter of a few minutes and without the need for a UV EPROM eraser.
• It is a small device (I8-pin), readily available to all including hobbyists
and students at a cost of $6.00 (at this writing) in single quantity.
• Think of the PIC16F84 as a custom I/O handler. It looks at its inputs and,
based on what it sees, it sends signals out its outputs. You can customize
it to do what you want via programming.
• It is not a heavy duty number cruncher or data manipulator.
• The MPASM tm assembler from Microchip Technology (manufacturer of
PIC family) is the PIC assembler of choice for use in this notes because:
• It is free from Microchip. Most people who are into PICs speak
"MPASM".
• Most examples in magazines and on the Internet are written in the
MPASM dialect.
• Microchip makes the PICSTART Plus (tm) programmer which will
program all PIC microcontrollers.
• The PIC16F84, MPASM assembler (either stand alone or as part of
MPLAB) and a low cost PIC16F84 programmer make a very inexpensive
development system and a great way to get started creating
microcontroller based projects.
• What you learn using the PIC16F84 is directly applicable to the whole
line of PIC microcontrollers.

• Learning how PICs work and how to apply them involves study in three
areas:
• IBM compatible computer use (as needed).
• Assembler
• PIC itself.

EE313 Microprocessor Applications 1 R Singh


• PICs are not easy to write code for by hand because they are not intuitive.
Many instructions require setting or clearing a bit to specify the
destination for the result of executing the instruction.
• This is OK as an initial learning experience, but would become tedious
very soon. So use of "power tools" is essential. This means learning to
use an IBM compatible computer if you haven't already done so. It also
means learning to use an assembler which converts English-like readable
instructions into machine language understood by the PIC itself.
• Finally, learning about the PIC's inner workings is possible once use of
the power tools is understood.
• The object is to make this process as easy and enjoyable as possible.
Once you get through this and you have programmed a PIC16F84 for the
first time, a whole new-world awaits. You will be able to create more
interesting projects and have more fun!
• The usual approach to teaching the use of the PIC has been to get into all
of the assembler commands and then show advanced examples. There
has been no simple example showing how to get started. As usual, only 5
percent of this information is needed to get started, but which 5 percent.
• The approach taken in this course will be to give you the 5 percent you
need to get going.

PIC16F84 PRODUCT OVERVIEW


This course uses the PICl6F84 as examples to get you started. The emphasis
is on the mid-range (14-bit core) product. The 12-bit core designates the
instruction word length. You really won't care how many bits there are in an
instruction word, but it is the basis on which Microchip divides up their
product line. The following brief tables are for reference:

EE313 Microprocessor Applications 2 R Singh


1.1 PARTS IS PARTS
• As the Microchip microcontroller product line grows, and I am glad that
it is, the part numbering convention/system seems to be getting a bit
involved.
• The microcontroller product line designation has been changed from
PIC16/17 TM to PICmicro TM.
• The real key to sanity here is to recognize that there are three
fundamental product groups in terms of how they function and, to some
extent, how program code must be written for them.
• The three product groups have 12-bit, 14-bit and 16-bit cores.
• We don't really care how many bits are in an instruction word. We just
need to know which set of rules and features apply when writing code for
a selected chip. Here are some popular examples:

EE313 Microprocessor Applications 3 R Singh


PIC16F84
PINS and FUNCTIONS

• The PICI6F84 is fabricated using CMOS technology. It consumes very


little power and is fully static meaning that the clock can be stopped and
all register contents will be retained.
• The maximum sink or source current for a port at any given time is as
follows:

• Supply current is primarily a function of operating voltage, frequency


and I/O pin loading and is typically 2 mA or so for a 4MHz clock
oscillator. This drops to approximately 40 microamps in the sleep mode.
• Because the device is CMOS, all inputs must go somewhere. All unused
inputs should be pulled up to the supply voltage (usually +5 VDC).

EE313 Microprocessor Applications 4 R Singh


PACKAGE

• The PIC16F84 is available in an 18-pin DIP package suitable for the


experimenter. The part number is PICI6F84-04/p for the 4 MHz part.

CLOCK OSCILLATOR

• Four different types of clock oscillators may be used with PICI6F84 parts
in general. The clock oscillator types are:
• RC -resistor/capacitor.
• XT -crystal or ceramic resonator -external clock.
• HS -high speed crystal or ceramic resonator -external clock.
• LP -low power crystal –external clock.

• At programming time, the PIC must be told via configuration bits what
type of oscillator it will be connected to.
• The details of various oscillator circuits and components are given in the
Microchip data book available online.
• One possible clock circuit for experimentation is a 4 MHz crystal-
controlled oscillator (type XT). They are accurate, always start and the
math required for designing time delay loops is simple.
• The external clock frequency is divided by 4 internally, so the internal
clock frequency is 1MHz.
• Almost all instructions are executed in one instruction (internal clock)
cycle or 1microsecond in this case. This is reasonably fast for
experimenting purposes.

EE313 Microprocessor Applications 5 R Singh


• Ceramic resonators with built-in capacitors are small and inexpensive
while providing good accuracy (+/- 1.3 percent or better). They look a lot
like a small ceramic capacitor except for the fact they have three leads. A
typical device looks like this:

• An RC clock circuit may also be used where cost is an issue and timing
accuracy is not. The oscillator type code is RC.

CONFIGURATIONBITS

The configuration bits are located in Flash memory outside the main part of
Flash memory used for program storage. There are five configuration bits.
Two select clock oscillator type, one is the watchdog timer enable bit, one is
the power-up timer enable bit and one is the code protection bit. The device
programmer accesses these bits during the device programming procedure.

EE313 Microprocessor Applications 6 R Singh


RESET

• The PICl6F84 has built-in power-on reset which works as long as the
power supply voltage comes up quickly. Commonly the MCLR pin is
merely tied to the power supply. A switch may be used to regain control
if things run away.

PORTS

• Port A is 5 bits/lines wide


• Port B is 8 bits/lines wide or byte-wide.
Each port line may be individually programmed as an input line or output
line. This is done using a special instruction, which matches a bit pattern
with the port lines. A "0" associated with a port line makes it an output, a" 1"
makes it an input.

The PIC16F84 has port data direction registers as many other


microcontrollers do. Using the port data direction registers involves file
register bank switching which we will avoid for now.
So the initial programming examples will use an obsolete instruction (TRIS)
to avoid having to deal with bank switching at this early stage. A benefit of
this is backward compatibility. You will need to learn to use this technique if
you choose to work with base-line parts (PIC16C5X series).

• The Port B lines have weak pullup resistors on them which may be
enabled or disabled under software control.
• All 8 resistors are enabled/disabled as a group via the RBPU bit in the
option register. The pullup resistor on an individual port line is

EE313 Microprocessor Applications 7 R Singh


automatically turned off when that line is configured as an output. The
pullups are disabled on power-on reset.
• Port A, bit 4 is shared with the external timer/counter input called
T0CKI. As a digital input line, the input is Schmitt trigger. As a digital
output line, it is open drain, so a pullup resistor is required. The output
cannot source current, it can only sink current.
• All unused port lines should be tied to the power supply (CMOS rule -all
inputs must go somewhere).
• On reset, all port lines are inputs.

SPECIAL FEATURES

Watchdog Timer
The watchdog timer is useful in some control applications where a runaway
program could cause a safety problem. We will not deal with it except to say
that it is important to select "watchdog timer off' when programming the
configuration bits.

Power-up Timer
The power-up timer should be selected "ON" when programming the
configuration bits.

Sleep Mode
The feature of the "sleep mode" is to drastically reduced power consumption
achieved by turning off the main clock oscillator.

EE313 Microprocessor Applications 8 R Singh


2.0 The PIC16F84 Microcontroller

The block diagram for the PIC16F84 microcontroller is shown in Figure 2.0.

Figure 2.0: PIC16F84 block diagram. (Courtesy of Microchip Technology Inc.)

2.1 Features of PIC16F84


• 8-bit wide data bus CMOS microcontroller
• 18-pin DIP, SOIC
• 1792 bytes of flash EEPROM program memory subdivided into 14-bit
words (0h–3Fh)
• 68 bytes of RAM data memory
• 64 bytes of nonvolatile EEPROM data memory
• 1024 (1 k) instructions capability.
• 4 MHz clock speed (max. 10 MHz)
• 15 special function hardware registers
• 36 general purpose registers (SRAM)
• 13 I/O pins (5-PORT A , 8-PORT B)
2.2 The PIC16F84 Architecture
PICs use the Harvard architecture since its program memory and data
memory are accessed from different memories. This offers an improvement
over the von Neumann architecture in which the program and data are

EE313 Microprocessor Applications 9 R Singh


accessed simultaneously from the same memory (accesses over the same
bus).

2.3 Memory Organization


There are two memory blocks in the PIC16F84.

• Program memory
• Data memory.

Each memory-block has its own bus to allow simultaneous accessing during
the same oscillator cycle. This is the Harvard architecture, which improves
bandwidth over traditional von Neumann architecture.

Program Memory (Flash) Organization


The PIC16F8X has eight stack levels that can page each program memory
space of 1K so that the total memory space of 8K can be utilized as shown in
Figure 2.3.
The first 1Kx14 (0000h – 03FFh) are physically implemented as shown.
Conceptually, the configuration is similar to layers used in commercial
drafting packages.
The reset vector is at 0000h and the interrupt vector is at 0004h location.
Accessing a location above the physically implemented address will result in
wrap around. For example, locations 10h, 410h, 810h, C10h, 1010h, 1410h,
1810h, 1C10h will be the same instructions in each of the eight pages, each
being 1K different from the other. This is because

400h = 1024 (1K)


800h = 2048 (2K)
C00h = 3072 (3K)
1000h = 4096 (4K)
1400h = 5120 (5K)
1800h = 6144 (6K)
1C00h = 7164 (7K)

EE313 Microprocessor Applications 10 R Singh


Figure 2.3: PIC16F84 program memory organization

Data Memory (RAM) Organization


The PIC16F8X data memory is partitioned into two areas as shown in Figure
2.4.
• 12 special function registers (SFRs)
• 68 general purpose registers (GPRs within the RAM)

The special function registers (SFRs) are used by the CPU and peripheral
functions to control the device operation (these registers are SRAM) and
occupy the first 12 file addresses corresponding to 80h (128) up to 8Bh
(139), i.e. (128, 129, .., 138, 139).

The general purpose registers (GPRs) commence from 8Ch (140) up till
CFh (207), so that there are a total of (207 – 140 + 1) = 68.
The unimplemented data memory locations commence from D0h (208) up
till FFh (255), so that there are a total of (255 – 208 + 1) = 48.
There are two banks: banks 0 and 1. For bank 0, the 12 SFRs are from 00h
(0) to 0Bh (11) or 11 – 0 + 1 = 12 addresses. The 68 GPRs are from 0Ch
EE313 Microprocessor Applications 11 R Singh
(12) to 4Fh (79) or (79 – 12 + 1) = 68, the unimplemented are from 50h (80)
to 7Fh (127) or (127 – 80 + 1) = 48.

Figure 2.4: PIC16F84 data memory organization

EE313 Microprocessor Applications 12 R Singh


Bank 0 and Bank 1 Mapping and Selection
The GPR addresses in bank 1 are mapped to addresses in bank 0. For
example, address location 4Fh and CFh will access the same GPR.

3.0 Special Features of the PIC CPU


• OSC selection
• Reset
• Interrupts
• Watchdog Timer (WDT)
• SLEEP
• Code Protection
• ID locations
• In-circuit serial programming

3.1 Working (W) register or accumulator

When a program is compiled and downloaded to a PIC, it is stored as a set of


binary machine code instructions in the flash program memory.

These instructions are sequentially fetched from memory, placed in the


instruction register, and executed.

Each instruction corresponds to a low-level function implemented with logic


circuits on the chip.

For example, one instruction might load a number stored in RAM or


EEPROM into the working register, which is also called the W register or
accumulator; the next instruction might command the ALU to add a
different number to the value in this register; and the next instruction might
return this summed value to memory.

Since an instruction is executed every four clock cycles, the PIC16F84 can
do calculations, read input values, store and retrieve information from
memory, and perform other functions very quickly. With a clock speed of 4
MHz an instruction is executed every microsecond and 1 million instructions
can be executed every second.

EE313 Microprocessor Applications 13 R Singh


The microcontroller is referred to as 8-bit, because the data bus is 8 bits
wide, and all data processing and storage and retrieval occur using bytes.

3.2 File Registers

The RAM, in addition to providing space for storing data, maintains a set of
special purpose byte-wide locations called file registers. The bits in these
registers are used to control the function and indicate the status of the
microcontroller.

3.3 Watch-dog timer

A useful special purpose timer, called a watch-dog timer, is included on PIC


microcontrollers. This is a count-down timer that, when activated, needs to
be continually reset by the running program. If the program fails to reset the
watch-dog timer before it counts down to 0, the PIC will automatically reset
itself. In a critical application, you might use this feature to have the
microcontroller reset if the software gets caught in an unintentional endless
loop.

3.4 PORTS

The PIC16F84 is packaged on an 18-pin DIP IC that has the pin schematic
(pinout) shown in Figure 3.4.

The figure also shows the minimum set of external components


recommended for the PIC to function properly.

Table 3.4 lists the pin identifiers in natural groupings, along with their
descriptions. The five pins RA0 through RA4 are digital I/O pins
collectively referred to as PORTA, and the eight pins RB0 through RB7 are
digital I/O pins collectively referred to as PORTB. In total, there are 13 I/O
lines, called bidirectional lines because each can be individually configured
in software as an input or output. PORTA and PORTB are special purpose
file registers on the PIC that provide the interface to the I/O pins. Although
all PIC registers contain 8 bits, only the 5 least significant bits (LSBs) of
PORTA are used.

EE313 Microprocessor Applications 14 R Singh


Figure 3.4: PIC16F84 pin-out and required external components

TABLE 3.4

3.5 Interrupt

EE313 Microprocessor Applications 15 R Singh


An important feature of the PIC, available with most microcontrollers, is its
ability to process interrupts.

An interrupt occurs when a specially designated input changes state. When


this happens, normal program execution is suspended while a special
interrupt handling portion of the program is executed.

In the PIC16F84, pins RB0 and RB4 through RB7 can be configured as
interrupt inputs.

Power and ground are connected to the PIC through pins Vdd and Vss. The
dd and ss subscripts refer to the drain and source notation used for MOS
transistors, since a PIC is a CMOS device. The voltage levels (e.g., Vdd =
5V and Vss = 0 V) can be provided using a DC power supply or batteries
(e.g., four AA batteries in series or a 9-V battery connected through a
voltage regulator).

The master clear pin ( MCLR ) is active low and provides a reset feature.
Grounding this pin causes the PIC to reset and restart the program stored in
EEPROM. This pin must be held high during normal program execution.
hence connected with a pull-up resistor.

To provide a manual reset feature to a PIC design, you can add a normally
open (NO) pushbutton switch as shown in Figure 3.5. Closing the switch
grounds the pin and causes the PIC to reset.

Figure 7.8 Reset switch circuit

4.0 Programming a PIC using Assembly Language

EE313 Microprocessor Applications 16 R Singh


Various software development tools can assist in testing and debugging
assembly language programs written for a microcontroller.

Simulator: This is software that runs on a PC and allows the microcontroller


code to be simulated (run) on the PC. Most programming errors can be
identified and corrected during simulation.

Emulator: This is a hardware that connects a PC to the microcontroller in a


prototype control system. It usually consists of a printed circuit board
connected to the control system through ribbon cables. The emulator can be
used to load and run a program on the actual microcontroller attached to the
control system hardware (containing sensors, actuators, and control circuits).
The emulator allows the PC to monitor and control the operation of the
microcontroller while it is embedded in the control system.

Instruction Set
The assembly language used to program a PIC16F84 consists of 35
commands that control all functions of the PIC. This set of commands is
called the instruction set for the microcontroller.

The complete instruction set and brief command descriptions for the
PIC16F84 are listed in Table 4.0.

Each command consists of a name called the mnemonic and, where


appropriate, a list of operands. Values must be provided for each of these
operands.

The letters f, d, b, and k correspond, respectively, to a file register address (a


valid RAM address), result destination (0: W register, 1: file register), bit
number (0 through 7), and literal constant (a number between 0 and 255).
Note that many of the commands refer to the working register W, also called
the accumulator. This is a special CPU register used to temporarily store
values (e.g., from memory) for calculations or comparisons.

TABLE 4.0

EE313 Microprocessor Applications 17 R Singh


EE313 Microprocessor Applications 18 R Singh
BCF f, b (read BCF as “bit clear f”)
clears bit b in file register f to 0, where the bits are numbered from 0 (LSB)
to 7 (MSB)

For example, BCF PORTB, 1 makes bit 1 in PORTB go low (where PORTB
is a constant containing the address of the PORTB file register). If PORTB
contained the hexadecimal (hex) value FF (binary 11111111) originally, the
final value would be hex FC (binary 11111101). If PORTB contained the
hex value A8 (binary 10101000) originally, the value would remain
unchanged.

MOVLW k (read MOVLW as “move literal to W”)


stores the literal constant k in the accumulator (the W register)

For example, MOVLW 0xA8 would store the hex value A8 in the W register.
In assembly language, hexadecimal constants are identified with the 0x
prefix.

RLF f, d (read RLF as “rotate f left ”)


shifts the bits in file register f to the left 1 bit, and stores the result in f if d is
1 or in the accumulator (the W register) if d is 0. The value of the LSB will
become 0, and the original value of the MSB is lost.

For example, if the current value in PORTB is hex 1F (binary 00011111),


then RLF PORTB, 1 would change the value to hex 3E (binary 00111110).

SWAPF f, d (read SWAPF as “swap nibbles in f”)


exchanges the upper and lower nibbles (a nibble is 4 bits or half a byte) of
file register f and stores the result in f if d is 1 or in the accumulator (the W
register) if d is 0

For example, if the memory location at address hex 10 contains the value
hex AB, then SWAPF 0x10, 0 would store the value hex BA in the W
register. SWAPF 0x10, 1 would change the value at address hex 10 from hex
AB to hex BA.

EE313 Microprocessor Applications 19 R Singh


5.0 FLOWCHATS to represent Programs

Figure 5.0 FLOWCHART symbols

EE313 Microprocessor Applications 20 R Singh


PROGRAMMING EXERCISE 1

You are required to write an assembly program such that PORTA and
PORTB of the PIC16F84 IC become output ports. Then output data 01H and
0FH at PORTA and PORTB respectively. Continue this operation in an
infinite loop.

• We first need to define the worded problem as a flow chart.

START

(HEADER)
list p=16F84
radix hex

Set PORTA as OUTPUT

Set PORTB as OUTPUT

Clear PORTA

Clear PORTB

Output 0FH at PORTB

Output 01H at PORTA

END

EE313 Microprocessor Applications 21 R Singh


• Next we can attempt to write the assembly program
;============EE313L1.ASM========================10/03/04=================================
;
;This program would teach you the basics of making PORTA and PORTB Ouput ports
;and using it to turn on and off respective LEDs.
;
;----------------------------------------------------------------------------------------
; (HEADER) /Assembler Directives/
;

list p=16f84
radix hex
;-----------------------------------------------------------------------
; (EQUATES)
;

porta equ 0x05 ;equate "porta" to point to file register (SPR) 0x05
portb equ 0x06 ;equate "portb" to point to file register (SPR) 0x06

;------------------------------------------------------------------------
;(ORIGIN)
;

org 0x000 ;program originates at location 0x00


;----------------------------------------------------------------------------------------
------
; (MAIN PROGRAM)
;

start movlw 0x00 ;load W register with 0x00


tris porta ;copy W to tristate buffer of PRORTA. PORTA set as output

movlw 0x00 ;load W register with 0x00


tris portb ;copy W to tristate buffer of PRORTB. PORTB set as output

clrf porta ;clear all pins of porta to low


clrf portb ;clear all pins of portb to low

go movlw 0x0F ;laod W register with 0x0F


movwf portb ;output W to portb
movlw 0x01 ;laod W register with 0x01
movwf porta ;output W to portb

goto go ;repeat

;----------------------------------------------------------------------------------------
;(END OF MAIN PROGRAM)
;

end
;----------------------------------------------------------------------------------------

EE313 Microprocessor Applications 22 R Singh


PROGRAMMING EXERCISE 2

You are required to write an assembly program such that PORTA and
PORTB of the PIC16F84 IC become output ports. Then output data 05H and
E0H at PORTA and PORTB respectively. Continue this operation in an
infinite loop.

• We first need to define the worded problem as a flow chart.

START

(HEADER)
list p=16F84
radix hex

Set PORTA as OUTPUT

Set PORTB as OUTPUT

Clear PORTA

Clear PORTB

Output 05H at PORTA

Output E0H at PORTB

END

EE313 Microprocessor Applications 23 R Singh


• The assembly program can be written as follows
;============EE313L2.ASM========================10/03/04=================================
;
;This program would teach you the basics of making PORTA and PORTB Output ports
;and using it to turn on and off respective LEDs.
;
;----------------------------------------------------------------------------------------
; (HEADER) /Assembler Directives/
;
list p=16f84
radix hex
;----------------------------------------------------------------------------------------
; (EQUATES)
;

porta equ 0x05 ;equate porta to point to file register (SPR) 0x05
portb equ 0x06 ;equate portb to point to file register (SPR) 0x06

;----------------------------------------------------------------------------------------
;(ORIGIN)
;
org 0x000 ;program originates at location 0x00
;----------------------------------------------------------------------------------------
----------
; (MAIN PROGRAM)
;
start movlw 0x00 ;load W register with 0x00
tris porta ;copy W to tristate PRORTA --> PORTA set as output

movlw 0x00 ;load W register with 0x00


tris portb ;copy W to tristate PRORTB --> PORTA set as output

clrf porta ;clear all lines of porta to low


clrf portb ;clear all lines of portb to low

go
bsf porta,0 ;set bit 0 of porta file register
bsf porta,2 ;set bit 2 of porta file register
bsf portb,5 ;set bit 5 of portb file register
bsf portb,6 ;set bit 6 of portb file register
bsf portb,7 ;set bit 7 of portb file register

goto go ;repeat

;----------------------------------------------------------------------------------------
;(END OF MAIN PROGRAM)
;
end
;----------------------------------------------------------------------------------------

EE313 Microprocessor Applications 24 R Singh


PROGRAMMING EXERCISE 3

You are required to write an assembly program such that PORTA (RA0)
becomes an input and PORTB (RB0) an output port respectively. Next,
connect a SWITCH (Switch 5) to RA0 and a LED (Led1) to RB0. Write an
assembly program so that the LED turns on each time the switch is pressed.

• We first need to define the worded problem as a flow chart.

START

(HEADER)
list p=16F84
radix hex

Set PORTA (RA0) as INPUT

Set PORTB (RB0) as OUTPUT

Clear PORTA

Clear PORTB

Is
SWITCH
Pressed ? N

Turn ON LED

END

EE313 Microprocessor Applications 25 R Singh


• The assembly program can be written as follows
;============EE313L3.ASM========================10/03/04=================================
;
;This program would teach you the basics of making PORTA an input port and PORTB an
;output port. A SWITCH5 would be connected to RA0 which when pressed would turn on LED1
;connected to RB0.
;
;----------------------------------------------------------------------------------------
; (HEADER) /Assembler Directives/
;
list p=16f84
radix hex
;----------------------------------------------------------------------------------------
; (EQUATES)
;

porta equ 0x05 ;equate porta to point to file register (SPR) 0x05
portb equ 0x06 ;equate portb to point to file register (SPR) 0x06

;----------------------------------------------------------------------------------------
;(ORIGIN)
;
org 0x000 ;program originates at location 0x00
;----------------------------------------------------------------------------------------
; (MAIN PROGRAM)
;
movlw 0x01 ;load W register with 0x01
tris porta ;copy W to tristate PRORTA --> PORTA RA0 set as input

movlw 0xFE ;load W register with 0xFE


tris portb ;copy W to tristate PRORTB --> PORTB RB0 set as output

start clrf porta ;clear all lines of porta to low


clrf portb ;clear all lines of portb to low

begin btfss porta,0 ; if switch5 at RBO pressed skip next line else test for
;switch pressed.
goto begin ;goto begin

bsf portb,0 ;turn on LED1 connected to RB0

goto start ;repeat

;-------------------------------------------------------------------------
;(END OF MAIN PROGRAM)
;
end
;-------------------------------------------------------------------------

EE313 Microprocessor Applications 26 R Singh


PROGRAMMING EXERCISE 4

You are required to write an assembly program such that PORTA (RA0)
becomes an input and PORTB (RB0) an output port respectively. Next,
connect a SWITCH (Switch 5) to RA0 and a LED (Led1) to RB0. Write an
assembly program so that the LED flickers (on/off) each time the switch is
pressed.

• We first need to define the worded problem as a flow chart.


START

(HEADER)
list p=16F84
radix hex

Set PORTA (RA0) as INPUT

Set PORTB (RB0) as OUTPUT

Clear PORTA

Clear PORTB

Is
SWITCH
Pressed ? N

Y
Turn ON LED

DELAY

Turn OFF LED

DELAY

END

EE313 Microprocessor Applications 27 R Singh


• The assembly program can be written as follows
;============EE313L4.ASM========================10/03/04==============================
;
;This program would teach you the basics of making PORTA an input port and PORTB an
;output port and using a delay subroutine to flicker a LED.
;A SWITCH5 would be connected to RA0 which when pressed would flicker LED1 connected
;to RB0.
;
;-------------------------------------------------------------------------------------
; (HEADER) /Assembler Directives/
;
list p=16f84
radix hex
;-----------------------------------------------------------------------
; (EQUATES)
;

porta equ 0x05 ;equate porta to point to file register (SPR) 0x05
portb equ 0x06 ;equate portb to point to file register (SPR) 0x06
count1 equ 0x0C
count2 equ 0x0D

;------------------------------------------------------------------------
;(ORIGIN)
;
org 0x000 ;program originates at location 0x00
;-------------------------------------------------------------------------------------
; (MAIN PROGRAM)
;
movlw 0x01 ;load W register with 0x01
tris porta ;copy W to tristate PRORTA --> PORTA RA0 set as input

movlw 0xFE ;load W register with 0xFE


tris portb ;copy W to tristate PRORTB --> PORTB RB0 set as output

start clrf porta ;clear all lines of porta to low


clrf portb ;clear all lines of portb to low, turn off LED1

begin btfss porta,0 ; if switch5 at RBO pressed skip next line else test for
;switch pressed.
goto begin ; goto begin

bsf portb,0 ;turn on LED1 connected at RB0


call delay ; delay for (256 x 256 micro second)
bcf portb,0 ;turn off LED1 connected at RB0
call delay ;delay for (256 x 256 micro second)

goto start ;repeat by going to begin

;-------------------------------------------------------------------------
;(SUBROUTINE PROGRAM)
delay movlw 0xFF ;load Decimal FF in W register
movwf count1 ;load Count1 with contents of W register
loadC2 movlw 0xFF ;load Decimal FF in W register
movwf count2 ;load Count2 with contents of W register
decC2 decfsz count2,f;decrement counter2 and skip next line if Z=0
goto decC2 ; if count2 not 0 than go to decC2
decfsz count1,f;decrement counter1 and skip next line if Z=0
goto loadC2 ; if count1 not 0 than go to loadC2
return ;else jump out of subroutine

;-------------------------------------------------------------------------
;(END OF MAIN PROGRAM)
;
end
;-------------------------------------------------------------------------

EE313 Microprocessor Applications 28 R Singh


6.0 MINI-PROJECT 1

Using all the experience gained from the four programming exercises
covered in class, you are required to complete a small project.

First connect a push button switch SW1 to PORTB (RB0) and two LEDs
to PORTA i.e. LED1 to RA0 and LED2 to RA1 as shown in Figure 1.0.

Write a simple assembly program so that each time SW1 is pressed


LED1 turns ON. Once SW1 has been pressed 5 times LED2 should also
turn ON. Repeat this process.

Figure 6.0 Circuit diagram for Mini-Project 1

EE313 Microprocessor Applications 29 R Singh


7.0 SWITCH DEBOUNCE

When a button is opened or closed, we perceive that it is a clean operation


that really looks like a step function. In reality, the contacts of a switch
bounce when they make contact, resulting in a jagged signal as shown in
Figure 7.0.

Figure 7.0 Oscilloscope picture of switch debounce

When this signal is passed to a PICmicro® MCU, the microcontroller can


recognize this as multiple button presses, which will cause the application
software to act as if multiple, very fast button presses have occurred.

To avoid this problem the “noisy” switch press is “debounced” into an


idealized “press,” or the step function as shown in Figure 7.1.

Figure 7.1 Idealized switch operation

Two common methods are used to debounce button inputs.

EE313 Microprocessor Applications 30 R Singh


(i) Software Solution

When a switch is pressed the jagged signal would last for less than 20ms.
So incorporating a 20ms delay subroutine after reading a switch input
and repeating to read the switch input would solve the debounce problem.

START

(HEADER)
list p=16F84
radix hex

Set PORTA (RA0) as INPUT

Set PORTB (RB0) as OUTPUT

Clear PORTA

Clear PORTB

Is
SWITCH
Pressed ? N

DELAY for 20ms


(avoids debounce)

Turn ON LED

END

EE313 Microprocessor Applications 31 R Singh


(i) Hardware Solution

If you don’t want to use the software approach, you can use a capacitor to
filter the bouncing signal and pass it into a Schmitt trigger input. Schmitt
trigger inputs have different thresholds, depending on whether the signal is
rising or falling. For rising edges, the trigger point is higher than falling.
Schmidt trigger inputs have the “hysteresis” symbol put in the buffer as
shown in Figure 7.2.

Figure 7.2 Debounce switch using a Schmitt trigger

7.1 Switch Scan Subroutine


; (MAIN PROGRAM)

call IsSwtPrs ;subroutine to check if switch pressed


call TurnOnLED ;subroutine to turn on LED
.
.
.
call IsSwtPrs ;subroutine to check if switch pressed

;(SUBROUTINE PROGRAM)

;--------------------------------- Switch Scan Subroutine------------------------------------------------


IsSwtPrs btfss portb,0 ; if switch at RBO pressed (close) skip next line else test
; for switch pressed.
goto IsSwtPrs; goto IsSwtPrs
call Delay
IsSwtCls btfsc portb,0 ; if switch at RBO open, skip next line else test for
;switch opened.
goto IsSwtCls ;goto IsSwtCls
return ;jump out of switch scan subroutine

;-------------------Delay Subroutine-----------------------------------------------------
Delay movlw 0xFF ;load Decimal FF in W register
movwf count1 ;load Count1 with contents of W register
loadC2 movlw 0xFF ;load Decimal FF in W register
movwf count2 ;load Count2 with contents of W register
decC2 decfsz count2,f;decrement counter2 and skip next line if Z=0
goto decC2 ; if count2 not 0 than go to decC2
decfsz count1,f;decrement counter1 and skip next line if Z=0
goto loadC2 ; if count1 not 0 than go to loadC2
return ;else jump out of subroutine

EE313 Microprocessor Applications 32 R Singh


• The flow chart for the problem in Mini Project 1 is as follows

START

Set PORTB (RB0) as INPUT


Set PORTA (RA0&RA1) as OUTPUT

COUNT3 = 5

Clear PORTA (LEDs OFF)

SWITCH SCAN SUBROUTINE

Turn ON LED1

DELAY SUBROUTINE

Decrement COUNT3

Is
COUNT3=0 ?
N

Turn ON LED2

DELAY SUBROUTINE

END

EE313 Microprocessor Applications 33 R Singh


;============EE313MINIPROJECT1===============10/03/04==========================================
;Write a simple assembly program so that each time SW1 is pressed LED1 turns ON. Once SW1 has been pressed 5 times LED2 should also
; turn ON. Turn OFF both LEDs and Repeat the process.
;----------------------------------------------------------------------------------------------
;(HEADER) /Assembler Directives/
;
list p=16f84
radix hex
;----------------------------------------------------------------------------------------------
; (EQUATES)
;
porta equ 0x05 ;equate porta to point to special file register (SFR) 0x05
portb equ 0x06;equate portb to point to special file register (SFR) 0x06
count1 equ 0x0C;equate portb to point to general purpose register(GPR) 0x0C
count2 equ 0x0D;equate portb to point to general purpose register(GPR) 0x0D
count3 equ 0x0D;equate portb to point to general purpose register(GPR) 0x0E

;----------------------------------------------------------------------------------------------
;(ORIGIN)
;
org 0x000 ;program originates at location 0x00
;----------------------------------------------------------------------------------------------
; (MAIN PROGRAM)
;
movlw 0xFC ;load W register with 0xFC
tris porta ;copy W to tristate PRORTA --> PORTA RA0 & RA1 set as input

movlw 0x01 ;load W register with 0xFE


tris portb ;copy W to tristate PRORTB --> PORTB RB0 set as input

reset movlw 0x05 ;load W register with 0x05


movwf count3 ;count3 = 05

start clrf porta ;clear all lines of porta to low (LED1 & LED2 OFF)

begin call IsSwtPrs; call Switch Scan Subroutine

bsf porta,0 ;turn on LED1 connected at RA0


call delay ; delay for (~256 x 256 micro second)
decfsz count3,1; decrement count3: if Z=0, skip next line
goto start;
bsf porta,1 ;turn on LED2 connected at RA1
call delay ;delay for (~256 x 256 micro second)
goto reset ;repeat by going to reset

;--------------------------------- Switch Scan Subroutine----------------------------------------------------


IsSwtPrs btfss portb,0 ; if switch at RBO pressed (close) skip next line else test
; for switch pressed.
goto IsSwtPrs ; goto IsSwtPrs
call delay ;
IsSwtCls btfsc portb,0 ; if switch at RBO open, skip next line else test for
;switch opened.
goto IsSwtCls ;goto IsSwtCls
return ;jump out of switch scan subroutine
;--------------Delay Subroutine---------------------------------------------------------------
delay movlw 0xFF ;load Decimal FF in W register
movwf count1 ;load Count1 with contents of W register
loadC2 movlw 0xFF ;load Decimal FF in W register
movwf count2 ;load Count2 with contents of W register
decC2 decfsz count2,f;decrement counter2 and skip next line if Z=0
goto decC2 ; if count2 not 0 than go to decC2
decfsz count1,f;decrement counter1 and skip next line if Z=0
goto loadC2 ; if count1 not 0 than go to loadC2
return ;else jump out of subroutine
;----------------------------------------------------------------------------------------------
;(END OF MAIN PROGRAM)
;
end
;-----------------------------------------------------------------------------------------------------------------------------------------

EE313 Microprocessor Applications 34 R Singh


PIC16F877

Figure B : PIC16F877 Pin Diagram

8.0 16F877 MICROCONTROLLER CORE FEATURES

• High performance RISC CPU


• Only 35 single word instructions to learn
• All single cycle instructions except for program branches which
are two cycles
• Operating speed: DC - 20MHz clock input
DC – 200ns instruction cycle

EE313 Microprocessor Applications 35 R Singh


• Up to 8K x 14 words of FLASH Program Memory
Up to 368 x 8 bytes of Data Memory (RAM)
Up to 256 x 8 bytes of EEPROM Data Memory
• Interrupt capability (up to 14 sources)
• Eight level deep hardware stack
• Direct, indirect and relative addressing modes
• Power-on Reset (POR)
• Power-up Timer (PWRT) and
• Oscillator Start-up Timer (OST)
• Watchdog Timer (WDT) with its own on-chip RC oscillator for
reliable operation
• Programmable code protection
• Power saving SLEEP mode
• Selectable oscillator options
• Low power, high speed CMOS FLASH/EEPROM technology
• Fully static design
• In-Circuit Serial ProgrammingTM (ICSP) via two pins
• Single 5V In-Circuit Serial Programming capability
• In-Circuit Debugging via two pins
• Processor read/write access to program memory
• Wide operating voltage range 2.0v to 5.5V
• High Sink/Source Current: 25mA
• Commercial, Industrial and Extended temperature ranges
• Low-power consumption
- < 0.6mA typical @ 3V, 4MHz
- 20µA typical @ 3V, 32kHz
- < 1µA typical standby current

9.0 16F877 PERIPHERAL FEATURES

• Timer0: 8-bit timer/counter with 8-bit prescaler


• Timer1: 16-bit timer/counter with prescaler, can be incremented
during SLEEP via external crystal/clock
• Timer2: 8-bit timer/counter with 8-bit period register, prescaler
and postscaler

EE313 Microprocessor Applications 36 R Singh


• Two capture, Compare, PWM modules
-Capture is 16-bit, max. resolution is 12.5ns
-Compare is 16-bit, max. resolution is 200ns
-PWM max. resolution is 10-bit
• 10-bit multi-channel Analog-to-Digital converter
• Synchronous Serial Port (SSP) with SPITM (Master mode) and
I2CTM (Master/Slave)
• Universal Synchronous Asynchronous Receiver Transmitter
(USART/SCI) with 9-bit address detection
• Parallel Slave Port (PSP) 8-bits wide, with external RD , WR and
CS controls (40/44-pin only)
• Brown-out detection circuitry for Brown-out Reset (BOR)

10.0 PIC16F877 BLOCK DIAGRAM

Figure 10.0: PIC16F877 Block diagram

EE313 Microprocessor Applications 37 R Singh


• The 16F877 has 5 PORTS (Port A, Port B, Port C, Port D and Port E)
• The 16F877 microcontrollers are highly prone to static damage
compared to PIC16F84 so anti-static wrist band must always be worn
while handling the microcontrollers.

11.0 PIC16F877 PIN OUT DESCRIPTION

EE313 Microprocessor Applications 38 R Singh


Figure 11.0: PIC16F877 Pin Description

EE313 Microprocessor Applications 39 R Singh


12.0 PIC16F877 PROGRAM MEMORY MAP and STACK

Figure 12.0: Program Memory and Stack

13.0 DATA MEMORY ORGANISATION

• The Data Memory is partitioned into multiple banks which contain the
Special Function Registers and General Purpose Registers
• Each Bank extends up to 7FH (128 bytes). Bits RP1 (STATUS<6>)
and RP0 (STATUS<5>) are the bank select bits.

Figure 13.0: Data Memory Organisation

EE313 Microprocessor Applications 40 R Singh


Figure 13.1: PIC16F877 Register File Map

EE313 Microprocessor Applications 41 R Singh


Figure 13.2: Special Function Register Summary

EE313 Microprocessor Applications 42 R Singh


Figure 13.2(cont.): Special Function Register Summary

14.0 16F877 STATUS REGISTER

EE313 Microprocessor Applications 43 R Singh


WHY Migrate from PIC16F84 to 16F877?
For a few $$dollars more we get all the features of PIC16F84 plus additional
features such as:

CORE FEATURES
• More I/O pins (PortA, PortB, PortC, PortD & PortE)
• 8K Program Memory
• Can be operated with 20MHz clock input (200ns instruction
cycle)

PERIPHERAL FEATURES
• 10-bit multi-channel Analog-to-Digital converter
• Two Capture, Compare, PWM modules
• 3 Built in TIMER (Timer0, Timer1 & Timer2)
• Interrupt capability (up to 14 sources)
• Eight level deep hardware stack
• Synchronous Serial Port (SSP) with SPITM (Master mode) and
I2CTM (Master/Slave)
• Universal Synchronous Asynchronous Receiver Transmitter
(USART/SCI) with 9-bit address detection
• Parallel Slave Port (PSP) 8-bits wide, with external RD , WR
and CS controls (40/44-pin only)

Because of these features the department ventured into developing


“PIC16F877 BOOTLOADER BOARDS”

EE313 Microprocessor Applications 44 R Singh


Implementing PIC16F877 BOOTLOADER

The Bootloader can be considered as an internal programmer for the 16F877


PIC Microcontroller.

It is a code which is programmed initially using the PIC START PLUS


Programmer, once programmed, the chip is ready to use. That is once, the
appropriate hardware is designed, the hex file created by MPLAB or PIC C
Complier can be sent to the chip using the serial port through TERA TERM
(software used for serial file transfer).

The Bootloader is split into two sections:

• The first is programmed at the initial memory registers (Boot Reset


Code), which when activated starts the PIC16F877 microcontroller in
programmer mode. Thus it waits for the user to download a new set
of code.
• The other section is at the end of the memory registers (main boot
code), which makes serial programming possible.

Hence a PIC16F877 Bootloader board allows for “hands free”


microcontroller programming.

This avoids PIC16F877 being damaged by static chargers.

The best part is that PIC16F877 Bootloader boards are very reliable.

EE313 Microprocessor Applications 45 R Singh


EE313 Microprocessor Applications 46 R Singh
EE313 Microprocessor Applications 47 R Singh
EE313 Microprocessor Applications 48 R Singh
1 Using the CCS PIC C Compiler
‘ Open the PIC C compiler by double clicking on the icon found on the
desktop window. PIC C Compiler.lnk

‘ Use the white box on the toolbar to select the compiler. CCS offers different
compilers for each family of Microchip parts. All the exercise in this course are for
the PIC16F877 chip, a 14-bit opcode part. Make sure 14 bit is selected in the
white box.

‘ The main program compiled is always shown in the lower right corner of the
IDE.

‘ Click File > New and create file name Exercise1.C as shown

EE313 Microprocessor Applications 49 R Singh


‘ The first seven lines of this program define the basic hardware environment.
The chip being used is the PIC16F877, running at 4Mhz, which will communicate
with the bootloader using RS232 serial communication protocol.

‘ The “while (TRUE)” is a simple way to create a loop that never stops.

‘ Note the “output_A(0xFF)” outputs logic high (5V) to all the pins of PORTA
and “output_A(0x00)” outputs logic low (0V) to all the pins of PORTA.

‘ The “delay_ms(1000)” is a one second delay (1000milliseconds).

‘ Click Compile > Compile and the following files should be created as shown

‘ Use Tera Term software to download the Exercise1.HEX (Exercise1.ICD) file to


the bootloader.

‘ Reset the bootloader and the program starts running. Connect the output pins of
all the ports to a LED and verify that they cause the LED to flick On and OFF at
1sec interval.
Note: This simple program can always be used to test if all the pins of the
microcontroller are working or not.

EE313 Microprocessor Applications 50 R Singh


2 GENERATING OUTPUT
‘ Click File > New and create file name Exercise2.C as shown

‘ Note: the “output_high(PIN_A0)” is used to make a single pin (PIN_A0) output


logic high (5V) and “output_low(PIN_A0)” is used to make a single pin
(PIN_A0) output logic low (0V).

‘ Once this program is complied, downloaded to the bootloader and run only
PIN_A0 output flicks ON and OFF.

3 READING INPUTs & GENERATING OUTPUTs


‘ Click File > New and create file name Exercise3.C as shown on page 52.

‘ Note: the “#define GREEN_LED PIN_A0” is used to enhance readability by


referring to GREEN_LED in the program instead of PIN_A0 which is connected

EE313 Microprocessor Applications 51 R Singh


to a Green Led and “#define PUSH_BUTTON PIN_D0” is used to enhance
readability by referring to PUSH_BUTTON in the program instead of PIN_D0
which is connected to a Push Button Switch.

‘ The function “wait_for_one_press()” will first get stuck in a loop while the input
pin is low (not pressed). When ever a button is pressed once, is it common for
several very quick connect/disconnect cycles to occur. The100ms delay takes
care of this switch debounce. It then waits in another loop while the pin is high.
The function returns as soon as the pin goes low again. Note that the loops,
since they do not do anything while waiting, do not look like much– they are a
simple ; (do nothing).

EE313 Microprocessor Applications 52 R Singh


‘ Once this program is complied, downloaded to the bootloader and run only the
green LED should come on first. Press the button and the yellow LED should
light and then the red LED when pressed again.

4 ANALOG TO DIGITAL CONVERSION


‘ The PIC16F877 chip has 8 pins that may be used to read an analog voltage.
These 8 pins can be configured to certain combinations of analog input and
digital pins, but not all combinations are possible.

‘ Click File > New and create file name Exercise4.C as shown.

‘ For this exercise a 5V variable input supply would be required which should be
connected to PORTA pin0 (RA0). A variable power supply can be used but if you
have a power supply with fixed voltage output then design a voltage divider
circuit as shown. Note: INPUT SHOULD NOT EXCEED 5V.

EE313 Microprocessor Applications 53 R Singh


to pin A0
5V fixed
power
supply 0 to 5V
variable
output

to common
PIC ground

‘ The “setup_adc_ports(RA0_RA1_RA3_ANALOG)” function call determine


what pins are set to be analog inputs and hence pins RA0, RA1 and RA3 are set
as analog inputs.

‘ The “setup_adc(ADC_CLOCK_INTERNAL)” function call determines how fast


the conversion is done. The internal clock option uses an internal RC clock.
Although the timing is not exact, it is long enough for a accurate conversion. The
time can be based off the instruction clock for more precise timing.

‘ The “set_adc_channel(0)” function sets the A/D converter to channel 0 (RA0).


This switches an internal mux in the part but does not start an A/D conversion.
Even though a conversion has not started, there is a small capacitor in the chip
that must charge up after the port switch and before the voltage is read. This is
fast with a low impedance input, but for a higher impedance input, a small delay
should be put in after the channel is changed.

‘ The call to “read_adc()” starts a conversion, waits for it to complete and returns
the result. The conversion time is around 20 us.

‘ By default, the analog to digital converter is 8 bits. Thus, a range of 0 to 5 volts


analog is represented by the numbers 0-255. The A/D reading can be converted
to volts by the formula:
Volts = reading * (5.0/255)

‘ Once this program is complied, downloaded to the bootloader and run, the 0 to
5volts variable voltage would be read in at PORTA pin0 (RA0) and the
corresponding voltage displayed on the Tera Term window every 1 second.

EE313 Microprocessor Applications 54 R Singh


EXERCISE:
A half wave rectified signal which is an output of a transducer after amplification
is shown in Figure 4.0. This amplified signal is to be read in by the A/D converter
input PORTA pin0 (RA0) in Exercise4.C.
What modification (if any) is needed to read in the output signal and display the
correct voltage on the Tera Term window ?

12.70 V
A: rl_2

7.700 V

2.700 V

-2.300 V

-7.300 V

-12.30 V
0.000us 50.00us 100.0us 150.0us 200.0us 250.0us 300.0us 350.0us 400.0us 450.0us 500.0us

FIGURE 4.0

SOLUTION

(i) Since the peak voltage Vpeak = 11.5V we need a voltage divider circuit as
shown in Figure 4.1 to reduce this voltage to 5V which can be read in by the PIC
microcontroller.

Vout = Vin x (R1 / (R1 + R2))

where Vout = 5V Vin = 11.5V & if R1=1kohm

then 5 = 11.5 (1 / (1 + R2)

hence R2 = (11.5 – 5) / 5 = R2 = 1.3kohm

FIGURE 4.1

(ii) In the program the following line should change to display the correct voltage
volt = value * (float)5/255;
to
volt = value * (float)11.5/255;

EE313 Microprocessor Applications 55 R Singh


5 INTERFACING MATRIX KEYPAD
‘ Figure 5.0 illustrates a common three-row, four-column 12-button keypad. Each
key is attached to a normally open (NO) pushbutton switch. When a key is
pressed, the switch closes.
‘ Figure 5.1 illustrates the electrical schematic of the keypad as represented on
the millennium development board.

ROW1
ROW2
FIGURE 5.0
ROW3
ROW4

COL1
COL2
COL3
FIGURE 5.1

‘ Connect up the row and column outputs of the matrix keypad to the appropriate
pins of the PIC 16F877 microcontroller as outlined in the table below

Keypad Output PIC Input


ROW1 RC0
ROW2 RC1
ROW3 RC2
ROW4 RC3
COL1 RE0
COL2 RE1
COL3 RE2

EE313 Microprocessor Applications 56 R Singh


‘ Click File > Open and open file name Keypad.C as shown which is stored in the
Keypad folder.

‘ Once this program is complied, downloaded to the bootloader and run, random
key presses should be detected and displayed on the Tera Term window. To
correct this error 10k ohms “Pull Down resistors” should be connected from
each of the four Row outputs to ground as shown in Figure 5.2.

EE313 Microprocessor Applications 57 R Singh


FIGURE 5.2

EXERCISE:
(i) Carefully study the Keypad.C program and use it to draw a flow chart of the
program.

(ii) Modify the Keypad.C program to read in all the key inputs from the 4X4
keypad. A valid key press is one where the input key switch first “closes” and
then “opens”. Save this modified Keypad.C program for future use.

6 INTERFACING LCD Unit


‘ The other common peripheral device we want to highlight is a standard Hitachi
44780-based liquid crystal display. LCDs come in different shapes and sizes that
can support different numbers of rows of text and different numbers of characters
per row. The standard choices for the number of characters and rows are 8x2,
16x1, 16x2, 16x4, 20x2, 24x2, 40x2, and 40x4. The commonly used 20x2 LCD is
illustrated in Figure 6.0.

‘ Applications of LCDs include displaying messages or information to the user


(e.g., a home thermostat display, a microwave oven display, or a digital clock)
and displaying a hierarchical input menu for changing settings and making
selections (e.g., a fax machine display).

‘ For a LCD display with 80 characters or less (all but the 40x4 just listed), the
display is controlled via 14 pins. The names and descriptions of these pins are
listed in Table 6.0. LCD displays with more than 80 characters (40x4) use a 16-
pin header with different pin assignments. A 14-pin LCD can be controlled via

EE313 Microprocessor Applications 58 R Singh


four or eight data lines. It is recommended that you use four lines to minimize the
number of I/O pins required.

‘ Commands and data are sent to the display via lines DB4 through DB7, and
lines DB0 through DB3 (pins 7 through 10) are not used.

‘ The potentiometer connected to Vee is used to adjust the contrast between the
foreground and background shades of the display. The RS, R/W, and E lines are
controlled automatically by PIC C program when communicating with the display.

FIGURE 6.0

TABLE 6.0

EE313 Microprocessor Applications 59 R Singh


7 INTERFACING I/O Devices
Interfacing I/O devices to microcontrollers are very straight forward if enough I/O
pins are available on the microcontroller.

(b) 8-bit Switch Input

(a) PIC 16F877 Microcontroller

(b) 8-bit Seven Segment LED output

Problem only arises when there are not enough I/O pins for the number of I/O
devices to be interfaced. This situation can be overcome by using Decoders as
shown in the figure below:

(b) 3-to-8 Decoder

EE313 Microprocessor Applications 60 R Singh


8 INTERRUPTS
PIC16F877 Microcontroller has two different sets of external interrupts available
namely:

#INT_EXT External interrupt on B0


#INT_RB Port B any change on B4-B7

‘ Click File > New and create file name Interrupt1.C as shown on page 61

EE313 Microprocessor Applications 61 R Singh


Example Interrupt1.C shows how the two external interrupts are setup using CCS
PIC C compiler.

ENABLE_INTERRUPTS()

Syntax: enable_interrupts (level)

Parameters: level - a constant defined in the devices .h file

Returns: undefined

Function: Enables the interrupt at the given level. An interrupt procedure should have
been defined for the indicated interrupt. The GLOBAL level will not enable any
of the specific interrupts but will allow any of the specific interrupts previously
enabled to become active.

Requires Should have a #int_xxxx, Constants are defined in the devices .h file.

Examples: enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
enable_interrupts(INT_EXT);

_____________________________________________________________
#INT_xxxx

Syntax: #INT_EXT External interrupt


#INT_RB Port B any change on B4-B7
Note many more #INT_ options are available on specific chips. Check the
devices .h file for a full list for a given chip.

Purpose: These directives specify the following function is an interrupt function. Interrupt
functions may not have any parameters. Not all directives may be used with all
parts. See the devices .h file for all valid interrupts.

The compiler will generate code to jump to the function when the interrupt is
detected. It will generate code to save and restore the machine state, and will
clear the interrupt flag. To prevent the flag from being cleared add NOCLEAR
after the #INT_xxxx. The application program must call
ENABLE_INTERRUPTS(INT_xxxx) to initially activate the interrupt along
with the ENABLE_INTERRUPTS(GLOBAL) to enable interrupts.

EE313 Microprocessor Applications 62 R Singh


EE313 Microprocessor Applications 63 R Singh

Anda mungkin juga menyukai