[ Pobierz całość w formacie PDF ]

;------------------------------------------------------------------------------
ORL IE,#82H ; aktywacja systemu przerwań (licznik 0)
SETB TR0 ; aktywacja licznika 0
repeat_label:MOV A,data_symbol
ADD A,#typeless_symbol
CALL code_symbol
MOV DPTR,#xdata_symbol
MOVX A,@DPTR
MOV R1,A
PUSH AR1
CALL sub_routine1
POP AR1
ADD A,R1
JMP repeat_label
code_entry: CALL code_symbol
RET
code_table: DW repeat_label
DW code_entry
DB typeless_number
DB 0
$EJECT
3
;------------------------------------------------------------------------------
; Przydziel każdemu podprogramowi obsługi przerwania jego własny segment kodu.
;------------------------------------------------------------------------------
int0_code_segSEGMENT CODE ; segment dla podprogramu przerwania
RSEG int0_code_seg ; przełączenie na segment code
USING 1 ; bank rejestrów dla podprogramu przerwania
timer0int: PUSH PSW
MOV PSW,#08H ; bank 1 rejestrów
PUSH ACC
MOV R1,data_variable
MOV DPTR,#xdata_variable
MOVX A,@DPTR
ADD A,R1
MOV data_variable1,A
CLR A
ADD A,#0
MOV data_variable1+1,A
POP ACC
POP PSW
RETI
;------------------------------------------------------------------------------
; Dyrektywa END jest zawsze wymagana.
;------------------------------------------------------------------------------
END ; Koniec pliku
4
NAME PRZETWORNIK_CA
ADRES_CA EQU 8000H ;definicja stałej o wartości 8000H
BIT_SEG SEGMENT BIT ;definicja segmentu relokowalnego
RSEG BIT_SEG ;w pamięci adresowanej bitowo
ZNACZNIK: DBIT 1 ;zmienna o rozmiarze 1-go bita
ZMIENNE_SEG SEGMENT DATA ;definicja segmentu relokowalnego
RSEG ZMIENNE_SEG ;w pamięci adresowanej bezpośrednio
WARTOSC: DS 1 ;zmienna o rozmiarze 1-go bajta
CSEG AT 0 ;absolutny segment kodu od adresu 0
LJMP START ;skok instrukcji oznaczonej etykietą START
ORG 0BH ;absolutny segment kodu od adresu 0BH
LJMP T0_INT ;skok do instrukcji oznaczonej etykietą T0_INT
ORG 23H ;absolutny segment kodu od adresu 23B
LJMP SER_INT ;skok do instrukcji oznaczonej etykietą SER_INT
START: MOV SP,#60H ;początek prog. Głównego; ustawienie wskaznika stosu
MOV TMOD, #21H ;T0  tryb 0, T1  tryb 2
MOV TL0, #0AFH ;wartość początkowa licznika T0; przerwanie będzie
MOV TH0, #3CH ;wyzwalane co 50ms dla rezonatora 12MHz
MOV TL1, #0FDH ;wartość początkowa licznika T1 taktującego port
MOV TH1, #0FDH ;szeregowy
MOV SCON, #50H ;tryb 1 portu szeregowego
MOV WARTOSC, #0 ;wartość początkowa zmiennej WARTOSC
SETB ZNACZNIK ;wartość początkowa znacznika ZNACZNIK
1
SETB TRO ;uruchomienie licznika T0
SETB TR1 ;uruchomienie licznika T1
MOV IE,#10010010B ;aktywacja przerwań od T0 i portu szeregowego
SJMP $ ;koniec programu głównego, skok na siebie
T0_INTSEG SEGMENT CODE ;relokowalny segment kodu dla podprogramu obsługi
RSEG T0_INT_SEG ;przerwania od licznika T0
T0_INT: ORL TH0, #0AFH ;przepisanie początkowych wartości
MOV TH0, #3CH ;do rejestrów licznika
JNB ZNACZNIK, OPUSC_T ; jeśli ZNACZNIK różny od 1 to skacz __
PUSH A ;zapamiętanie zawartości akumulatora na stosie
MOV A, WARTOSC
MOV DPTR, #ADRES_CA ;zapis adresu przetwornika C/A do rejestru DPTR
MOVX @DPTR, A ;wysłanie wartości do przetwornika C/A
INC WARTOSC ;inkrementacja zmiennej WARTOSC
POP A ;ściągnięcie ze stosu wartości akumulatora
OPOSC_T:RETI ;__ tutaj; koniec podprogramu obsługi przerwania
SER_INT_SEG SEGMENT CODE ;relokowalny segment kodu dla podprogramu obsługi
RSEG SER_INT_SEG ;przerwania od portu szeregowego
SER_INT:PUSH A ;zapamiętanie zawartości akumulatora na stosie
CLR RI ;zerowanie znacznika odebrania znaku
MOV A, SBUF ;odczyt bufora portu szeregowego
CJNE A, #10, OPUSC_S ;gdy odebrana wartość różna od 10, to ...
CPL ZNACZNIK ;negacja bitu ZNACZNIK
OPUSC_S:POP A ;... skacze tutaj
RETI ;koniec podprogramu obsługi przerwania
END ;koniec programu
2 [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • fopke.keep.pl