(Naravno, nije baš 16F84A ono što mi treba, ali bi trebalo da je dovoljno jednostavan da proradi "hello, world" program.)
Code:
list p=16F84A
#include <PIC16F84A.inc>
__CONFIG 0x3FF2
D1 EQU 0X20
D2 EQU 0X21
D3 EQU 0X22
ORG 0x000
goto main
main:
; initialize of your PIC, setting the general I/O in TRIS
BSF STATUS,5 ;SWITCH TO BANK1; BIT 5 OF STATUS REGISTER IS SET TO 1
CLRF TRISB ;SET PORTB AS OUTPUT ;PORTB = B'00000000'
BSF TRISA,2 ;SET RA2 AS INPUT ;RA2=1
BSF TRISA,3 ;SET RA3 AS INPUT ;RA3=1
BSF TRISA,4 ;SET RA4 AS INPUT ;RA4=1
BCF STATUS,5 ;SWITCH TO BANK0; BIT 5 OF STATUS REGISTER IS SET TO 0
MOVLW 0xFF
MOVWF PORTB ;SET ALL 8 PIN IN PORTB TO HIGH(1)
; The main program begin here
START:
BTFSS PORTA,2 ;check signal at pushbutton1, if press then goto following line, else skip the following line
CALL RED ;button1 pressed, program execute the operation in subroutine RED
BTFSS PORTA,3 ;check signal at pushbutton2, if press then goto following line, else skip the following line
CALL GREEN ;button2 pressed, program execute the operation in subroutine GREEN
BTFSS PORTA,4 ;check signal at pushbutton3, if press then goto following line, else skip the following line
CALL YELLOW ;button3 pressed, program execute the operation in subroutine YELLOW
GOTO START ;no any button being pressed, program keep looping to check the pushbuttons' signal
RED:
BSF PORTB,4 ;ON YELLOW LED
BSF PORTB,5 ;ON GREEN LED
BSF PORTB,6 ;ON RED LED
BCF PORTB,6 ;OFF RED LED
RETURN
GREEN:
BSF PORTB,4 ;ON YELLOW LED
BSF PORTB,5 ;ON GREEN LED
BSF PORTB,6 ;ON RED LED
BCF PORTB,5 ;OFF GREEN LED
RETURN
YELLOW:
BSF PORTB,4 ;ON YELLOW LED
BSF PORTB,5 ;ON GREEN LED
BSF PORTB,6 ;ON RED LED
BCF PORTB,4 ;OFF YELLOW LED
RETURN
;========================================================================================
; DELAY SUBROUTINE
;========================================================================================
DELAY:
MOVLW D'200' ;PAUSE FOR ABOUT 500mS (u can change the 200, 3, 1 value to obtain different delay timing)
MOVWF D3
MOVLW D'3'
MOVWF D2
MOVLW D'1'
MOVWF D1
DECFSZ D1 ;DECREASE THE VALUE OF D1 AND SKIP THE NEXT LINE WHEN IT REACH ZERO
GOTO $-1 ;IF NOT ZERO, IT WILL LEAD THE PROGRAM TO 1 LINE ABOVE
DECFSZ D2 ;DECREASE THE VALUE OF D2 AND SKIP THE NEXT LINE WHEN IT REACH ZERO
GOTO $-5 ;IF NOT ZERO, IT WILL LEAD THE PROGRAM TO 5 LINE ABOVE
DECFSZ D3 ;DECREASE THE VALUE OF D3 AND SKIP THE NEST LINE WHEN IT REACH ZERO
GOTO $-9 ;IF NOT ZERO, IT WILL LEAD THE PROGRAM TO 9 LINE ABOVE
RETURN ;RETURN FROM SUBROUTINE
END ; directive 'end of program'
list p=16F84A
#include <PIC16F84A.inc>
__CONFIG 0x3FF2
D1 EQU 0X20
D2 EQU 0X21
D3 EQU 0X22
ORG 0x000
goto main
main:
; initialize of your PIC, setting the general I/O in TRIS
BSF STATUS,5 ;SWITCH TO BANK1; BIT 5 OF STATUS REGISTER IS SET TO 1
CLRF TRISB ;SET PORTB AS OUTPUT ;PORTB = B'00000000'
BSF TRISA,2 ;SET RA2 AS INPUT ;RA2=1
BSF TRISA,3 ;SET RA3 AS INPUT ;RA3=1
BSF TRISA,4 ;SET RA4 AS INPUT ;RA4=1
BCF STATUS,5 ;SWITCH TO BANK0; BIT 5 OF STATUS REGISTER IS SET TO 0
MOVLW 0xFF
MOVWF PORTB ;SET ALL 8 PIN IN PORTB TO HIGH(1)
; The main program begin here
START:
BTFSS PORTA,2 ;check signal at pushbutton1, if press then goto following line, else skip the following line
CALL RED ;button1 pressed, program execute the operation in subroutine RED
BTFSS PORTA,3 ;check signal at pushbutton2, if press then goto following line, else skip the following line
CALL GREEN ;button2 pressed, program execute the operation in subroutine GREEN
BTFSS PORTA,4 ;check signal at pushbutton3, if press then goto following line, else skip the following line
CALL YELLOW ;button3 pressed, program execute the operation in subroutine YELLOW
GOTO START ;no any button being pressed, program keep looping to check the pushbuttons' signal
RED:
BSF PORTB,4 ;ON YELLOW LED
BSF PORTB,5 ;ON GREEN LED
BSF PORTB,6 ;ON RED LED
BCF PORTB,6 ;OFF RED LED
RETURN
GREEN:
BSF PORTB,4 ;ON YELLOW LED
BSF PORTB,5 ;ON GREEN LED
BSF PORTB,6 ;ON RED LED
BCF PORTB,5 ;OFF GREEN LED
RETURN
YELLOW:
BSF PORTB,4 ;ON YELLOW LED
BSF PORTB,5 ;ON GREEN LED
BSF PORTB,6 ;ON RED LED
BCF PORTB,4 ;OFF YELLOW LED
RETURN
;========================================================================================
; DELAY SUBROUTINE
;========================================================================================
DELAY:
MOVLW D'200' ;PAUSE FOR ABOUT 500mS (u can change the 200, 3, 1 value to obtain different delay timing)
MOVWF D3
MOVLW D'3'
MOVWF D2
MOVLW D'1'
MOVWF D1
DECFSZ D1 ;DECREASE THE VALUE OF D1 AND SKIP THE NEXT LINE WHEN IT REACH ZERO
GOTO $-1 ;IF NOT ZERO, IT WILL LEAD THE PROGRAM TO 1 LINE ABOVE
DECFSZ D2 ;DECREASE THE VALUE OF D2 AND SKIP THE NEXT LINE WHEN IT REACH ZERO
GOTO $-5 ;IF NOT ZERO, IT WILL LEAD THE PROGRAM TO 5 LINE ABOVE
DECFSZ D3 ;DECREASE THE VALUE OF D3 AND SKIP THE NEST LINE WHEN IT REACH ZERO
GOTO $-9 ;IF NOT ZERO, IT WILL LEAD THE PROGRAM TO 9 LINE ABOVE
RETURN ;RETURN FROM SUBROUTINE
END ; directive 'end of program'
Prvi put radim sa MPLAB X IDE v6.20, pa imam i ove probleme.
Konkretno, okruženje izbacuje sintaksne greške u redovima 4, 66, 68, 70. Ove poslednje tri su verovatno posledica korišćenja pogrešnog formata dekadnih konstanti, ali o tome ću -- potom. Pored toga, imam i gomilu "phase error" u redovima 11, 17, 18, 19, 20...
Mislim da grešim nešto sitno, ali...