Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/io.h> //Biblioteka zawieraj¹ca funkcje steruj¹ce portami
- #include <avr/interrupt.h> //Biblioteka do obs³ugi przerwañ
- ISR(TIMER0_OVF_vect) //Pocz¹tek procedury przerwania
- {
- TCNT0 = 55; //Ustawienie wartoœci pocz¹tkowej timera na 55
- PORTA ^= _BV(0); //Negacja najm³odszego bitu portu A
- }
- int main()
- {
- DDRA = 0xFF; //Ustawienie linii portu A jako wyjœcie
- TIMSK |= (1 << TOIE0); //Ustawienie przerwania (wykona siê gdy licznik bêdzie przepe³niony)
- sei(); //Globalne zezwolenie na przerwanie
- TCCR0 |= (1 << CS00) | (1 << CS02); //Start timera (tryb normalny preskaler 1024)
- while(1) //Pêtla nieskoñczona
- {
- }
- }
- ===================================================================================================
- ===================================================================================================
- #include <avr/io.h> //Biblioteka zawieraj¹ca funkcje steruj¹ce portami
- #include <avr/interrupt.h> //Biblioteka do obs³ugi przerwañ
- volatile char a; //Inicjalizacja zmiennej swobodnej (dostêpnej w ca³ym programie)
- ISR(TIMER0_OVF_vect) //Pocz¹tek procedury przerwania
- {
- a = 1; //Ustawienie wartoœci zmiennej a na 1
- TCNT0 = 55; //Ustawienie wartoœci pocz¹tkowej timera na 55
- }
- int main()
- {
- DDRA = 0xFF; //Ustawienie linii portu A jako wyjœcie
- TIMSK |= (1 << TOIE0); //Ustawienie przerwania (wykona siê gdy licznik bêdzie przepe³niony)
- sei(); //Globalne zezwolenie na przerwanie
- TCCR0 |= (1 << CS00) | (1 << CS02); //Start timera (tryb normalny preskaler 1024)
- while(1) //Pêtla nieskoñczona
- {
- if(a == 1) //Instrukcja wykona siê jeœli zmienna a ma wartoœæ 1 (czyli wyst¹pi³o przerwanie)
- {
- PORTA ^= _BV(0); //Negacja najm³odszego bitu portu A
- a = 0; //Ustawienie wartoœci zmiennej a na 0
- }
- }
- }
- ===================================================================================================
- ===================================================================================================
- #include <avr/io.h> //Biblioteka zawieraj¹ca funkcje steruj¹ce portami
- #include <util/delay.h> //Biblioteka zawieraj¹ca funkcjê opóŸniaj¹c¹
- #include <avr/interrupt.h> //Biblioteka do obs³ugi przerwañ
- char button() //Pocz¹tek procedury do obs³ugi klawiatury
- {
- PORTA = 0xFF;
- char key, row, pressed = 0;
- unsigned char button = 0;
- for(row = 4; row <= 7; row++)
- {
- DDRA = _BV(row);
- PORTA = ~_BV(row);
- key = PINA;
- _delay_ms(15);
- if(key != PINA)
- {
- key = PINA;
- }
- key &= 0x0F;
- if(key != 0x0F)
- {
- if(pressed == 0)
- {
- button = (key | (PORTA & 0xF0));
- pressed++;
- }
- else
- {
- return 0xFF;
- }
- }
- }
- if(pressed == 0)
- {
- return 0;
- }
- else
- {
- switch(button)
- {
- case 0b11101110: return 1;
- case 0b11011110: return 2;
- case 0b10111110: return 3;
- case 0b01111110: return 4;
- case 0b11101101: return 5;
- case 0b11011101: return 6;
- case 0b10111101: return 7;
- case 0b01111101: return 8;
- case 0b11101011: return 9;
- case 0b11011011: return 10;
- case 0b10111011: return 11;
- case 0b01111011: return 12;
- case 0b11100111: return 13;
- case 0b11010111: return 14;
- case 0b10110111: return 15;
- case 0b01110111: return 16;
- default: return 0xFF;
- }
- }
- }
- ISR(INT0_vect) //Pocz¹tek procedury przerwania
- {
- cli(); //Wy³¹czenie systemu przerwañ
- GICR &= _BV(INT0); //Ustawienie bitu INT0 w rejestrze GICR na 0
- PORTB = button(); //Zamiana stanu diod na taki jaki zwróci procedura odczytuj¹ca, który przycisk na klawiaturze jest wciœniêty
- DDRA = 0xF0; //Ustawienie 4 starszych linii portu A jako wyjœcie (wybór kolumny) i m³odszych jako wejœcie (wybór wiersza)
- PORTA = 0x0F;
- GIFR &= _BV(INTF0); //Ustawienie flagi INTF0 w rejestrze GIFR na 0
- GICR |= _BV(INT0); //W³¹czenie przerwania INT0
- sei(); //Globalne zezwolenie na przerwanie
- }
- int main()
- {
- unsigned char tmp = MCUCR;
- DDRB = 0xFF; //Ustawienie linii portu B jako wyjœcie
- DDRD = 0; //Ustawienie linii portu D jako wejœcie
- PORTD |= _BV(2); //Ustawienie 2 bitu portu D na 1
- DDRA = 0xF0; //Ustawienie 4 starszych linii portu A jako wyjœcie (wybór kolumny) i m³odszych jako wejœcie (wybór wiersza)
- PORTA = 0x0F;
- tmp |= _BV(ISC01);
- tmp &= ~_BV(ISC00);
- MCUCR = tmp; //Ustawienie bitu ISC01 na 1 oraz bitu ISC00 na 0 w rejestrze MCUCR (reakcja INT0 na zbocze opadaj¹ce)
- GICR|= _BV(INT0); //W³¹czenie przerwania INT0
- sei(); //Globalne zezwolenie na przerwanie
- while(1)
- {
- _delay_ms(5); //OpóŸnienie o 5 milisekund
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement