LAB ostateczna
WR_CMD EQU 0FF2CH
RD_STATUS EQU 0FF2EH
WR_DATA EQU 0FF2DH
RD_DATA EQU 0FF2FH
INIT EQU 038H
CLEAR EQU 001H
LCD_ON EQU 00FH
SEKUNDY EQU 0
MINUTY EQU 0
GODZINY EQU 0
jest_sek EQU 0
CZAS EQU 50
CYKLE EQU (65536 - CZAS*1000)
ORG 0
call set_timer
CALL inicjuj
SJMP $
ORG 0BH
INC R7
CJNE R7,#20,DALEJ2
MOV R7,#0
CALL licz
CALL disp_time
dalej2:
RETI
set_timer:
CLR TR0
CLR TF0
ANL TMOD,#11110000B
ORL TMOD, #00000001B
MOV TL0, #LOW(CYKLE)
MOV TH0, #HIGH(CYKLE)
SETB EA
SETB ET0
SETB TR0
RET
licz:
push ACC
INC SEKUNDY
mov A,SEKUNDY
CJNE A,#60,DALEJ
MOV SEKUNDY,#0
INC MINUTY
mov A,SEKUNDY
CJNE A,#60,DALEJ
mov MINUTY,#0
INC GODZINY
DALEJ:
pop acc
RET
write_cmd:
PUSH ACC
MOV DPTR,#RD_STATUS
loop_:
MOVX A,@DPTR
JB ACC.7,loop_
MOV DPTR,#WR_CMD
POP ACC
MOVX @DPTR,A
RET
inicjuj:
MOV A,#INIT
CALL write_cmd
MOV A,#CLEAR
CALL write_cmd
MOV A,#LCD_ON
CALL write_cmd
RET
write_data:
PUSH ACC
MOV DPTR,#RD_STATUS
loop1_:
MOVX A,@DPTR
JB ACC.7,loop1_
MOV DPTR,#WR_DATA
POP ACC
MOVX @DPTR,A
RET
goto_xy:
mov R2,#0
JNB ACC.5, dalej3
mov R2,#1
dalej3:
mov R3, A
mov A, #00001111B
anl A, R3
mov R1,A
mov A,R2
mov B, #64
mul AB
add A,R1
orl A,#128
call write_cmd
Ret
disp_dec:
mov B,#10
div AB
add A, #'0'
call write_data
mov A,B
add A,#'0'
call write_data
Ret
disp_time:
push acc
mov A, #00000100B
call goto_xy
mov A,GODZINY
call disp_dec
mov A,#':'
call write_data
mov A,MINUTY
call disp_dec
mov A,#':'
call write_data
mov A,SEKUNDY
call disp_dec
pop acc
END
ORG 0
TIME EQU 50 ; Zmienna - czas do odmierzenia w ms
LOAD EQU (65536 - TIME*1000) ; Zmienna - liczba cykli potrzebnych do odmierzenia czasu
MOV P1, #00001111B ; Zapalenie 4 diod
MOV R0, #100 ; Licznik, ile razy ma być odliczone 50 ms, w R0
CALL ODMIERZ_X50MS_T ; Wywołanie procedury odliczającej 1 s timerem
MOV P1, #11110000B ; Zgaszenie 4 diod i zapalenie 4 pozostałych
MOV R0, #40 ; Licznik, ile razy ma być odliczone 50 ms, w R0
CALL ODMIERZ_X50MS_T ; Wywołanie procedury odliczającej 2 s timerem
MOV P1, #00001111B ; Zgaszenie 4 diod i zapalenie 4 pozostałych
SJMP $ ; Pętla instrukcji - zapobiega wejściu do procedury
ODMIERZ_X50MS_T:
CLR TR0 ; Wyłączanie timera
ANL TMOD, #0F0H ; Wyzerowanie rejestru sterującego timera nr 0
ORL TMOD, #1 ; Ustawienie trybu timera na 16 bitów
PETLA: ; Pętla, w której odmierzane jest 50ms(50 000 cykli)
MOV TH0, #HIGH(LOAD) ; Załadowanie starszych bitów zmiennej z liczbą cykli(stop)
MOV TL0, #LOW(LOAD) ; Załadowanie młodszych bitów zmiennej z liczbą cykli(start)
CLR TF0 ; Wyzerowanie bitu przepełnienia
SETB TR0 ; Włączenie timera
JNB TF0, $ ; Odliczanie dopóki nie nastąpi przepełnienie
DJNZ R0, PETLA ; Zmniejszenie licznika(R0) i jeśli > 0 - powtórzenie PETLA
RET ; Wyjście z procedury
END
LAB XXXX
LJMP START
ORG 100H
START:
LCALL TABLICA_KODOW ; wywoluje funkcje, która tworzy w pamieci tablice do zamiany kodu klawisza na wartosc
; Porty klawiatury
P5 EQU 0F8H
P7 EQU 0DBH
; Rejestry LCD
LCDstatus EQU 0FF2EH
LCDcontrol EQU 0FF2CH
LCDdataWR EQU 0FF2DH
; Funkcje LCD
INIT EQU 038H ; inicjalizuje wyswietlacz
CLEAR EQU 001H ; czysci wyswietlacz
HOME EQU 080H ; umieszcza kursor w pierwszej linii
HOME2 EQU 0C0H ; umieszcza kursor w drugiej linii
LCALL LCD_INIT
LCALL DELAY
LCALL WYCZYSC
MOV R2, #0x00 ; zeruje R2
ODCZYT:
MOV R0, #4 ; iterator po 4 wierszach klawiatury
MOV R1, #01111111B ; maska do aktywacji kolejnych wierszy klawiatury
PETLA1:
ORL P5, #11110000B ; reset portu P5 - dezaktywuje wszystkie wiersze
MOV A, R1 ; kopiuje maske z R1 do A
ANL P5, A ; aktywuje odpowiedni wiersz klawiatury
MOV A, P7 ; kopiuje zawartosc P7 do A – odczytuje kod kolumny
ORL A, #11110000B ; ustawia starsza, nieistotna czesc na 1
CPL A ; neguje A
JZ PETLA2 ; jezeli A=0 skok do petla2 - nic nie jest wcisniete
CPL A ; odtwarza A po negacji
ANL A, R1 ; sklada kod klawisza
MOV R2, A ; zapisuje kod w R2
LJMP ODCZYT ; skok do odczyt – rozpoczyna skanowanie od nowa
PETLA2:
MOV A, R1 ; kopiuje do akumulatora aktualna maske z R1
RR A ; przesuwa maske o 1 bit w prawo, czyli
; zmienia aktywny wiersz na nastepny
MOV R1, A ; wpisuje do R1 nowa maske
DJNZ R0, PETLA1 ; jezeli --R0 =! 0 to skok do petla1, czyli
; powtarza skanowanie dla nastepnego wiersza
; Program znajduje sie w tym miejscu jezeli R0=0
; oznacza to, ze przeskanowal wszystkie wiersze
MOV A, R2 ; umieszcza zawartosc R2 w A
JZ ODCZYT ; jezeli A(R2) = 0 to znaczy ze zaden klawisz nie zostal ostatnio wcisniety, wiec rozpoczyna skanowanie od nowa
; Program znajduje sie w tym miejscu jezeli ostatnio zostal wcisniety i zwolniony jakis klawisz, a jego kod nie zostal dotychczas wyswietlony
MOV DPH, #0x80 ; umieszcza stala 80 w starszej czesci DPTR
MOV DPL, R2 ; umieszcza kod klawisza w mlodszej czesci DPTR
MOVX A, @DPTR ; umieszcza wartosc klawisza w A
JZ WYCZYSC
LCALL LCD_WRITE_CHAR ; wyswietla wartosc klawisza na wyswietlaczu
MOV R2, #0x00 ; zeruje R2 – zapobiega repetycji
LJMP ODCZYT
WYCZYSC:
LCALL LCD_CLEAR
LJMP ODCZYT
NOP
NOP
NOP
JMP KONIEC
; Definicje funkcji
LCD_INIT:
MOV DPTR,#LCDcontrol ; ustawia wzskaznik DPTR na rejestr funkcji wyswietlacza
MOV A, #INIT
MOVX @DPTR, A ; inicjalizuje wyswietlacz
MOV A, #CLEAR
MOVX @DPTR, A ; czysci wyswietlacz
MOV A, #HOME
MOVX @DPTR, A ; ustawia kursor w pierszej linii
MOV R6, #16
MOV R7, #32
RET
LCD_CLEAR:
MOV DPTR,#LCDcontrol ; ustawia wzskaznik DPTR na rejestr funkcji wyswietlacza
MOV A, #CLEAR
MOVX @DPTR, A ; czysci wyswietlacz
MOV A, #HOME
MOVX @DPTR, A ; ustawia kursor w pierszej linii
MOV R6, #16
MOV R7, #32
RET
LCD_WRITE_CHAR: ; funkcja wyswietlajaca znak zapisany w A na wyswietlaczu
PUSH ACC ; odklada A na stos
BUSY:
MOV DPTR, #LCDstatus
MOVX A, @DPTR
JB ACC.7, BUSY ; jezeli wyswitlacz jest zajety, to czekaj
MOV A, R7
JNZ CHECK_LINE
LCALL LCD_CLEAR
LJMP WRITE
CHECK_LINE:
MOV A, R6
JNZ WRITE
MOV DPTR,#LCDcontrol ; ustawia wzskaznik DPTR na rejestr funkcji wyswietlacza
MOV A, #HOME2
MOVX @DPTR, A ; ustawia kursor w drugiej linii
MOV R6, #16
WRITE:
POP ACC ; zdejmuje A ze stosu
MOV DPTR,#LCDdataWR ; ustawia wzskaznik DPTR na rejestr wypisywania danych
MOVX @DPTR,A ; wyswietla znak
DEC R7
DEC R6
RET
TABLICA_KODOW: ; funkcja umieszczajaca w pamieci kody klawiszy
;0
MOV DPTR, #0x80EB
MOV A, #48
MOVX @DPTR, A
;1
MOV DPTR, #0x8077
MOV A, #49
MOVX @DPTR, A
;2
MOV DPTR, #0x807B
MOV A, #50
MOVX @DPTR, A
;3
MOV DPTR, #0x807D
MOV A, #51
MOVX @DPTR, A
;4
MOV DPTR, #0x80B7
MOV A, #52
MOVX @DPTR, A
;5
MOV DPTR, #0x80BB
MOV A, #53
MOVX @DPTR, A
;6
MOV DPTR, #0x80BD
MOV A, #54
MOVX @DPTR, A
;7
MOV DPTR, #0x80D7
MOV A, #55
MOVX @DPTR, A
;8
MOV DPTR, #0x80DB
MOV A, #56
MOVX @DPTR, A
;9
MOV DPTR, #0x80DD
MOV A, #57
MOVX @DPTR, A
;A
MOV DPTR, #0x807E
MOV A, #65
MOVX @DPTR, A
;B
MOV DPTR, #0x80BE
MOV A, #66
MOVX @DPTR, A
;C
MOV DPTR, #0x80DE
MOV A, #67
MOVX @DPTR, A
;#
MOV DPTR, #0x80ED
MOV A, #35
MOVX @DPTR, A
;D
MOV DPTR, #0x80EE
MOV A, #68
MOVX @DPTR, A
;*
MOV DPTR, #0x80E7
MOV A, #42
MOVX @DPTR, A
RET ; koniec funkcji TABLICA_KODOW
; opoznienie
DELAY:
MOV R0, #200
DELAY_1:
MOV R1, #255
DELAY_2:
DJNZ R1, DELAY_2
DJNZ R0, DELAY_1
RET
KONIEC:
END START
LAB4
WR_CMD EQU 0FF2CH ; RW=0, RS=0
WR_DATA EQU 0FF2DH ; RW=0, RS=1
RD_STATUS EQU 0FF2EH ; RW=1, RS=0
;RD_DATA EQU 0FF2CH ; RW=1, RS=1 ??
INS_CLEAR EQU 001H
INS_FUNCT_SET EQU 038H
INS_DISPLAY_ON EQU 00EH
ENTRY_MODE_SET EQU 006H
ORG 0
LCALL init
MOV DPTR, #text
LCALL PISZ
SJMP $
KOMENDA:
PUSH DPH
PUSH DPL
LCALL wait_while_busy
MOV DPTR, #WR_CMD
MOVX @DPTR, A
POP DPL
POP DPH
RET
write_data:
PUSH DPH
PUSH DPL
LCALL wait_while_busy
MOV DPTR, #WR_DATA
MOVX @DPTR, A
POP DPL
POP DPH
RET
wait_while_busy:
PUSH ACC
MOV DPTR, #RD_STATUS
busy_loop:
MOVX A, @DPTR
JB ACC.7, busy_loop
POP ACC
RET
PISZ:
MOVX A, @DPTR
JZ PISZ_end
LCALL write_data
INC DPTR
SJMP PISZ
PISZ_end:
RET
;-----------------------------------------------
init:
MOV A, #INS_FUNCT_SET
LCALL KOMENDA
MOV A, #INS_CLEAR
LCALL KOMENDA
MOV A, #INS_DISPLAY_ON
LCALL KOMENDA
MOV A, #ENTRY_MODE_SET
LCALL KOMENDA
RET
text: DB 'EIT & INF',0
END
____________________________________________________________________________________________________
tekst1: DB 'ala ma kota', 0
tekst2: DB 'Zan & Miki :)', 0
LEDS EQU P1
LCD_INSTRUCTION_CLEAR EQU 001H
LCD_INSTRUCTION_DISPLAY_ON EQU 00EH
LCD_INSTRUCTION_FUNCTION_SET EQU 038H
LCD_ADDR_READ_STATUS EQU 0FF2EH
LCD_ADDR_WRITE_COMMAND EQU 0FF2CH
LCD_ADDR_WRITE_DATA EQU 0FF2DH
ORG 0
SJMP main
; --------------------------------------------------
; main()
; --------------------------------------------------
main:
LCALL lcd_init
;;MOV A, #'A'
;;LCALL lcd_write_data
MOV DPTR, tekst1
LCALL lcd_patch
main_loop:
MOV A, LEDS
CPL A
MOV LEDS, A
SJMP main_loop
; --------------------------------------------------
; procedura czekajaca doputy wyswietlacz bedzie juz dostepny
; --------------------------------------------------
lcd_wait_while_busy:
PUSH ACC ; odkladamy A na stos
MOV DPTR, #LCD_ADDR_READ_STATUS ; prosimy wyswietlacz o zwrocenie statusy, musimy sprawdzic czy nie jest zajety
lcd_wait_while_busy_loop:
MOVX A, @DPTR ; wrzucamy odpowiedz wyswietlacza do akumulatora
JB ACC.7, lcd_wait_while_busy_loop ; sprawdzamy 7 bit akumulatora (BF - busy flag), jesli wyswietlacz jest zajety to zapetlamy sie
POP ACC ; sciagamy A ze stosu
RET
; --------------------------------------------------
; wyslanie komendy do wyswietlacza
; komenda w A
; --------------------------------------------------
lcd_write_cmd:
LCALL lcd_wait_while_busy
MOV DPTR, #LCD_ADDR_WRITE_COMMAND ; przesylamy odpowiedni kod do wyswietlacza
MOVX @DPTR, A ; przesylamy zawartosc akumulatora do wyswietlacza
RET
; --------------------------------------------------
; wyslanie danych do wyswietlacza
; dane w A
; --------------------------------------------------
lcd_write_data:
LCALL lcd_wait_while_busy
MOV DPTR, #LCD_ADDR_WRITE_DATA ; przesylamy odpowiedni kod do wyswietlacza
MOVX @DPTR, A ; przesylamy zawartosc akumulatora do wyswietlacza
RET
; --------------------------------------------------
; inicjalizacja wyswietlacza LCD
; --------------------------------------------------
lcd_init:
MOV A, #LCD_INSTRUCTION_FUNCTION_SET
LCALL lcd_write_cmd
MOV A, #LCD_INSTRUCTION_CLEAR
LCALL lcd_write_cmd
MOV A, #LCD_INSTRUCTION_DISPLAY_ON
LCALL lcd_write_cmd
RET
; --------------------------------------------------
; przejscie do wspolrzednych x/y w wyswietlaczu
; argument w A, mlodsze 4 bity - pozycja x, 5 bit - pozycja y (jak 0 to gora jak 1 to dol)
; --------------------------------------------------
lcd_gotoxy:
RET
; --------------------------------------------------
; wysylanie tekstu, w DPTR wskaznik na tekst
; --------------------------------------------------
lcd_patch:
MOVX A, @DPTR
JZ lcd_patch_end ; sprawdzamy czy akumulator jest zerem
LCALL lcd_write_data
INC DPTR
SJMP lcd_patch ; wysylamy nastepny znak
lcd_patch_end:
RET
END
LAB 3
P5 EQU 0F8H
P7 EQU 0DBH
LJMP START
ORG 100H
START:
MOV DPH,#0x80;
MOV DPL,#0x11;
MOV A,#0x11;
MOVX @DPTR,A;
MOV DPL,#21h;
MOV A,#2h;
MOVX @DPTR, A;
MOV DPL,#31h;
MOV A,#3h;
MOVX @DPTR,A;
MOV DPL,#12h;
MOV A,#4h;
MOVX @DPTR, A;
MOV DPL,#22h;
MOV A,#5h;
MOVX @DPTR, A;
MOV DPL,#32h;
MOV A,#6h;
MOVX @DPTR, A
MOV DPL,#13h;
MOV A, #7h;
MOVX @DPTR, A
MOV DPL,#23h;
MOV A,#8h;
MOVX @DPTR, A
MOV DPL,#32h;
MOV A, #9h;
MOVX @DPTR, A
MOV DPL,#34h;
MOV A, #0h;
MOVX @DPTR, A
MOV DPL,#41h;
MOV A,#10;
MOVX @DPTR, A
MOV DPL,#42h;
MOV A, #11;
MOVX @DPTR, A
MOV DPL,#43h;
MOV A,#12;
MOVX @DPTR,A
MOV DPL,#44h;
MOV A, #13;
MOVX @DPTR, A
MOV DPL,#34h;
MOV A,#14;
MOVX @DPTR, A
MOV DPL,#14h;
MOV A,#15;
MOVX @DPTR, A;
START1:
MOV P5, #01111111B
MOV R5, #4
PETLA1:
MOV A, P7
CPL A
JZ PETLA2
CPL A
XRL A, P5
CPL A
MOV DPL, A;
MOVX A, @DPTR;
CPL A;
MOV P1,A
JMP MARTWAPETLA
POWROT:
MOV P1, #0FFh
PETLA2:
MOV A, P5
RR A
MOV P5, A
DJNZ R5,PETLA1
MARTWAPETLA:
MOV R5, #0FFH
CZEKANIE1:
MOV R4, #0100
CZEKANIE2:
DJNZ R4,CZEKANIE2
DJNZ R5,CZEKANIE1
JMP POWROT
JMP START1
NOP
NOP
NOP
JMP $
END START1
nasze na zajeciach 2
P5 EQU 0F8H
P7 EQU 0DBH
LJMP START
ORG 100H
START:
MOV DPH,#0x80; znaczące bajty dla klawiatury
MOV DPL,#0x11; znając każdy adres przycisku przyporządkowujemy mu nowy adres
MOV A,#0x11;
MOVX @DPTR,A; i skladamy go w 16 bitowy
; i tak przez wszytskie 16 klawiszy
MOV DPL,#21h;
MOV A,#2h;
MOVX @DPTR, A;
MOV DPL,#31h;
MOV A,#3h;
MOVX @DPTR,A;
MOV DPL,#12h;
MOV A,#4h;
MOVX @DPTR, A;
MOV DPL,#22h;
MOV A,#5h;
MOVX @DPTR, A;
MOV DPL,#32h;
MOV A,#6h;
MOVX @DPTR, A
MOV DPL,#13h;
MOV A, #7h;
MOVX @DPTR, A
MOV DPL,#23h;
MOV A,#8h;
MOVX @DPTR, A
MOV DPL,#32h;
MOV A, #9h;
MOVX @DPTR, A
MOV DPL,#34h;
MOV A, #0h;
MOVX @DPTR, A
MOV DPL,#41h;
MOV A,#10;
MOVX @DPTR, A
MOV DPL,#42h;
MOV A, #11;
MOVX @DPTR, A
MOV DPL,#43h;
MOV A,#12;
MOVX @DPTR,A
MOV DPL,#44h;
MOV A, #13;
MOVX @DPTR, A
MOV DPL,#34h;
MOV A,#14;
MOVX @DPTR, A
MOV DPL,#14h;
MOV A,#15;
MOVX @DPTR, A;
START1:
MOV P5, #01111111B
MOV R5, #4
PETLA1:
MOV A, P7
CPL A
JZ PETLA2
CPL A
XRL A, P5
CPL A
MOV DPL, A;
MOVX A, @DPTR;
CPL A;
MOV P1,A;
PETLA2:
MOV A, P5
RR A
MOV P5, A
DJNZ R5,PETLA1
JMP START1
NOP
NOP
NOP
JMP $
END START1
;NASZE NA ZAJECIACH 1
P5 EQU 0F8H
P7 EQU 0DBH
LJMP START
ORG 100H
START:
MOV P5, #01111111B
MOV R5, #4
PETLA1:
MOV A, P7
CPL A
JZ PETLA2
CPL A
XRL A, P5
CPL A
MOV P1, A
PETLA2:
MOV A, P5
RR A
MOV P5, A
DJNZ R5,PETLA1
JMP START
NOP
NOP
NOP
JMP $
END START
;KLAWIATURA 2
$NOMOD51
$NOLIST
#include<reg517.h>
$LIST
LJMP START
ORG 100h
START:
MOV R2,#4 ;licznik wierszy
MOV R1,#07Fh ;adres pierwszego wiersza
petla1:
MOV P5,R1 ; na P5 adres pierwszego wiersza
MOV A,P7 ;do akumulatora wartosc portu P7
XRL A,#0FFh ; exor sprawdzenie czy jakis klawisz wcisniety
JZ petla2 ;jesli nie wcisniety skacz do petli 2
MOV A,P7 ; przeniesienie do akumulatora wartosci portu P7
ANL A,R1 ;operacja and na akumulatorze i wartosci wiersza
MOV P1,A ;przeniesienie na diody akumulatora
petla2:
MOV A,R1 ;przeniesienie do akumulatora adresu wiersza
RR A ; przesuniecie bitowe
MOV R1,A ; przesylanie akumulatora do adresu wiersza
DJNZ R2,petla1 ;dekrementacja i jesli licznik wierszy jest rozny od 0 to skok
SJMP START ; powrot do poczatku
JMP $
END
;KLAWIATURA 1
$NOMOD51
$NOLIST
#include<reg517.h>
$LIST
LJMP START
ORG 100h
START:
MOV R2,#4 ;licznik wierszy
MOV R1,#07Fh ;adres pierwszego wiersza
petla1:
MOV P5,R1 ; na P5 adres pierwszego wiersza
MOV A,P7 ;do akumulatora wartosc portu P7
XRL A,#0FFh ; exor sprawdzenie czy jakis klawisz wcisniety
JZ petla2 ;jesli nie wcisniety skacz do petli 2
MOV A,P7 ; przeniesienie do akumulatora wartosci portu P7
ANL A,R1 ;operacja and na akumulatorze i wartosci wiersza
MOV P1,A ;przeniesienie na diody akumulatora
petla2:
MOV A,R1 ;przeniesienie do akumulatora adresu wiersza
RR A ; przesuniecie bitowe
MOV R1,A ; przesylanie akumulatora do adresu wiersza
DJNZ R2,petla1 ;dekrementacja i jesli licznik wierszy jest rozny od 0 to skok
SJMP START ; powrot do poczatku
JMP $
END
LAB2
LJMP START
ORG 100H
START:
; Diody na porcie P3
ORL P3, #00111100B
CLR P3.2
LCALL DELAY
CLR P3.3
LCALL DELAY
CLR P3.4
LCALL DELAY
CLR P3.5
LCALL DELAY
SETB P3.2
LCALL DELAY
SETB P3.3
LCALL DELAY
SETB P3.4
LCALL DELAY
SETB P3.5
LCALL DELAY
NOP
NOP
NOP
; -------------------
; brzeczyk
MOV R0, #255
PETLA_B:
CLR P3.2
MOV R1, #50
DELAY_B:
DJNZ R1, DELAY_B
SETB P3.2
DJNZ R0, PETLA_B
NOP
NOP
NOP
; -------------------
; brzeczyk 1000kHZ
P6 EQU 0FAH
ORL P6, #00010000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
LCALL DELAY
ANL P6, #11101111B ; P6.4 = 0
NOP
NOP
NOP
; -------------------
; Diody na porcie P1
MOV P1,#0xFF
LCALL DELAY
MOV R2, #255
PETLA_P1:
MOV A, P1
DEC A
MOV P1, A
LCALL DELAY
DJNZ R2, PETLA_P1
NOP
NOP
NOP
; -------------------
LJMP KONIEC
; opoznienie
DELAY:
MOV R0, #250
DELAY_1:
MOV R1, #255
DELAY_2:
DJNZ R1, DELAY_2
DJNZ R0, DELAY_1
RET
; ------------------
KONIEC:
END START
------------------------------------------------------------------------------------------------
LJMP START
ORG 100H
START:
MOV B, #10
PETLA:
MOV P1,#10101010B
MOV R1,#0AFH
TAMTAM: MOV R0, #0FFH
TUTU : DJNZ R0 , TUTU
DJNZ R1, TAMTAM
MOV P1,#01010101B
MOV R1,#0FFH
TAMTAM1: MOV R0, #0FFFFH
TUTU1 : DJNZ R0 , TUTU1
DJNZ R1, TAMTAM1
DJNZ B, PETLA
P6 EQU 0FAH
ORL P6, #00010000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #11101111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
ORL P6, #00010000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #11101111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORL P6, #00010000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #11101111B ; P6.4 = 0
LCALL DELAY
ORL P6, #00010000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #11101111B ; P6.4 = 0
LCALL DELAY
ORL P6, #00010000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #11101111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORL P6, #00010000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #11101111B ; P6.4 = 0
LCALL DELAY
ORL P6, #00010000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #11101111B ; P6.4 = 0
LCALL DELAY
ORL P6, #00010000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #11101111B ; P6.4 = 0
LCALL DELAY
ORL P6, #00010000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #11101111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
LCALL DELAY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORL P6, #00010000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #11101111B ; P6.4 = 0
LCALL DELAY
ORL P6, #00010000B ; P6.4 = 1
LCALL DELAY
ANL P6, #11101111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
ORL P6, #01000000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #10111111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
ORL P6, #01000000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #10111111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
ORL P6, #01000000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #10111111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
ORL P6, #01000000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #10111111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
ORL P6, #01000000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #10111111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
ORL P6, #01000000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #10111111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
ORL P6, #01000000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #10111111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
ORL P6, #01000000B ; P6.4 = 1
LCALL DELAY
LCALL DELAY
ANL P6, #10111111B ; P6.4 = 0
LCALL DELAY
LCALL DELAY
JMP START
NOP
NOP
NOP
LJMP KONIEC
DELAY:
MOV R0, #170
DELAY_1:
MOV R1, #255
DELAY_2:
DJNZ R1, DELAY_2
DJNZ R0, DELAY_1
RET
; ------------------
KONIEC:
END START