Home > Electronic Tutorials > Microcontroller Tutorials - PIC > PIC Tutorial 3 - Writing To the Ports

PIC Microcontroller Tutorial

PIC Tutorial 3 - Writing To the Ports

Writing To the Ports

In the last tutorial, we showed you how to set up the IO port pins on the PIC to be either input or output. In this tutorial, We are going to show you how to send data to the ports. In the next tutorial, we will finish off by flashing an LED on and off which will include a full program listing and a simple circuit diagram so that you can see the PIC doing exactly what we expect it to. Don’t try and compile and program your PIC with the listings here, as they are examples only.

First, let us set up Port A bit 2 as an output:

bsf                   03h,5              ;Go to Bank 1
movlw               00h                 ;Put 00000 into W
movwf               85h                 ;Move 00000 onto TRISA – all pins set to output
bcf                   03h,5               ;Come back to Bank 0

This should be familiar from the last tutorial. The only difference is that we have set all of the pins on Port A as output, by sending 0h to the tri-state register.

Now what he have to do is turn an LED on. We do this by making one of the pins (the one with the LED connected to it) high. In other words, we send a ‘1’ to the pin. This is how it’s done (note the comments for an explanation of each line):

movlw              02h  ;Write 02h to the W register. In binary this is 00010, which
puts a ‘1’ on bit 2 (pin 18) while keeping the other pins to ‘0’

movwf              05h  ;Now move the contents of W (02h) onto the PortA, whose
                              ;address is 05h

So, now our LED is on, we now need to turn it off:

movlw              00h      ;Write 00h to the W register. This puts a ‘0’ on all pins.

movwf              05h      ;Now move the contents of W (0h) onto the Port A, whose

                                 ;address is 05h

So, what we have done is turn the LED on then off once.

What we want is for the LED to turn on then off continuously. We do this by getting the program to go back to the beginning. We do this by first defining a label at the start of our program, and then telling the program to keep going back there.

We define a label very simply. We type a name, say START, then type the code:

Start         movlw              02h    ;Write 02h to the W register. In binary this is
;00010, which puts a ‘1’ on pin 2 while keeping
;the other pins to ‘0’

               movwf              05h      ;Now move the contents of W (02h) onto the
;PortA, whose address is 05h

               movlw              00h      ;Write 00h to the W register. This puts a ‘0’ on
;all pins.

              movwf              05h    ;Now move the contents of W (0h) onto the Port
;A, whose address is 05h

goto               Start                  ;Goto where we say Start

As you can see, we first said the word ‘Start’ right at the beginning of the program. Then, right at the very end of the program we simply said ‘goto Start’. The ‘goto’ instruction does exactly what it says.

This program will continuously turn the LED on and off as soon as we power up the circuit, and will stop when we remove power.

We think we should look at our program again:

                      bsf                   03h,5
movlw               00h
movwf               85h
bcf                   03h,5
Start               movlw               02h
movwf               05h
movlw               00h
movwf               05h
                      goto                 Start

OK, We know we have left the comments off. But, do you notice that all we can see are instructions and numbers?  This can be a little confusing if you are trying to debug the program later, and also when you write the code you have to remember all of the addresses. Even with the comments in place, it can get a bit messy. What we need is to give these numbers names.  This is accomplished by another instruction: ‘equ’.

The ‘equ’ instruction simply means something equals something else. It is not an instruction for the PIC, but for the assembler. With this instruction we can assign a name to a register address location, or in programming terms assign a constant. Let us set up some constants for our program, then you will see how much easier to read the program is.

STATUS          equ  03h    ;this assigns the word STATUS to the value of 03h,
                                       ;which is the address of the STATUS register.

TRISA             equ 85h     ;This assigns the word TRISA to the value of 85h,
                                      ;which is the address of the Tri-State register for PortA

PORTA           equ 05h     ;This assigns the word PORTA to 05h which is the
                                    ;address of Port A.

So, now we have set up our constant values, let us put these into our program. The constant values must be defined before we can use them, so to be sure always put them at the start of the program. We will re-write the program without comments again, so that you can compare the previous listing to the new one:

STATUS          equ 03h
TRISA             equ 85h
PORTA            equ 05h

                         bsf                   STATUS,5
movlw              00h
movwf              TRISA
bcf                  STATUS,5

Start                 movlw             02h
movwf             PORTA
movlw             00h
movwf             PORTA
                       goto                Start

Hopefully, you can see that the constants make following the program a little easier, even though we still have not put the comments in.  However, we are not quite finished.

Click here  >>>>  Tutorial 4 (Delay Loops)

Note: To report broken links or to submit your projects please send email to Webmaster