Advertisement
Guest User

Untitled

a guest
Dec 6th, 2018
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define F_CPU 4000000UL
  2. #include <avr/io.h>
  3. #include <avr/interrupt.h>
  4. #include <util/delay.h>
  5.  
  6. volatile uint8_t y=0;
  7. volatile uint8_t x;
  8.  
  9. void inicjalizacjaTIMERA() //procedura inicjalizacji timera1
  10. {
  11.     cli();
  12.     TCCR1B |= (1<<WGM12);  // timer w trybie CTC
  13.     OCR1A |= 4000; // wartość porządana
  14.     TCCR1B |= ((1 << CS11) | (1<<CS10));  // preskaler timera
  15.     TIMSK |= (1<<OCIE1A); // zezwolenie na przerwania timera
  16.     sei();
  17. }
  18.  
  19. int main(void)
  20. {
  21.     cli(); //wyłączenie przerwań globalnych
  22.     DDRB = 0x0F; //ustawienie bitów portu A od 0-3 na wyjście
  23.     PORTB = 0xFF; //podciągnięcia na kolumnach i rzędy w stanie 1
  24.     DDRA = 0xFF;  //port C wyjściowy, podłączony do diod
  25.     PORTA |= (1<<4); //pin 4 podłączony do diody sygnalizującej brak wciśnięcia klawisza
  26.     inicjalizacjaTIMERA(); //inicjalizacja timera
  27.     sei(); //włączenie przerwań globalnych
  28.  
  29.     while(1)
  30.     {
  31.    
  32.     }
  33. }
  34.  
  35. ISR(TIMER1_COMPA_vect)
  36. {
  37.         if(y==4) y=0; //jeśli licznik przekroczył 3 jest wyzerowany
  38.         x=PORTB;      //do x pobierana wartość portu B
  39.         x=(x | 0x0F ) ^ (1<<y); //wybierany aktywny wiersz bez zmainy innych pinów
  40.         PORTB = x;              //wartość x wpisana do portu B
  41.         asm volatile ("nop"); //synchronizacja
  42.         x=PINB;                 //wartość pinów portu B wpisana do x
  43.         if((x & 0xF0)!=0xF0)    //Sprawdzenie czy akiś klawisz był wciśnięty
  44.         {                       //Jeśli tak, to z której kolumny
  45.         if((x & 0x10)==0) x=0;    //0
  46.         else if((x & 0x20)==0) x=1; //1
  47.         else if((x & 0x30)==0) x=2; //2
  48.         else x=3;                   //3
  49.         x=x+y*4; //nr wciśniętego przycisku
  50.         PORTA = x; //Na diodach wyświetli się nr wciśniętego przycisku
  51.         }
  52.         y++; //inkrementacja licznika/kolumny
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement