Reading
from the
I/O
ports.
Up to
now, we
have
been
writing
to Port
A so
that we
can turn
an LED
on and
off.
Now, we
are
going to
look at
how we
can read
the I/O
pins on
the
ports.
This is
so that
we can
connect
an
external
circuit,
and act
on any
outputs
it
gives.
If you
recall
from our
previous
tutorials,
in order
to set
up the
I/O
ports,
we had
to
switch
from
Bank 0
to Bank
1. Let
us do
that
first:
STATUS
equ
03h ;Address
of the
STATUS
register
TRISA
equ
85h ;Address
of the
tristate
register
for port
A
PORTA
equ
05h ;Address
of Port
A
bsf STATUS,5 ;Switch
to Bank
1
Now, to
set up
the port
to be an
output,
we sent
a 0 to
the
TrisA
register.
To set a
pin on a
port to
be an
input,
we send
a 1 to
the TisA
register.
movlw
01h
;Set
the Port
A pins
movwf
TRISA ;to
input.
bcf
STATUS,5
;Switch
back to
Bank 0
Now we
have set
bit 0 of
Port A
to
input.
What we
need to
do now
is to
check if
the pin
is high
or low.
For
this, we
can use
one of
two
instructions:
BTFSC
and BTFSS.
The
BTFSC
instruction
means
‘Do a
bit test
on the
register
and bit
we
specify.
If it is
a 0,
then we
skip the
next
instruction’.
BTFSS
means
‘Do a
bit test
in the
register
and bit
we
specify.
If it is
set to a
1, then
we skip
the next
instruction.’
Which
one we
use,
depends
on how
we want
our
program
to react
when we
read the
input.
For
example,
if we
are
simply
waiting
for the
input to
be a 1,
then we
could
use the
BTFSS
instruction
like
this:
Code
here
:
BTFSS
PortA,0
Goto
start
Carry on
here
:
:
The
program
will
only
move
onto
‘Carry
on here’
only if
bit 0 on
PortA is
set to a
1.
Let us
now
write a
program
which
will
flash an
LED at
one
speed,
but if a
switch
is
closed
it will
flash
the LED
twice as
slow.
You can
probably
work
this
program
out for
yourself,
but We
have
included
the
listing
anyway.
You
could
try and
write
the
whole
program,
just to
see if
you have
grasped
the
concepts.
We are
using
the same
circuit
as
before,
with the
addition
of a
switch
connected
RA0 of
the PIC
and the
positive
rail of
our
supply.
;*****Set
up the
Constants****
STATUS equ
03h ;Address
of the
STATUS
register
TRISA equ
85h ;Address
of the tristate
register
for port
A
PORTA
equ
05h ;Address
of Port
A
COUNT1
equ
08h ;First
counter
for our
delay
loops
COUNT2
equ
09h
;Second
counter
for our
delay
loops
;****Set
up the
port****
bsf
STATUS,5
;Switch
to Bank
1
movlw
01h
;Set the
Port A
pins:
movwf
TRISA ;bit
1to
output,
bit 0 to
input.
bcf
STATUS,5
;Switch
back to
Bank 0
;****Turn
the LED
on****
Start
movlw 02h ;Turn
the LED
on by
first
putting
it
movwf
PORTA ;into
the w
register
and then
on the
port
;****Check
if the
switch
is
closed
BTFSC
PORTA,0
;Get
the
value
from
PORT A
;BIT 0.
If it is
a zero
call
Delay ;a zero,
carry on
as
normal.
;If is
is a 1,
then add
an
;extra
delay
routine
;****Add
a delay
call
Delay
;****Delay
finished,
now turn
the LED
off****
movlw
00h ;Turn
the LED
off by
first
putting
it
movwf
PORTA
;into
the w
register
and then
on the
port
;****Check
if the
switch
is still
closed
BTFSC PORTA,0
;Get
the
value
from
PORT A
;BIT 0.
If it is
a zero,
call
Delay
;carry
on as
normal.
;If is a
1, then
add an
;extra
delay
routine
;****Add
another
delay****
call
Delay
;****Now
go back
to the
start of
the
program
goto
Start
;go back
to Start
and turn
LED on
again
;****Here
is our
Subroutine
Delay
Loop1 decfsz COUNT1,1
;This
second
loop
keeps
the LED
goto
Loop1 ;turned
off long
enough
for us
to
decfsz COUNT2,1
;see it
turned
off
goto Loop1 ;
return
;****End
of the
program****
end ;Needed
by some
compilers,
and also
;just in
case we
miss the goto
instruction.
What we
have
done
here is
to turn
the LED
on.
We
then
check to
see if
the
switch
is
closed.
If it is
closed,
then we
make a
call to
our
delay
subroutine.
This
gives us
the same
delay as
before,
but we
are now
calling
it
twice.
The same
goes for
when the
LED is
off. If
the
switch
is not
closed,
then we
have our
old on
and off
times.
You can
compile
and run
this
program.
However
a word
of
warning.
The
final
circuit
and code
will
look
un-impressive
to
someone
who is
not
interested
in
programming
microcontrollers.
So,
don’t be
upset
if, when
you show
your
family
and
friends
how you
can
change
the
speed of
a
flashing
LED with
a
switch,
they
show
very
little
interest
– We are
talking
from
personal
experience,
here!
If you
have
been
following
these
tutorials
from the
start,
then you
may be
interested
to know
that you
have now
learnt
10 of
the 35
instructions
for the
PIC
16F84!
And all
of these
have
been
learnt
just by
simply
turning
an LED
on and
off.
Click
here >>>>
Tutorial
7
|