' PicBasic Pro code for blinking an LED on portB.0
' BASIC code:
' ================================================
BEGIN:
HIGH 0 ' Turn LED on
PAUSE 500 ' Wait 500mS (1/2 second)
LOW 0 ' Turn LED off
PAUSE 500 ' Wait 500mS (1/2 second)
GOTO BEGIN ' Loop continuously
' ==================================================
' Below is the assembly language generated by PicBasic Pro
' from our BASIC source code above.
PM_USED EQU 1
INCLUDE "16F84A.INC"
LIST
INCLUDE 'M16F8x.INC' ; PM header
LIST
device pic16F84A, xt_osc, wdt_on, pwrt_on, protect_off
XALL
LIST
RAM_START EQU 0000Ch
RAM_END EQU 0004Fh
RAM_BANKS EQU 00001h
BANK0_START EQU 0000Ch
BANK0_END EQU 0004Fh
EEPROM_START EQU 02100h
EEPROM_END EQU 0213Fh
R0 EQU RAM_START + 000h
R1 EQU RAM_START + 002h
R2 EQU RAM_START + 004h
R3 EQU RAM_START + 006h
R4 EQU RAM_START + 008h
R5 EQU RAM_START + 00Ah
R6 EQU RAM_START + 00Ch
R7 EQU RAM_START + 00Eh
R8 EQU RAM_START + 010h
FLAGS EQU RAM_START + 012h
GOP EQU RAM_START + 013h
RM1 EQU RAM_START + 014h
RM2 EQU RAM_START + 015h
RR1 EQU RAM_START + 016h
RR2 EQU RAM_START + 017h
PORTL EQU PORTB
_PORTH EQU PORTA
_TRISL EQU TRISB
_TRISH EQU TRISA
INCLUDE "1EXAMPLE.MAC"
LIST
INCLUDE "PBPPIC14.LIB"
LIST
; Oscillator is 4MHz
LIST
ORG 0 ; Reset vector at 0
LIST
GOTO INIT ; Finish initialization
LIST
PAUSE clrf R1 + 1
PAUSEL movwf R1
pauseloop movlw -1 ; 1 (9)
addwf R1, F ; 1
btfss STATUS, C ; 1 / 2
addwf R1 + 1, F ; 1 / 0
btfss STATUS, C ; 2
GOTO DONE
movlw (PAUSE_DELAY) >> 8 ; 1
movwf R0 + 1 ; 1
movlw LOW (PAUSE_DELAY) ; 1
CALL PAUSEUSL ; -2 (PAUSEUSL gives you 2 less than you a
GOTO pauseloop ; 2
LIST
PAUSEUS clrf R0 + 1 ; 1
PAUSEUSL addlw -24 ; 1 Subtract overhead
movwf R0 ; 1
comf R0 + 1, F ; 1
movlw -4 ; 1
btfss STATUS, C ; 1 / 2
GOTO pauseush ; 2 / 0
pauseusloop addwf R0, F ; 1
btfsc STATUS, C ; 1 / 2
GOTO pauseusloop ; 2 / 0
pauseush addwf R0, F ; 1 Do an extra countdown
clrwdt ; 1 Keep Watchdog clear
incfsz R0 + 1, F ; 1 / 2
GOTO pauseusloop ; 2 / 0
btfsc R0, 0 ; 1 / 2
GOTO $ + 1 ; 2 / 0 Burn an extra cycle
btfss R0, 1 ; 1 / 2
GOTO pauseusdone ; 2 / 0
nop ; 1
GOTO $ + 1 ; 2 Burn an extra 2 cycles
pauseusdone RETURN ; 2 + 3 (call + setup)
LIST
DONE bcf STATUS, IRP ; 1 Set FSR to bank 0/1
bcf STATUS, RP1 ; 1 Show direct bank 0
bcf STATUS, RP0 ; 1
clrwdt ; 1 Hit Watchdog timer
DONERET RETURN ; 2 Done
LIST
INIT
LIST
main
LABEL?L _BEGIN
LALL
_BEGIN
HIGH?C 000h
bsf _PORTL, 000h
bsf STATUS, RP0
bcf ((_PORTL) + 80h), 000h
PAUSE?C 001F4h
bcf STATUS, RP0
movlw LOW (HIGH (001F4h))
movwf R1 + 1
movlw LOW (LOW (001F4h))
CALL PAUSEL
LOW?C 000h
bcf _PORTL, 000h
bsf STATUS, RP0
bcf ((_PORTL) + 80h), 000h
PAUSE?C 001F4h
bcf STATUS, RP0
movlw LOW (HIGH (001F4h))
movwf R1 + 1
movlw LOW (LOW (001F4h))
CALL PAUSEL
GOTO?L _BEGIN
GOTO _BEGIN
END
Imagine your time savings by typing in only 5 simple lines of PicBasic code as opposed to all of this using assembly..!
Imagine how fast you can also learn assembly language by examining the code generated by PicBasic Pro..!
Click HERE to return to the previous page.