Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define F_CPU 4000000UL
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <util/delay.h>
- volatile uint8_t y=0;
- volatile uint8_t x;
- void inicjalizacjaTIMERA() //procedura inicjalizacji timera1
- {
- cli();
- TCCR1B |= (1<<WGM12); // timer w trybie CTC
- OCR1A |= 4000; // wartość porządana
- TCCR1B |= ((1 << CS11) | (1<<CS10)); // preskaler timera
- TIMSK |= (1<<OCIE1A); // zezwolenie na przerwania timera
- sei();
- }
- int main(void)
- {
- cli(); //wyłączenie przerwań globalnych
- DDRB = 0x0F; //ustawienie bitów portu A od 0-3 na wyjście
- PORTB = 0xFF; //podciągnięcia na kolumnach i rzędy w stanie 1
- DDRA = 0xFF; //port C wyjściowy, podłączony do diod
- PORTA |= (1<<4); //pin 4 podłączony do diody sygnalizującej brak wciśnięcia klawisza
- inicjalizacjaTIMERA(); //inicjalizacja timera
- sei(); //włączenie przerwań globalnych
- while(1)
- {
- }
- }
- ISR(TIMER1_COMPA_vect)
- {
- if(y==4) y=0; //jeśli licznik przekroczył 3 jest wyzerowany
- x=PORTB; //do x pobierana wartość portu B
- x=(x | 0x0F ) ^ (1<<y); //wybierany aktywny wiersz bez zmainy innych pinów
- PORTB = x; //wartość x wpisana do portu B
- asm volatile ("nop"); //synchronizacja
- x=PINB; //wartość pinów portu B wpisana do x
- if((x & 0xF0)!=0xF0) //Sprawdzenie czy akiś klawisz był wciśnięty
- { //Jeśli tak, to z której kolumny
- if((x & 0x10)==0) x=0; //0
- else if((x & 0x20)==0) x=1; //1
- else if((x & 0x30)==0) x=2; //2
- else x=3; //3
- x=x+y*4; //nr wciśniętego przycisku
- PORTA = x; //Na diodach wyświetli się nr wciśniętego przycisku
- }
- y++; //inkrementacja licznika/kolumny
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement