3 LED binary counter with start button code in assembly for PIC18F452
;******************************************************************************
; Introduction to Assembly Programming
; Title: Port control with counting
; Author: Tim Norton
; Date: 6/3/2020
;
;******************************************************************************
; NOTES
;******************************************************************************
; Will count to 7 in binary on the LED's connected to RC0..2
; If the pushbutton is not pressed, all LED's will turn off until
; the button is pressed
;******************************************************************************
; INCLUDES AND ASSEMBLER DIRECTIVES
;******************************************************************************
#include <p18f452.inc>
config OSC = HS
config BOR = OFF, WDT = OFF, LVP = OFF
org 0x0000 ; reset vector
goto start
;******************************************************************************
; VARIABLES
;******************************************************************************
cblock ; where varialbls are defined in memory
count1 ;
count2
count3
endc
;******************************************************************************
; INCLUDES
;******************************************************************************
;******************************************************************************
; START PROGRAM
;******************************************************************************
start:
call init
bra loop
;******************************************************************************
; INITIALISATION
;******************************************************************************
; initialise setting
init:
movlw b'11111000'
movwf TRISC ; put port C [2:0] outputs [7:3] inputs
return
;******************************************************************************
; MAIN PROGRAM LOOP
;******************************************************************************
loop:
movlw b'00000001' ; turn on LED 1 only
movwf PORTC
call delay500 ;500mS delay
incf PORTC ; Increment PORT C by 1 so = 2
call delay500 ;500mS delay
incf PORTC ; Increment PORT C by 1 so = 3
call delay500
incf PORTC ; Increment PORT C by 1 so = 4
call delay500
incf PORTC ; Increment PORT C by 1 so = 5
call delay500
incf PORTC ; Increment PORT C by 1 so = 6
call delay500
incf PORTC ; Increment PORT C by 1 so = 7
call delay500
buttonTest: ; stop if button not pressed
btfss PORTC, 3 ; if button pressed will =0
bra loop
movlw b'00000000' ; turn off all LEDs
movwf PORTC
bra buttonTest
;******************************************************************************
; FUNCTIONS
;******************************************************************************
; Delay functions
delay500: ;500mS delay
movlw d'10'
movwf count3
bra delay
delay100: ;100mS delay
movlw d'1'
movwf count3
bra delay
delay:
movlw d'199'
movwf count1
delay_loop_outer:
clrf count2
delay_loop_inner:
incf count2
bnz delay_loop_inner
incf count1
bnz delay_loop_outer
decf count3
bnz delay_loop_outer
return
;******************************************************************************
; END
;******************************************************************************
end