Programul 1
list p=16f877A ; list directive to define processor
include
; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF
;***** VARIABLE DEFINITIONS
w_temp EQU 0x7D ; variable used for context saving
status_temp EQU 0x7E ; variable used for context saving
pclath_temp EQU 0x7F ; variable used for context saving
;**********************************************************************
cblock 0x20 ;start of general purpose registers
d1 ;used in delay routine
d2 ;used in delay routine
endc
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
main
bsf STATUS, RP0 ;selectare bank 1
movlw b'00001111' ;incarcam registrul W cu valoarea b'00001111'
movwf TRISB ;Transferam valoarea in port TRISB si setam PortB cu 4 inputs si 4 outputs
bcf STATUS, RP0 ;selectare bank 0
clrf PORTB ;facem toate iesirile in stare LOW
Loop
call Delay
btfss PORTB, 0 ;Test bit 5 al PORTB. Skip following if Set.
call Sw1 ;Call subrutina Sw1
btfss PORTB, 1 ;Test bit 6 al PORTB. Skip following if Set.
call Sw2 ;Call subrutina Sw2
goto Loop ;Go back to Loop
Sw1
clrf PORTB ;Clear toti bitii portului. LED-urile OFF
bsf PORTB, 4 ;Set bit0 registru PORTB si LED0 devine ON
retlw 0x00 ;Return with constant (0x00) in registrul W
Sw2
clrf PORTB ;Clear toti bitii portului. LED-urile OFF
bsf PORTB, 5 ;Set bit1 registru PORTB si LED1 devine ON
retlw 0x00 ;Return with constant (0x00) in registrul W
Delay
movlw 0x85 ;incarcam reg.d1 cu valoarea 0x85
movwf d1 ;se transfera valoarea 0x85 in registrul d1
movlw 0x20 ;incarcam reg.d1 cu valoarea 0x20
movwf d2 ;se transfera valoarea 0x20 in registrul d2
Delay_0
decfsz d1,f ;decrementam registrul d1 cu 1.
goto $+2 ;salt peste 2 instructiuni
decfsz d2,f ;decrementam registrul d2 cu 1.
goto Delay_0 ;salt la label Delay_0, aceasta consuma in plus 2 cycle
goto $+1 ;salt la instructiunea urmatoare
return ;return la instructiunea care a trimis aici. (call delay)
END ; directiva 'end of program’ care nu trebuie sa lipseasca.
Aceasta se aplică schemei electrice de mai jos şi permite ca fiecărui switch să comande aprinderea LED-ului corespunzător. La apăsarea pe oricare alt switch LED-ul anterior se stinge şi se aprinde cel corespunzator lui.
Figura 8.1 – Schema electrică principială pentru testarea programului de programare a pinilor porturilor ca intrări
Ca şi până acum codul în limbaj de asamblare, poate fi transpus în MPLAB, verificat şi încărcat într-un microcontroler tip PIC 16F877A.
În continuare va fi prezentată o altă aplicaţie cu microcontroler care permite comanda independentă a fiecărui pin port prin intermediul a câte unui switch plasat pe intrări. Rezultatul comenzii este concretizat prin modificarea stării unui port de ieşire corespunzator, la care este montat câte un LED. Fiecare LED este aprins independent prin intermediul switch-urilor corespunzatoare.
Codul în limbaj de asamblare cât şi schema electrică pentru această aplicaţie se pot vedea mai jos:
Dostları ilə paylaş: |