CATEGORII DOCUMENTE |
Microcontrolerul pe 8 biti PIC 16F84
Exemple
1. Scopul lucrarii
Insusirea cunostintelor privind utilizarea programului MPLAB si folosirea acestuia pentru simularea unor programe scrise pentru microcontrolerul PIC 16F84.
Exemplul 1. Sa se programeze procesorul 16F84 astfel incat pe display-ul placii sa fie afisata cifra 7.
LIST P=16F84, R=DEC
STATUS EQU 3 ; registrul 03h din memoria de date
RA EQU 5 ; registrul 05h din memoria de date
RB EQU 6 ; registrul 06h din memoria de date
TRISA EQU 0x85 ;registrul 85h din memoria de dare
TRISB EQU 0x86 ;registrul 86h din memoria de date
RP0 EQU 5 ; bitul 5 din registrul STATUS
ORG 0 ; se defineste RAM-ul incepand cu 0h
L1 MOVLW 0 ; continutul registrului W devine 0
MOVWF TRISB ; se seteaza TRISB ca port de iesire
BCF STATUS,RP0 ; se reseteaza bitul RP0 (RP0=0) pentru selectarea segmentului
;0 din memoria de date
MOVLW 0x07
MOVWF RB ; se trimite aceasta valoarea 0x07 la port TRISB
GOTO L1
END
Exemplul 2. Sa se scrie un program in care sa se completeze cu AAh toate registrele de uz general din segmentul 0 de memorie, apoi sa le stearga (sa le completeze cu 0). Daca stergerea a fost efectuata se vor aprinde led-urile 0,1,2,3 (corespunzatoare pinilor RB<0>RB<3>).
LIST P=16F84, R=DEC
; definirea RAM-ului
STATUS EQU 3 ; registrul 03h din memoria de date
FSR EQU 4 ; registrul 04h din memoria de date
INDF EQU 0x00 ; adresare indirecta
RA equ 5 ; se definesc variabilele pentru porturi
RB equ 6
TRISA equ 0x85 ; registrul 5 din segmentul 2 de memorie
TRISB equ 0x86 ; registrul 6 din segmentul 2 de memorie
RP0 equ 5 ; bitul 5 din registrul STATUS
ORG 0 ; se va defini RAM-ul incepand cu adresa 0h
BSf STATUS,RP0
Movlw 0x00
MoVwf TRISB portul B configurat ca port de iesire
BCF STATUS, RP0 se reseteaza bitul 5 din registrul STATUS pentru
;scrierea in segmentul 0 de memorie
movlw 0x00 continutul registrului W este incarcat cu 0x00
movwf RB se asigura ca ledurile sunt stinse
movlw 0x0C continutul registrului W este incarcat cu 0x0C (adresa de la care incep ;registrele generale)
movwf FSR registrul FSR ia valoarea 0x0c
; se incepe adaugarea de valori in registrele generale
AdaugaReg
movlw 0xAA
movwf INDF ; registrul INDF ia valoare 0xAA
incf FSR se va incrementa registrul FSR pana va parcurge toata zona de memorie cu registre generale (de la 0x0C la 0x2F)
movlw 0x2F; continutul registrului W este 0x2F
subwf FSR, se scade din registrul FSR valoarea 0x2F
BTFSS STATUS,2 se testeaza daca bitul 2 din registrul STATUS este 0, daca este 1 se ;sare peste instructiunea urmatoare
goto AdaugaReg
movlw 0x0C
movwf FSR se va incarca FSR cu inceputul zonei de memorie a registrelor generale
; se incepe stergerea de valori in registrele generale
StergeReg
clrf INDF
incf FSR
movlw 0x2F
subwf FSR,0
BTFSS STATUS,2
goto StergeReg
movlw 0x0F
movwf RB se vor aprinde cele 4 led-uri
END ; sfarsit de program
Exemplul 3. Sa se scrie un program care verifica daca continutul registrului de la adresa 0x10 este par sau impar. Daca este par pe display se va afisa valoarea ff iar daca este impar 11.
STATUS EQU 3 ; registrul 03h din memoria de date
RA EQU 5 ; registrul 05h din memoria de date
RB EQU 6 ; registrul 06h din memoria de date
TRISA EQU 5 ;registrul 85h din memoria de dare
TRISB EQU 6 ;registrul 86h din memoria de date
RP0 EQU 5 ; bitul 5 din registrul STATUS
ORG 0 ; se defineste RAM-ul incepand cu 0h
BSF STATUS,RP0 ; se seteaza bitul RP0 (RP0=1) pentru selectarea segmentului 1
; din memoria de date
MOVLW 0x00
MOVWF TRISB se seteaza PORTB ca port de iesire
BCF STATUS,RP0 se va scrie in segmentul 0 din memoria de date
MOVLW 0x00
MOVWF RB pe display se va afisa 00
Impar MOVLW 0x11 daca este impar se va afisa 11
MOVWF RB
movlw 0x0A
Movwf Operand operandul de testat
rrf Operand se va roti la dreapta cu carry
BTFSC STATUS,0 ;se verifica daca bitul de carry din registru STATUS este 0 sau 1
goto Impar daca este 1 sare la impar
MOVLW 0xff se va afisa FF daca operandul este par
MOVWF RB
END
Exemplul 4. Sa se simuleze un numarator zecimal de la 1 la 10.
LIST P=16F84,R=DEC
STATUS EQU 3 registrul 03h din memoria de date
RA EQU 5 registrul 05 din memoria de date
RB EQU 6 registrul 06 din memoria de date
TRISA EQU 0X85
TRISB EQU 0X86
TEMP equ 0x0C
Z equ 2 bitul 2 din registrul STATUS (bitul de zero)
RP0 EQU 5 ; bitul 5 din registrul STATUS
R0 equ 0x0D
R1 EQu 0x0E
R2 equ 0x0F
DATR1 EQU 133
DATR2 EQU 250
ZECE EQU 0x10
ORG 0 se incepe de la adresa 0
BCF STATUS,RP0 se va scrie in segmentul 0 de memorie
MOVLW 0
MOVWF TRISB se va configura portul b ca port de iesire
Movlw 0X09
Movwf ZECE variabila ZECE va lua valoarea 0X09
Movlw 0x00
movwf TEMP
Inceput
movf TEMP,0 continutul lui W se va salva in variabila TEMP
subwf ZECE,0 se scade din ZECE continutul lui W
BTfsc STATUS,Z ; se testeaza daca w a juns la valoarea 10, daca
;da sare la ETZECE
call etzece
movf TEMP,0
addlw 0x01 ; aduna continutul lui w cu 1
Movwf TEMP si il salveaza in variabila TEMP
MOVWF RB se afiseaza numarul din w
movlw 10 numara la o secunda
call DELAY
GOTO Inceput;
DELAY ; DELAY 0.1 SEC
MOVWF R0
DELAY3
MOVLW DATR1
MOVWF R1
DELAY2
MOVLW DATR2
MOVWF R2
DELAY1
DECFSZ R2
GOTO DELAY1
DECFSZ R1
GOTO DELAY2
DECFSZ R0
GOTO DELAY3
RETLW 0
etzece
movlw 0x10
movwf RB
END
Exemplul 5. Sa se simuleze un semafor: - led-ul rosu se va aprinde pentru 15 secunde
led-ul galben se va aprinde pentru 2 secunde
led-ul verde se va aprinde pentru 15 secunde
LIST P=16F84,R=DEC
;rosu rb:<0>, galben rb:<2>, verde rb:<1>
; TRAFFIC LIGHT
STATUS EQU 3
RA EQU 5
RB EQU 6
R0 EQU 0x0C
R1 EQU 0x0D
R2 EQU 0x0E
TRISA EQU 0X85
TRISB EQU 0X86
RP0 EQU 5 ; bitul 5 din registru STATUS
Definirea variabilelor
DATR1 EQU 133
DATR2 EQU 250
ORG 0
BSF STATUS,RP0
MOVLW 0
MOVWF TRISB ; PORTB ca port de iesire
BCF STATUS,RP0
BEGIN
MOVLW 00000001
MOVWF RB ; se aprinde led-ul rosu
MOVLW 150 ; pentru 15 secunde
CALL DELAY
MOVLW 000000100
MOVWF RB se aprinde led-ul galben
MOVLW 20 pentru 2 secunde
CALL DELAY
MOVLW 00000010
MOVWF RB se aprinde led-ul verde
MOVLW 150 ; pentru 15 secunde
CALL DELAY
GOTO BEGIN
DELAY ; DELAY 0.1 SEC
MOVWF R0
DELAY3
MOVLW DATR1
MOVWF R1
DELAY2
MOVLW DATR2
MOVWF R2
DELAY1
DECFSZ R2
GOTO DELAY1
DECFSZ R1
GOTO DELAY2
DECFSZ R0
GOTO DELAY3
RETLW 0
END
TeME:
2. Sa se scrie un program in care sa se completeze cu AAh toate registrele de uz general din segmentul 0 de memorie, apoi sa-i copieze in segmentul 2 de memorie. Daca copierea a fost efectuata se vor aprinde led-urile 0 pentru 10 secunde si apoi led-ul 1 pentru 20 secunde (ledurile corespunzatoare pinilor RB:<0> si RB:<1>).
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1716
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved