Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;Dodawanie 2 liczb (A+B) 16bitowych
- PROG SEGMENT CODE
- lowA DATA 30h
- highA DATA 31h
- lowB DATA 32h
- highB DATA 33h
- lowWynik DATA 34h
- highWynik DATA 35h
- zmA EQU 0F08h
- zmB EQU 03FFh
- CSEG AT 0
- JMP START
- RSEG PROG
- START:
- ;Wpisuje wartości pod odpowiednie komórki (low - mniej znaczące bity, high - bardziej znaczące bity)
- MOV lowA, #low(zmA)
- MOV highA, #high(zmA)
- MOV lowB, #low(zmB)
- MOV highB, #high(zmB)
- ;Dodaję mniej znaczące bity do siebie, a następnie bardziej znaczące
- MOV A, lowA
- ADDC A, lowB
- MOV lowWynik, A
- MOV A, highA
- ADDC A, highB
- MOV highWynik, A
- END
- ;Odejmowanie 2 liczb (A-B) 16bitowych
- PROG SEGMENT CODE
- lowA DATA 30h
- highA DATA 31h
- lowB DATA 32h
- highB DATA 33h
- lowWynik DATA 34h
- highWynik DATA 35h
- zmA EQU 0FF08h
- zmB EQU 1009h
- CSEG AT 0h
- JMP START
- RSEG PROG
- START:
- MOV lowA, #low(zmA)
- MOV highA, #high(zmA)
- MOV lowB, #low(zmB)
- MOV highB, #high(zmB)
- MOV A, lowA
- SUBB A, lowB
- MOV lowWynik, A
- MOV A, highA
- SUBB A, highB
- MOV highWynik, A
- END
- ;Kopiowanie elementow z tablicy do komorek o adresach 30h-35h
- ;Wskaźniki - do rejestru R0 lub R1 przenosimy wartość wskazującą na dany adres (np. #30h),
- ;wartość tą możemy inkrementować i pobierać dane z konkretnego adresu (MOV A, @R0)
- PROG SEGMENT CODE
- CSEG AT 0
- JMP START
- RSEG PROG
- START:
- MOV DPTR, #TABLE
- MOV R0, #30h
- LOOP:
- MOVC A, @A+DPTR
- MOV @R0, A
- INC DPTR
- INC R0
- CLR A
- CJNE R0, #35h, loop
- JMP KONIEC
- TABLE: db 01h, 02h, 03h, 04h, 05h
- KONIEC:
- END
- ;Migające diody
- ;ACALL - wywołanie funkcji, wymagane RET
- ;DELAY - for w forze
- PROG SEGMENT CODE
- CSEG AT 0
- JMP LOOP
- RSEG PROG
- LOOP:
- MOV P2, #10101010b
- ACALL DELAY
- MOV P2, #01010101b
- ACALL DELAY
- AJMP LOOP
- DELAY:
- MOV R0, #255
- ODL2:
- MOV R1, #255
- ODL1:
- NOP
- NOP
- DJNZ R1, ODL1
- DJNZ R0, ODL2
- RET
- END
- ;Zapalanie diod odpowiednimi przyciskami
- PROG SEGMENT CODE
- CSEG AT 0
- JMP start
- RSEG PROG
- start:
- MOV A,P3
- ORL A, #00h
- MOV P2,A
- SJMP start
- END
- ;Zapalanie/gaszenie diody przy przepełnieniu timera 0
- PROG SEGMENT CODE
- LED BIT P2.0
- CSEG AT 0
- JMP START
- RSEG PROG
- START:
- MOV TL0, #255
- MOV TH0, #255
- MOV TMOD, #01h
- SETB TR0
- LOOP:
- JNB TF0, $
- CLR TF0
- CPL LED
- SJMP LOOP
- END
- ;Rodzaje przerwań i ich konfiguracja
- PROG SEGMENT CODE
- CSEG AT 0
- JMP START
- CSEG AT 0Bh
- AJMP przerwanie_TIMER0 ;przepełnienie TIMERA0
- CSEG AT 1Bh
- AJMP przerwanie_TIMER1 ;przepełnienie TIMERA1
- CSEG AT 03h
- AJMP przerwanie_ZEWN0 ;przerwanie zewnętrzne INT0 - przycisk: P2.2
- CSEG AT 13h
- AJMP przerwanie_ZEWN1 ;przerwanie zewnętrzne INT1 - przycisk: P2.3
- RSEG PROG
- START:
- SETB EA ;odblokowanie globalne przerwań
- SETB ET1 ;odblokowanie przerwań na timerze 1
- SETB EX1 ;odblokowanie przerwań na INT1
- SETB ET0 ;odblokowanie przerwań na timerze 0
- SETB EX0 ;odblokowanie przerwań na INT0
- ;JEDNO PRZERWANIE NA RAZ, ustawiam priorytet zewnętrznym przerwaniom - nie mogą być przerwane przez inne przerwania
- SETB PX1 ;priorytet INT1
- SETB PX0 ;priorytet INT0
- ;PT0, PT1 - priorytety timerow, PS - priorytet przerwania szeregowego
- ;TIMER1 ma wiekszy priorytet od TIMERA0, zewnętrzne przerwania mają większy priorytet od timerow, z tego powodu
- ;po wywołaniu przerwania zewnętrznego przerwania timerow przestaja byc obslugiwane, przerwanie INT1 ma wiekszy
- ;priorytet od INT0
- ;Konfiguracja timerow:
- MOV TL0, #255h
- MOV TH0, #255h
- MOV TL1, #128h
- MOV TH1, #128h
- MOV TMOD #01h
- SETB TR0
- SETB TR1
- LOOP:
- CPL P2.0
- ACALL DELAY
- SJMP LOOP
- DELAY:
- MOV R0, #255h
- ODL1:
- MOV R1, #255h
- ODL2:
- NOP
- NOP
- DJNZ R1, ODL2
- DJNZ R0, ODL1
- RET
- przerwanie_TIMER0:
- CPL P2.1
- CLR TF0
- ACALL DELAY
- RETI
- przerwanie_TIMER1:
- CPL P2.2
- CLR TF1
- ACALL DELAY
- RETI
- przerwanie_ZEWN0:
- CPL P2.3
- ACALL DELAY
- RETI
- przerwanie_ZEWN1:
- CPL P2.4
- ACALL DELAY
- RETI
- END
- ;Przerwanie zewnętrzne wyzwalane zboczem
- CSEG AT 0
- JMP START
- CSEG AT 03h
- AJMP przerwanie_INT0
- CSEG AT 30h
- START:
- SETB EA
- SETB EX0
- SETB IT0 ;INT0 wyzwalany zboczem (IT1 dla INT1)
- ;IE0/IE1 - flaga inf. o przerwaniu zewnętrznym INT0/INT1,
- ;ustawiana sprzętowo, zerowana przy przyjęciu przerwania
- LOOP:
- CPL P2.0
- ACALL DELAY
- SJMP LOOP
- DELAY:
- MOV R0, #255
- ODL1:
- MOV R1, #255
- ODL2:
- NOP
- NOP
- DJNZ R1, ODL2
- DJNZ R0, ODL1
- RET
- przerwanie_INT0:
- CPL P2.1
- ACALL DELAY
- RETI
- END
- ;Pobieranie znaku i wpisywanie do SBUF kolejnego znaku (INC A)
- CSEG AT 0
- AJMP START
- CSEG AT 30h
- START:
- MOV SCON, #50h
- MOV TMOD, #20h
- MOV TH1, #0FDh
- SETB TR1
- CLR TI
- LOOP:
- JNB R1, $ ;czeka na odbior znaku
- MOV A, SBUF ;pobranie znaku do akumulatora
- CLR RI ;czyszczenie flagi odbioru
- CPL P2.0
- INC A
- MOV SBUF, A
- JNB TI, $ ;czeka na oprożnienie bufora nadajnika
- CLR TI
- CPL P2.0
- AJMP LOOP
- END
- ;Koder i dekoder - UART
- CSEG AT 0
- JMP START
- CSEG AT 30h
- START:
- MOV SCON, #50h
- MOV TMOD, #20h
- MOV TH1, #0FDh ; 9600 Bds at 11.0592MHz
- SETB TR1 ; uruchomienie licznika
- CLR TI ; wyzerowanie flagi wyslania
- LOOP:
- JNB P3.7, KODER
- JNB P3.6, DEKODER
- SJMP LOOP
- KODER:
- CLR P3.7
- SETB P3.6
- JNB RI, $
- MOV A, SBUF
- INC A
- CLR RI
- SJMP LOOP
- DEKODER:
- CLR P3.6
- SETB P3.7
- MOV SBUF, A
- JNB TI, $
- CLR TI
- SJMP LOOP
- END
- ;Pobranie 5 znakow z UARTA do adresow 30h-34h
- PROG SEGMENT CODE
- CSEG AT 0h
- JMP START
- RSEG PROG
- START:
- MOV R0, #30h
- MOV SCON, #50h
- MOV TMOD, #20h
- MOV TH1, #0FDh
- SETB TR1
- LOOP:
- JNB RI, $
- MOV A, SBUF
- MOV @R0, A
- INC R0
- CLR RI
- CJNE R0, #35h, LOOP
- END
- ;Szukanie największej liczby spośrod tablicy liczb
- PROG SEGMENT CODE
- CSEG AT 0
- JMP START
- RSEG PROG
- START:
- MOV DPTR, #table
- MOVC A, @A+DPTR
- MOV R0, A
- INC DPTR
- INC R1
- LOOP:
- CLR A
- MOVC A, @A+DPTR
- MOV B, R0
- INC DPTR
- INC R1
- CJNE A, B, IF1
- CHECK:
- CJNE R1, #05, LOOP
- AJMP KONIEC
- IF1: ;A>B
- JC IF2
- MOV R0, A
- SJMP CHECK
- IF2: ;A>B
- SJMP CHECK
- table: db 01, 07, 03, 09, 05
- KONIEC:
- END
- ;Szukanie najmniejszej liczby sposrod adresow 30-34
- PROG SEGMENT CODE
- CSEG AT 0
- JMP START
- RSEG PROG
- START:
- MOV R0, #30h
- MOV R1, 30h
- INC R0
- LOOP:
- MOV A, R1
- MOV B, @R0
- INC R0
- CJNE A, B, IF1
- CHECK:
- CJNE R0, #35h, LOOP
- SJMP KONIEC
- IF1: ;A>B
- JC IF2
- MOV R1, B
- SJMP CHECK
- IF2: ;A<B
- SJMP CHECK
- KONIEC:
- END
- ;Szukanie największej liczby z UARTA, wczytywanie 5 liczb
- PROG SEGMENT CODE
- CSEG AT 0
- JMP START
- RSEG PROG
- START:
- MOV SCON, #50h
- MOV TMOD, #20h
- MOV TH1, #0FDh
- SETB TR1
- JNB RI, $
- CLR RI
- MOV R0, SBUF
- INC R1
- LOOP:
- MOV A, R0
- JNB RI, $
- MOV B, SBUF
- CLR RI
- INC R1
- CJNE A, B, IF1
- CHECK:
- CJNE R1, #05, LOOP
- SJMP KONIEC
- IF1: ;A>B
- JC IF2
- SJMP CHECK
- IF2: ;A<B
- MOV A, B
- MOV R0, A
- SJMP CHECK
- KONIEC:
- END
- ;W komorkach pamięci o adresach 50h-80h znajdują się
- ;jakieś wartości. Dodaj je do siebie, wynik wpisz do rejestru R3
- PROG SEGMENT CODE
- CSEG AT 0
- JMP start
- RSEG PROG
- START:
- MOV R0, #50h
- LOOP:
- ADD A, @R0
- INC R0
- CJNE R0, #81h, LOOP
- MOV R3, A
- END
- ;Porownanie R3 I R4, odjęcie mniejszej od większej, roznica do R2
- PROG SEGMENT CODE
- CSEG AT 0
- JMP START
- RSEG PROG
- START:
- MOV R3, #15h
- MOV R4, #25h
- MOV A, R3
- MOV B, R4
- CJNE A, B, IF1
- MOV R2, #00h
- SJMP KONIEC
- IF1: ;A>B(R4)
- JC IF2 ;A<B
- SUBB A, B ;(R3-R4)
- MOV R2, A
- SJMP KONIEC
- IF2: ;A<B (R3<R4)
- CLR C
- MOV A, B ;(A = R4)
- SUBB A, R3 ;(R4-R3)
- MOV R2, A
- SJMP KONIEC
- KONIEC:
- END
- ;W R3 i R4 są jakieś wartości. Jeśli są sobie rowne, wpisz pod adres 20h 1.
- ;W przeciwnym razie mniejszą odejmij od większej, a rożnicę zapisz pod
- ;adresem 21h
- PROG SEGMENT CODE
- CSEG AT 0
- JMP START
- RSEG PROG
- START:
- MOV R3, #15h
- MOV R4, #25h
- MOV A, R3
- MOV B, R4
- CJNE A, B, IF1
- MOV 20h, #01
- SJMP KONIEC
- IF1: ;A>B
- JC IF2
- SUBB A, B
- MOV 21h, A
- SJMP KONIEC
- IF2:
- CLR C
- MOV A, B
- SUBB A, R3
- MOV 21h, A
- SJMP KONIEC
- KONIEC:
- END
- ;Zaświecaj po kolei diody (od 0 do 7)
- PROG SEGMENT CODE
- CSEG AT 0
- JMP START
- RSEG PROG
- START:
- MOV A, #0FFh
- LOOP:
- RLC A
- MOV P2, A
- INC R0
- CJNE R0, #08, LOOP
- END
- ;Jeśli użytkownik wciśnie 10x przycisk P3.2 zapala się kolejna dioda. D0=10x, D1=20x, D3=30x itd.
- PROG SEGMENT CODE
- CSEG AT 0
- JMP START
- RSEG PROG
- START:
- MOV A, #0FFh
- MOV R7, #08
- NEXT:
- MOV R6, #10
- LOOP:
- JB P3.2, $
- JNB P3.2, $
- DJNZ R6, LOOP
- RLC A
- MOV P2, A
- DJNZ R7, NEXT
- END
- ;W komorkach pamięci od adresow 30h-40h są jakieś wartości. Wyświetlaj każdą z nich binarnie na diodach
- ;od pierwszej komorki. Odbywa się to przez wciśniecie przycisku P3.2
- PROG SEGMENT CODE
- SWITCH BIT P3.2
- CSEG AT 0
- JMP START
- RSEG PROG
- START:
- MOV R0, #30h
- LOOP:
- JNB SWITCH, $
- JB SWITCH, $
- MOV A, @R0
- INC R0
- MOV P2, A
- CJNE R0, #41h, LOOP
- END
- ;Wartość spod adresu 20h umieść pod adresem na ktory wskazuje wartość znajdująca się w rejestrze R3
- PROG SEGMENT CODE
- CSEG AT 0
- JMP START
- RSEG PROG
- START:
- MOV 20h, #30h
- MOV R3, #31h
- MOV A, R3
- MOV R0, A
- MOV @R0, 20h
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement