;************************** KLAWIATURA 4x4 ************************* ;****** UPEWNIJ SIE CZY ZOLTA ZWORKA ZOSTALA ZDJETA? *************** .include "m32def.inc" ; dolaczenie pliku z definicjami rejestrow ;******** PONIZEJ BEDZIE ZNAJDOWAC SIE CZESC KONFIGURACYJNA ******** ;********************** LISTA PODLACZEN ************************** ; PA0 = W1 ; PA1 = W2 ; PA2 = W3 ; PA3 = W4 ; ******** ; PA4 = K1 ; PA5 = K2 ; PA6 = K3 ; PA7 = K4 ; ******** diody do sygnalizacji numeru wcisnietego switcha ; PD3 = D3 ; PD4 = D4 ; PD5 = D5 ; PD6 = D6 ; PD7 = D7 ; ******** .cseg jmp Start ; ******** miejsce na ISRy przerwan ******** nop nop nop ; ******** AKTYWACJA STOSU ******** Start: ; etykieta programu glownego ldi R17, high(RAMEND) ; l‚aduj rejestr roboczy MSB adresu kon„ca pamie™ci SRAM out SPH, R17 ; inicjalizuj MSB wskaznika stosu ldi R17, low(RAMEND) ; l‚aduj rejestr roboczy LSB adresu kon„ca pamie™ci SRAM out SPL, R17 ; inicjalizuj LSB wskaznnika stosu ; ******** uruchomienie przerwan ISR ******** ; konfiguracja przerwania na grzybek bezpieczenstwa ; ******** PETLA GLOWNA ******** ; ******** TESTOWANIE W KTOREJ KOLUMNIE WCISNIETO SWITCH ******** WIERSZ: ldi R16, 0x0f ; zapisanie w rejestrze 16 wartosci FF out DDRA, R16 ; l‚adowanie do rejestru kierunku portu A wartos›ci z rejestru r16 dla okreslenia kierunku portu A nop nop ldi R17, 0xf0 ; out PORTA, R17 ; nadawanie z pull-up nop ; czas na wcisniecie switcha nop ; czas na wcisniecie switcha nop ; czas na wcisniecie switcha in R18, PINA ; kopiowanie stanu portu a do badania czy ktorys switch w wierszu nie zostal wcisniety nop ; sprawdzenie w oknie Procesor czy skopiowal do r18 nop ; sprawdzenie w oknie Procesor czy skopiowal ; ******** TESTOWANIE BITOW W REJESTRZE ZE SKOKIEM NAD 1 INSTRUKCJA ******** sbrs R18, PA4 ; jesli nie ma wcisnietego to przeskocz nad call do kolejnego testu kolejnego bitu (PB4 to maska bitu nr 4) call ktory_wiersz1 ; jesli wcisnieto, to przejdz do kolejnego etapu testowania z wykrywaniem ktory to switch sbrs R18, PA5 call ktory_wiersz2 sbrs R18, PA6 call ktory_wiersz3 sbrs R18, PA7 call ktory_wiersz4 jmp Start ; powrot do programu glownego z przywroceniem pierwotnej konfiguracji portow I/O ; ******** PONIZEJ PROCEDURY KTORY SWITCH W WIERSZU ZOSTAL WCISNIETY ******** ktory_wiersz1: ldi R16, 0xf0 ; out DDRA, R16 ; nop nop ldi R17, 0x0f ; out PORTA, R17 ;pull-up nop ; czas na wcisniecie switcha nop ; czas na wcisniecie switcha nop ; czas na wcisniecie switcha in R18, PINA ; opiowanie stanu portu a do badania czy ktorys switch w wierszu nie zostal wcisniety nop ; sprawdzenie w oknie Procesor czy skopiowal nop ; sprawdzenie w oknie Procesor czy skopiowal ; ******** TESTOWANIE BITOW W REJESTRZE ZE SKOKIEM NAD 1 INSTRUKCJA ******** sbrs R18, PA0 call przycisk_s1 sbrs R18, PA1 call przycisk_s5 sbrs R18, PA2 call przycisk_s9 sbrs R18, PA3 call przycisk_s13 ret ; powrot z wywol‚ania podprogramu ; ******* ktory_wiersz2: ldi R16, 0xf0 ; out DDRA, R16 ; nop nop ldi R17, 0x0f ; out PORTA, R17 ;pull-up nop ; czas na wcisniecie switcha nop ; czas na wcisniecie switcha nop ; czas na wcisniecie switcha in R18, PINA ;opiowanie stanu portu a do badania czy ktorys switch w wierszu nie zostal wcisniety nop sbrs R18, PA0 call przycisk_s2 sbrs R18, PA1 call przycisk_s6 sbrs R18, PA2 call przycisk_s10 sbrs R18, PA3 call przycisk_s14 ret ; ******* ktory_wiersz3: ldi R16, 0xf0 ; out DDRA, R16 ; nop nop ldi R17, 0x0f ; out PORTA, R17 ;pull-up nop ; czas na wcisniecie switcha nop ; czas na wcisniecie switcha nop ; czas na wcisniecie switcha in R18, PINA ;kopiowanie stanu portu a do badania czy ktorys switch w wierszu nie zostal wcisniety nop sbrs R18, PA0 call przycisk_s3 sbrs R18, PA1 call przycisk_s7 sbrs R18, PA2 call przycisk_s11 sbrs R18, PA3 call przycisk_s15 ret ; ******* ktory_wiersz4: ldi R16, 0xf0 ; out DDRA, R16 ; nop nop ldi R17, 0x0f ; out PORTA, R17 ;pull-up nop ; czas na wcisniecie switcha nop ; czas na wcisniecie switcha nop ; czas na wcisniecie switcha in R18, PINA ;kopiowanie stanu portu a do badania czy ktorys switch w wierszu nie zostal wcisniety nop sbrs R18, PA0 call przycisk_s4 sbrs R18, PA1 call przycisk_s8 sbrs R18, PA2 call przycisk_s12 sbrs R18, PA3 call przycisk_s16 ret ; ******* PRZYPISANIE FUNKCJI WYKONAWCZEJ POD KAZDY ZE SWITCHOW ******* ; ************************************************* ; ******* ZESTAW SWITCHOW W PIERWSZEJ KOLUMNIE ******** ; ************************************************* przycisk_s1: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 ; kierunek portu D do wyswietlania na diodach nr przyciskow sbi PORTD, PD7 ; *******skasuj po przetestowaniu programu****** nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* przycisk_s5: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD7 sbi PORTD, PD5 ; *******skasuj po przetestowaniu programu****** nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* przycisk_s9: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD7 sbi PORTD, PD4 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* przycisk_s13: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD7 sbi PORTD, PD5 sbi PORTD, PD4 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* ZESTAW SWITCHOW W DRUGIEJ KOLUMNIE ******** ; ************************************************* przycisk_s2: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD6 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* przycisk_s6: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD6 sbi PORTD, PD5 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* przycisk_s10: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD6 sbi PORTD, PD4 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* przycisk_s14: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD6 sbi PORTD, PD5 sbi PORTD, PD4 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* ZESTAW SWITCHOW W TRZECIEJ KOLUMNIE ******** ; ************************************************* przycisk_s3: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD7 sbi PORTD, PD6 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* przycisk_s7: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD7 sbi PORTD, PD6 sbi PORTD, PD5 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* przycisk_s11: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD7 sbi PORTD, PD6 sbi PORTD, PD4 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* przycisk_s15: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD7 sbi PORTD, PD6 sbi PORTD, PD5 sbi PORTD, PD4 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* ZESTAW SWITCHOW W CZWARTEJ KOLUMNIE ******** ; ************************************************* przycisk_s4: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD5 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* przycisk_s8: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD4 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* przycisk_s12: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD5 sbi PORTD, PD4 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; ******* przycisk_s16: ; zastap ponizszy fragment uruchamiania DIOD wlasciwa procedura ldi R19, 0b1111_1000 ; zapisanie w rejestrze roboczym pinow sterujacych diodami D5:D9 out DDRD, R19 sbi PORTD, PD3 nop nop nop call Opoznienie nop call End ; nie usuwaj, zapewni to bezpieczna prace napedow nop ret ; *** PROCEDURA PODTRZYMUJACA URUCHOMIONE URZADZENIA (DIODY) *** Opoznienie: ldi R20, 180 LoopC: ldi R21, 80 LoopC0: ldi R22, 10 LoopC1: dec R22 brne LoopC1 dec R21 brne LoopC0 dec R20 brne LoopC ret ; *** OBOWIAZKOWA PROCEDURA CZYSZCZACA PORTY Z AKTYWNYCH PINOW (OCHRONA NAPEDOW) *** End: clr R23 out DDRA, R23 out PORTA, R23 out DDRB, R23 out PORTB, R23 out DDRC, R23 out PORTC, R23 out DDRD, R23 out PORTD, R23 ser R18 ; super wazne ustawienie zeby nie testowac 0 nop ret ; KONIEC PROGRAMU