Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; -------------------------------------------------------------------------------------------
- ; Szymon Witamborski
- ; Program wyswietla 000009 na wyswietlaczu segmentowym
- ; -------------------------------------------------------------------------------------------
- ; Stale, dla obslugi wysietlacza
- ; ------------------------------
- DZIEWIEC EQU 01101111B ; wyswietli 9
- ZERO EQU 00111111B ; wyswietli 0
- ; Stale, dla Timera
- ; -----------------
- T0_G EQU 0 ; GATE: do startu potrzeba tylko TR0=1
- T0_C EQU 0 ; C/T: liczymy z zegara
- T0_M EQU 1 ; MODE: tryb 16-bitowy
- TMOD_SET EQU T0_M+T0_C*4+T0_G*8 ; Wszystkie parametry dla Timera 0
- T0_VAR EQU 65536-922 ; ok. 1ms
- TH0_SET EQU T0_VAR/256 ; starsze bity dla TH0
- TL0_SET EQU T0_VAR%256 ; mlodsze bity dla TL0
- LICZNIK EQU 40
- LICZ5 EQU 41
- DANE EQU 42
- CYFRY EQU 48
- LICZ200 EQU 59
- SEKUNDY EQU 60
- MINUTY EQU 61
- GODZINY EQU 62
- STOS EQU 63
- BYLO5 EQU 0
- BYLO1 EQU 1
- BYLO200 EQU 2
- BYLAMINUTA EQU 3
- BYLAGODZINA EQU 4
- ; Koniec danych
- ; -------------
- ; Skok do poczatku programu
- ; -------------------------
- LJMP START
- ; Przerwanie Timera 0
- ; -------------------
- ORG 0BH
- ORL TL0,#TL0_SET ; mlodsze bity
- MOV TH0,#TH0_SET ; starsze bity
- SETB BYLO1
- RETI
- ; Reszta programow
- ; ----------------
- ORG 100H
- ; ###################################################################################
- ; ################ S T A R T P R O G R A M U ###################
- ; ###################################################################################
- START:
- ; Ustawienie Timera 0
- ; -------------------
- MOV TMOD,#TMOD_SET ; TMOD
- MOV TH0,#TH0_SET ; starsze bity
- MOV TL0,#TL0_SET ; mlodsze bity
- MOV LICZNIK,#0
- CLR BYLO5
- CLR BYLO1
- MOV LICZ5,#0
- MOV LICZ200,#0
- MOV SEKUNDY,#0
- MOV MINUTY,#0
- MOV GODZINY,#0
- MOV CYFRY, #00111111B ; zero
- MOV CYFRY+1,#00000110B ; jeden
- MOV CYFRY+2,#01011011B ; dwa
- MOV CYFRY+3,#01001111B ; trzy
- MOV CYFRY+4,#01100110B ; cztery
- MOV CYFRY+5,#01101101B ; piec
- MOV CYFRY+6,#01111101B ; szesc
- MOV CYFRY+7,#00000111B ; siedem
- MOV CYFRY+8,#01111111B ; osiem
- MOV CYFRY+9,#01101111B ; dziewiec
- MOV DANE,CYFRY
- MOV DANE+1,CYFRY
- MOV DANE+2,CYFRY
- MOV DANE+3,CYFRY
- MOV DANE+4,CYFRY
- MOV DANE+5,CYFRY
- ; Ustawienie przerwan
- ; -------------------
- SETB ET0 ; Przerwanie Timera 0
- SETB EA ; Przerwania w ogole
- SETB TR0 ; start Timera 0
- PETLA:
- ; Zdarzenie 1ms
- ; -------------
- JNB BYLO1,PTL10
- CLR BYLO1
- LCALL WYSWIETL
- ; Wywoluje zdarzenie 5ms
- ; ----------------------
- INC LICZ5
- MOV A,LICZ5
- CJNE A,#5,PTL10
- SETB BYLO5
- MOV LICZ5,#0
- PTL10:
- ; Zdarzenie 5ms
- ; -------------
- JNB BYLO5,PTL15
- CLR BYLO5
- INC LICZ200
- ; Wywoluje zdarzenie 5*200ms
- ; --------------------------
- MOV A,LICZ200
- CJNE A,#50,PTL15
- MOV LICZ200,#0
- SETB BYLO200
- PTL15:
- ; Zdarzenie 5*200ms
- ; -----------------
- JNB BYLO200,PTL100
- CLR BYLO200
- CPL P1.7
- INC SEKUNDY
- MOV A,SEKUNDY
- CJNE A,#60,PTL20
- ; Wywoluje zdarzenie minuty
- ; -------------------------
- SETB BYLAMINUTA
- MOV SEKUNDY,#0
- PTL20:
- MOV R2,SEKUNDY
- MOV R1,#0
- LCALL ZMIEN_CYFRE
- PTL100:
- LJMP PETLA
- ; Procedury
- ; ---------
- ; Zmiana cyfry
- ; Potrzebuje:
- ; R2: liczba
- ; R1: offset segmentu wyswietlacza
- ; --------------------------------
- ZMIEN_CYFRE:
- MOV A,R1 ; skopiuj offset segmentu wyswietlacza
- ADD A,#DANE ; dodaj adres danych wyswietlacza, A = &DANE + offset
- MOV R1,A ; W R1 siedzi teraz adres danej dla segmentu
- MOV A,R2 ; pobieramy cyfre
- DA A ; zmieniamy na BCD, w 4 mlodszych bitach sa jednosci
- ; w 4 starszych dziesiatki
- ANL A,#00001111B ; wyciagamy jednosci
- ADD A,#CYFRY ; dodajemy adres tablicy cyfry, wiec A teraz wskazuje na kod
- ; odpowiedniej cyfry
- MOV R0,A ; potrzebne do adresowania posredniego, do R0 kopiujemy wart. A
- MOV A,@R0 ; zeby potem do A trafilo to co jest pod adresem (kod danej cyfry)
- MOV @R1,A ; kopiujemy wartosc z A (kod cyfry) do tego co pod adresem w R1
- ; (adres danej segmentu)
- ; Dziesiatki
- ; ----------
- INC R1 ; zwiekszamy adres w R1, czyli adres nast. segmentu
- MOV A,R2 ; pobieramy znowu cyfre
- DA A ; -> BCD
- SWAP A ; zamiana 4 bitow starszych z mlodszymi, teraz w 4 mlodszych
- ; sa dziesiatki
- ANL A,#00001111B ; wyciagamy dziesiatki
- ADD A,#CYFRY ; j/w
- MOV R0,A
- MOV A,@R0
- MOV @R1,A
- RET
- WYSWIETL:
- SETB P1.6 ; zgaszenie wyswietlacza
- MOV DPTR,#SEGMENTY
- MOV A,LICZNIK
- MOVC A,@A+DPTR
- MOV DPTR,#0FF30H
- MOVX @DPTR,A
- MOV A,#DANE
- ADD A,LICZNIK
- MOV R0,A
- MOV A,@R0
- MOV DPTR,#0FF38H
- MOVX @DPTR,A
- INC LICZNIK
- MOV A,LICZNIK
- CJNE A,#6,WYS_KONIEC
- MOV LICZNIK,#0
- WYS_KONIEC:
- CLR P1.6 ; wlaczenie wyswietlacza
- RET
- ; Wskazniki do wyboru wyswietlacza
- ; --------------------------------
- SEGMENTY:
- DB 00000001B
- DB 00000010B
- DB 00000100B
- DB 00001000B
- DB 00010000B
- DB 00100000B
- DB 01000000B
- DB 10000000B
Add Comment
Please, Sign In to add comment