16C84 Sample Program
The following program was taken from
The Beginners' PIC page by
matt@atlas.kingston.ac.uk.
;*******************************************************************
; walk.asm
;
; This code walks LEDs backwards and forwards on port b.
; Couldn't be simpler.
;*******************************************************************
LIST P=16C84;f=inhx8m
_CP_OFF equ H'3FFF' ;code protect off
_PWRTE_ON equ H'3FFF' ;Power on timer on
_WDT_OFF equ H'3FFB' ;watch dog timer off
_XT_OSC equ H'3FFD' ;crystal oscillator
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;configure programmer directive
w equ 0 ; register destination numbers.
f equ 1
same equ 1
z equ 2 ; status flags
zero equ 2
c equ 0
carry equ 0
count1 equ 0C ; wait counter ls digit file register C
count2 equ 0D ; wait counter ms digit file register D
portb equ 06 ; port b I/O register f6
porta equ 05 ; port a I/O register f5
status equ 03 ; status register f3
;
;
;
org 0 ; origin
;
init
movlw 0
tris portb ; set portb as outputs
movwf portb ; set portb levels all low
start
bsf portb,0 ; set portb bit 0 high
rot_L call wait ; wait for a bit
bcf status,c ; clear carry bit
rlf portb,same ; rotate left portb, store result portb
btfss portb,7 ; skip next line if top bit set
goto rot_L
rot_R call wait ; wait for a bit
bcf status,c ; clear carry bit
rrf portb,same ; rotate right portb, store in portb
btfss portb,0 ; skip next line if bottom bit set
goto rot_R
goto rot_L ; do it all again
; ----------------------------
; wait subroutine
; ----------------------------
wait
movlw .200 ; load count1 with decimal 200
movwf count1
d1 movlw .200 ; load count2 with decimal 200
movwf count2
; shorten these for the simulator
d2 decfsz count2,same ; decrement and skip next line if zero
goto d2 ; if not zero
decfsz count1 ; decrement count1 if count2 is zero
goto d1 ; do inside loop again if count2 nz
retlw 00
; ----------------------------
END