; Assembly PIC18 - Versione 0.20 - Marzo 2017 ; Copyright (c) 2016-2017, Vincenzo Villa ; Creative Commons | Attribuzione - Condividi allo stesso modo 4.0 Internazionale (CC BY-SA 4.0) ; Creative Commons | Attribution-Share Alike 4.0 Unported ; https://www.vincenzov.net/tutorial/PIC18/Assembly/subroutines.htm ; Riferimento: fogli tecnici del PIC18F2XK20/4XK20 ; Subroutines con stack ; PIC18F26K20 / MPLAB X 3.55 / MPASM v5.72 #include "p18f26k20.inc" ; il file con la definizine dei registri specifici del PIC in uso stack UDATA stack_data res 0x100 ; un intero banco della RAM è riservato per lo stack (256 byte) main CODE 0x0000 ; vettore di reset, indirizzo 0. Il codice inizia qui lfsr FSR1, stack_data+0xFF ; inizializziamo lo stack software: FSR1 punta all'ultima cella dello stack clrf TRISC ; imposta PORTC come uscita (azzera TRISC) clrf LATC ; tutti i LED spenti (azzera LATC) ciclo btg LATC, RC0 ; Inverte RC0 call ritardo_lungo ; attendi circa 300 ms (@ 1 MHz) bra ciclo ; ciclo infinito ; ***************************************************************************** ritardo_breve ; introduce un ritardo di circa 3 ms (@ 1 MHz) ; Salvataggio del contesto movwf POSTDEC1 ; salva WREG nello stack movff STATUS, POSTDEC1 ; salva i flags nello stack movff BSR, POSTDEC1 ; salva BSR nello stack clrf WREG ; azzera il registro W ripeti decfsz WREG ; decrementa il registro W e salta l'istruzione seguente ; quanto W=0 bra ripeti ; ripeti ; Ripristino del contesto precedente movff PREINC1, BSR ; ripristina il registro BSR movff PREINC1, STATUS ; ripristina i flags movff PREINC1, WREG ; ripristina il registro WREG return ; torna all'istruzione dopo la "call ritardo_breve" ; ***************************************************************************** ritardo_lungo ; introduce un ritardo di circa 3 ms (@ 1 MHz) ; Salvataggio del contesto movwf POSTDEC1 ; salva WREG nello stack movff STATUS, POSTDEC1 ; salva i flags nello stack movff BSR, POSTDEC1 ; salva BSR nello stack movlw .100 ; carica 100 in WREG ripeti2 call ritardo_breve ; introduce un ritardo di circa 3 ms decfsz WREG ; ripeti per 100 volte bra ripeti2 ; Ripristino del contesto precedente movff PREINC1, BSR ; ripristina il registro BSR movff PREINC1, STATUS ; ripristina i flags movff PREINC1, WREG ; ripristina il registro WREG return ; torna all'istruzione dopo la "call ritardo_lungo" ; ***************************************************************************** END ; Fine del file