Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ljmp start
- P5 equ 0F8H
- P7 equ 0DBH
- LCDstatus equ 0FF2EH ; adres do odczytu gotowosci LCD
- LCDcontrol equ 0FF2CH ; adres do podania bajtu sterujacego LCD
- LCDdataWR equ 0FF2DH ; adres do podania kodu ASCII na LCD
- // bajty sterujace LCD, inne dostepne w opisie LCD na stronie WWW
- #define HOME 0x80 // put cursor to second line
- #define INITDISP 0x38 // LCD init (8-bit mode)
- #define HOM2 0xc0 // put cursor to second line
- #define LCDON 0x0e // LCD nn, cursor off, blinking off
- #define CLEAR 0x01 // LCD display clear
- // linie klawiatury - sterowanie na port P5
- #define LINE_1 0x7f // 0111 1111
- #define LINE_2 0xbf // 1011 1111
- #define LINE_3 0xdf // 1101 1111
- #define LINE_4 0xef // 1110 1111
- #define ALL_LINES 0x0f // 0000 1111
- ORG 000BH ; obsluga przerwania
- MOV TH0, #3CH ; przeladowanie
- MOV TL0, #0B0H ; stalej timera na 50ms
- DEC R0 ; korekta licznika
- RETI ; powrót z przerwania
- org 0100H
- // macro do wprowadzenia bajtu sterujacego na LCD
- LCDcntrlWR MACRO x ; x – parametr wywolania macra – bajt sterujacy
- LOCAL loop ; LOCAL oznacza ze etykieta loop moze sie powtórzyc w programie
- loop: MOV DPTR,#LCDstatus ; DPTR zaladowany adresem statusu
- MOVX A,@DPTR ; pobranie bajtu z biezacym statusem LCD
- JB ACC.7,loop ; testowanie najstarszego bitu akumulatora
- ; – wskazuje gotowosc LCD
- MOV DPTR,#LCDcontrol ; DPTR zaladowany adresem do podania bajtu sterujacego
- MOV A, x ; do akumulatora trafia argument wywolania macra–bajt sterujacy
- MOVX @DPTR,A ; bajt sterujacy podany do LCD – zadana akcja widoczna na LCD
- ENDM
- // macro do wypisania znaku ASCII na LCD, znak ASCII przed wywolaniem macra ma byc w A
- LCDcharWR MACRO
- LOCAL tutu ; LOCAL oznacza ze etykieta tutu moze sie powtórzyc w programie
- PUSH ACC ; odlozenie biezacej zawartosci akumulatora na stos
- tutu: MOV DPTR,#LCDstatus ; DPTR zaladowany adresem statusu
- MOVX A,@DPTR ; pobranie bajtu z biezacym statusem LCD
- JB ACC.7,tutu ; testowanie najstarszego bitu akumulatora
- ; – wskazuje gotowosc LCD
- MOV DPTR,#LCDdataWR ; DPTR zaladowany adresem do podania bajtu sterujacego
- POP ACC ; w akumulatorze ponownie kod ASCII znaku na LCD
- MOVX @DPTR,A ; kod ASCII podany do LCD – znak widoczny na LCD
- ENDM
- // macro do inicjalizacji wyswietlacza – bez parametrów
- init_LCD MACRO
- LCDcntrlWR #INITDISP ; wywolanie macra LCDcntrlWR – inicjalizacja LCD
- LCDcntrlWR #CLEAR ; wywolanie macra LCDcntrlWR – czyszczenie LCD
- LCDcntrlWR #LCDON ; wywolanie macra LCDcntrlWR – konfiguracja kursora
- ENDM
- // funkcja wypisania liczby dla potrzeb zegara
- putdigitLCD: mov b, #10
- div ab ; uzyskanie cyfry dziesiatek
- add a, #30H ; konwersja cyfry na kod ASCII
- acall putcharLCD
- mov a, b ; ladowanie cyfry jednosci
- add a, #30H ; konwersja na LCD
- acall putcharLCD
- ret
- // funkcaj wypisywania znaku na LCD
- putcharLCD: LCDcharWR
- ret
- // wyznaczanie biezacej wartosci zegara i jego wyswietlanie na LCD
- ZEGAR: INC R7 ; licznik sekund
- MOV A, R7 ; obsluga sekund
- CLR C
- SUBB A, #60 ; przepelnienie sekund
- JZ MINUTY
- LCDcntrlWR #HOME ; wyswietlenie calego zegara
- MOV A, R5 ; godziny
- ACALL putdigitLCD
- MOV A, #":" ; separator
- ACALL putcharLCD
- MOV A, R6 ; minuty
- ACALL putdigitLCD
- MOV A, #":" ; separator
- ACALL putcharLCD
- MOV A, R7 ; sekundy
- ACALL putdigitLCD
- JMP FINAL
- MINUTY: MOV R7, #00H ; zerowanie sekund
- INC R6 ; licznik minut
- MOV A, R6 ; obsluga minut
- CLR C
- SUBB A, #60 ; przepelnienie minut
- JZ GODZINY
- LCDcntrlWR #HOME ; wyswiwtlenie calego zegara
- MOV A, R5 ; godziny
- ACALL putdigitLCD
- MOV A, #":" ; separator
- ACALL putcharLCD
- MOV A, R6 ; minuty
- ACALL putdigitLCD
- MOV A, #":" ; separator
- ACALL putcharLCD
- MOV A, R7 ; sekundy
- ACALL putdigitLCD
- JMP FINAL
- GODZINY: MOV R6, #00H ; zerowanie minut
- INC R5 ; licznik godzin
- MOV A, R5
- CLR C
- SUBB A, #24 ; przepelenienie godzin - doba
- JNZ EKRAN
- MOV R5, #00H ; zerowanie godzin
- EKRAN: LCDcntrlWR #HOME ; wyswietlenie calego zegara
- MOV A, R5 ; godziny
- ACALL putdigitLCD
- MOV A, #":" ; separator
- ACALL putcharLCD
- MOV A, R6 ; minuty
- ACALL putdigitLCD
- MOV A, #":" ; separator
- ACALL putcharLCD
- MOV A, R7 ; sekundy
- ACALL putdigitLCD
- FINAL: RET
- // Przekodowanie kodow skaningowych cyfr z klawiatury
- // na odpowiednie wartosci liczbowe
- key_digits: mov dptr, #80EBH
- mov a, #0
- movx @dptr, a
- mov dptr, #8077H
- mov a, #1
- movx @dptr, a
- mov dptr, #807BH
- mov a, #2
- movx @dptr, a
- mov dptr, #807DH
- mov a, #3
- movx @dptr, a
- mov dptr, #80B7H
- mov a, #4
- movx @dptr, a
- mov dptr, #80BBH
- mov a, #5
- movx @dptr, a
- mov dptr, #80BDH
- mov a, #6
- movx @dptr, a
- mov dptr, #80D7H
- mov a, #7
- movx @dptr, a
- mov dptr, #80DBH
- mov a, #8
- movx @dptr, a
- mov dptr, #80DDH
- mov a, #9
- movx @dptr, a
- ret
- czy_zwolniony_klawisz MACRO
- LOCAL loop
- loop:
- mov a, #11111111B
- mov r3, a
- mov a, P7 ; przeniesienie zawartosci portu P7 do akumulatora
- clr c
- subb a, r3 ; jesli klawisz nie zostal odcisniety to wynik odejmowania bedzie
- ; rozny od zera co spowoduje ponowne zapetlenie petli
- jnz loop
- ENDM
- wczytaj_godziny:
- acall wczytanie_cyfry ; wczytujemy czesc dziesietna godziny
- ; wynik w akumulatorze a
- mov B, #10
- clr c
- mul ab ; wykonanie mnozenia
- mov R5, a
- acall wczytanie_cyfry ; wczytujemy czesc jednosci godziny
- ; wynik w akumulatorze a
- add a, R5 ; dodanie czesci jednosci
- mov R5, a
- acall ZEGAR ; wyswietlenie nowej godziny na wyswietlaczu
- ret
- wczytaj_minuty:
- acall wczytanie_cyfry ; wczytujemy czesc dziesietna minuty
- ; wynik w akumulatorze a
- mov B, #10
- clr c
- mul ab ; wykonanie mnozenia
- mov R5, a
- acall wczytanie_cyfry ; wczytujemy czesc jednosci minuty
- ; wynik w akumulatorze a
- add a, R5 ; dodanie czesci jednosci
- mov R5, a
- acall ZEGAR ; wyswietlenie nowych minut na wyswietlaczu
- ret
- wczytaj_sekundy:
- acall wczytanie_cyfry ; wczytujemy czesc dziesietna sekundy
- ; wynik w akumulatorze a
- mov B, #10
- clr c
- mul ab ; wykonanie mnozenia
- mov R5, a
- acall wczytanie_cyfry ; wczytujemy czesc jednosci sekund
- ; wynik w akumulatorze a
- add a, R5 ; dodanie czesci jednosci
- mov R5, a
- acall ZEGAR ; wyswietlenie noweych sekund na wyswietlaczu
- ret
- wczytanie_cyfry:
- one_key_1:
- mov r4, #LINE_1
- mov a, r4
- mov P5, a
- mov a, P7
- anl a, r4 ; w tym miejscu jest juz kod klawisza
- mov r2, a ; zapisanie kodu znaku w rejestrze r2
- clr c
- subb a, r4 ; sprawdzenie czy cos zostalo nacisniete
- jz one_key_2
- czy_zwolniony_klawisz ; wstawienie makra, sprawdzajacego czy klawisz
- ; zostal juz zwolniony
- mov a, r2
- mov dph, #80h
- mov dpl, a
- movx a,@dptr ; w akumulatorze jest wartosc odpowieniego przycisku
- sjmp koniec ; konczymy wczytywanie
- one_key_2: mov r4, #LINE_2
- mov a, r4
- mov P5, a
- mov a, P7
- anl a, r4
- mov r2, a
- clr c
- subb a, r4
- jz one_key_3
- czy_zwolniony_klawisz ; wstawienie makra, sprawdzajacego czy klawisz
- ; zostal juz zwolniony
- mov a, r2
- mov dph, #80h
- mov dpl, a
- movx a,@dptr ; w akumulatorze jest wartosc odpowieniego przycisku
- sjmp koniec ; konczymy wczytywanie
- one_key_3: mov r4, #LINE_3
- mov a, r4
- mov P5, a
- mov a, P7
- anl a, r4
- mov r2, a
- clr c
- subb a, r4
- jz one_key_1
- czy_zwolniony_klawisz ; wstawienie makra, sprawdzajacego czy klawisz
- ; zostal juz zwolniony
- mov a, r2
- mov dph, #80h
- mov dpl, a
- movx a,@dptr ; w akumulatorze jest wartosc odpowieniego przycisku
- sjmp koniec ; konczymy wczytywanie
- koniec:
- ret
- ;-------------------------------------------------------------------------------------------------
- ; program glówny
- START: init_LCD
- MOV TMOD, #01H ; konfiguracja timera
- MOV TH0, #3CH ; ladowanie
- MOV TL0, #0B0H ; stalej timera na 50ms
- MOV R5, #00H ; inicjacja zegara
- MOV R6, #00H
- MOV R7, #0FFH
- MOV IE, #82H ; przerwania wlacz
- acall key_digits
- wczytywanie:
- key_1:
- mov r4, #LINE_1
- mov a, r4
- mov P5, a
- mov a, P7
- anl a, r4
- mov r2, a
- clr c
- subb a, r4
- jz key_2
- ; jesli nacisnieto jakis przycisk, sprawdzane jest
- ; czy nie byl to klawisz A - ustawianie godziny
- mov a, r2
- cjne a, #01111110B, key_1 ; jesli nacisnieto znak ('A') to wczytujemy godziny
- acall wczytaj_godziny
- key_2:
- mov r4, #LINE_2
- mov a, r4
- mov P5, a
- mov a, P7
- anl a, r4
- mov r2, a
- clr c
- subb a, r4
- jz key_3
- ; jesli nacisnieto jakis przycisk, sprawdzane jest
- ; czy nie byl to klawisz B - ustawianie minut
- mov a, r2
- cjne a, #10111110B, key_2 ; jesli nacisnieto znak ('B') to wczytujemy minuty
- acall wczytaj_minuty
- key_3:
- mov r4, #LINE_3
- mov a, r4
- mov P5, a
- mov a, P7
- anl a, r4
- mov r2, a
- clr c
- subb a, r4
- jz key_4
- ; jesli nacisnieto jakis przycisk, sprawdzane jest
- ; czy nie byl to klawisz C - ustawianie sekund
- mov a, r2
- cjne a, #11011110B, key_3 ; jesli nacisnieto znak ('C') to wczytujemy sekundy
- acall wczytaj_sekundy
- key_4:
- mov r4, #LINE_4
- mov a, r4
- mov P5, a
- mov a, P7
- anl a, r4
- mov r2, a
- clr c
- subb a, r4
- jz key_1
- ; jesli podano jakis przycisk to:
- mov a, r2
- cjne a, #11100111B, key_4 ; jesli nacisnieto znak ('*') to zaczynamy wyswietlac
- sjmp wyswietl ; jesli nie nacisnieto ('*') to czytamy 4-ta linie
- wyswietl:
- ; JESLI ROZPOCZETO/WZNOWIONO TIMER TO WYKONUJEMY POTRZEBNE OPERACJE
- SETB TR0 ; timer start
- ACALL ZEGAR ; wyswietlenie zainicjowanego zegara
- MOV A, #0FH
- MOV P1, A ; zapalenie diód
- MOV R0, #20 ; licznik odmierzen 20 x 50ms
- CZEKAM: MOV A, R0 ; czekam, a timer
- JNZ CZEKAM ; mierzy laczny czas 1s
- MOV R0, #20 ; po zgloszeniu przerwania - ust. na nowo licznik na 20 x 50ms
- ACALL ZEGAR ; utuchomeinie procedury oblugi i wyswietlenia zegara
- MOV A, P1 ; zmiana
- CPL A ; swiecenia
- MOV P1, A ; diód
- ; SPRAWDZENIE CZY ZATRZYMAC ODLCZANIE TIMERA
- mov r4, #LINE_4
- mov a, r4
- mov P5, a
- mov a, P7
- anl a, r4
- mov r2, a
- clr c
- subb a, r4
- jz odliczaj_dalej ; jesli nie jest wcisniety zaden przycisk w 4 wierszu to
- ; timer nie zatrzymuje sie i odlicza dalej
- ; jesli wciscnieto jakis przycisk:
- mov a, r2
- cjne a, #11101101B, odliczaj_dalej ; jesli nacisnieto znak ('#') to stop odliczania
- sjmp stop ; jesli nie nacisnieto ('#') to odliczamy dalej
- stop:
- CLR TR0 ; stop timer
- jmp wczytywanie ; czytamy ponownie znaki w celu ewentualnego startu timera
- ; lub ustawienia nowego czasu
- odliczaj_dalej:
- JMP CZEKAM ; czekam na kolejna sekunde
- ;-------------------------------------------------------------------------------------------------
- NOP
- NOP
- NOP
- JMP $
- END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement