Example 5
Using subroutine, using push-buttons
In the previous examples the microcontroller executes the program without being influenced in any way its surrounding. In practice, devices operating in this way are very rare (for example, simple neon signs). You guess, among other components, input pins will also be used in this example. There is a schematic in the figure below, while the program is on the next page. Everything is still very simple.
In the main program, one bit on port B is set first. Then the contents of this register is constantly moved by one place to the left (instruction rlf PORTB). It gives us the impression that the lit LED diodes is moving. To make it visible, the whole process must be slow enough. Press on the push-button "STOP" stops the movement and the program remains in loop3. Delay is provided by means of a nested loop. This time, it is placed in a short subroutine "DELAY".
* It is not necessary for PORTA pins since they are automatically configured as inputs after every reset.
Source Code
;****************************************************************************
; Header
;****************************************************************************
;************* DEFINING VARIABLES *******************************************
cblock 0x20 ; Block of variables starts at address 20h
counter1 ; Variable "counter1" at address 20h
counter2 ; Variable "counter2" at address 21h
endc ; Block of variables ends
;************************ MAIN PROGRAM **************************************
org 0x0000 ; Address of the first program instruction
banksel ANSEL ; Selects bank containing register ANSEL
clrf ANSEL ; Clears registers ANSEL and ANSELH to
clrf ANSELH ; configure all inputs as digital
banksel TRISB ; Selects bank containing register TRISB
clrf TRISB ; All port B pins are configured as outputs
movlw B'00000010'
movwf TRISA ; Pin RA1 is input
banksel PORTB ; Selects bank containing register TRISB
movlw B'00000001' ; Writes 1 to register W
movwf PORTB ; Number is moved to PORTB
loop
rlf PORTB ; Port B bits rotates by one place left
call DELAY ; Calls subroutine "DELAY"
loop3
btfss PORTA,1 ; Tests the firs port A bit
goto loop3 ; "0" is applied to pin.Go to label "loop3"
goto loop ; "1" is applied to pin.Go to label "loop"
;************************ SUBROUTINES ***************************************
DELAY
clrf counter2 ; Clears variable "counter2"
loop1
clrf counter1 ; Clears variable "counter1"
loop2
decfsz counter1 ; Decrements variable "counter1" by 1
goto loop2 ; Result is not 0. Go to label loop2
decfsz counter2 ; Decrements variable "counter2" by 1
goto loop1 ; Result is not 0. Go to lab loop1
return ; Return from subroutine "DELAY"
end ; End of program