Advertisement
Guest User

Untitled

a guest
Dec 12th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.95 KB | None | 0 0
  1. #define F_CPU 4000000UL
  2. #include <avr/io.h>
  3. #include <avr/interrupt.h>
  4. #include <util/delay.h>
  5. #include <avr/pgmspace.h>
  6.  
  7. volatile int wysw=0;
  8. unsigned char TABZN[16] PROGMEM = {63,6,91,79,102,109,125,7,127,111,119,124,57,94,121,113};
  9. unsigned char TAB[4];
  10. volatile uint8_t y=0;
  11. volatile uint8_t x;
  12.  
  13. void inicjalizacjaTIMERA() //procedura inicjalizacji timera1
  14. {
  15.     cli();
  16.     TCCR1B |= (1<<WGM12);  // timer w trybie CTC
  17.     OCR1A |= 4000; // wartość porządana
  18.     TCCR1B |= ((1 << CS11) | (1<<CS10));  // preskaler timera
  19.     TIMSK |= (1<<OCIE1A); // zezwolenie na przerwania timera
  20.     sei();
  21. }
  22.  
  23. int main(void)
  24. {
  25.     cli(); //wyłączenie przerwań globalnych
  26.     DDRB = 255; //podłącony do wyświetlacza
  27.     DDRA = 0x0F; //ustawienie bitów portu A od 0-3 na wyjście
  28.                  //port A podłączony do klawiatury jak i do kolumn wyświetlacza
  29.     PORTA = 0xFF; //podciągnięcia na kolumnach i rzędy w stanie 1
  30.     inicjalizacjaTIMERA(); //inicjalizacja timera
  31.     sei(); //włączenie przerwań globalnych
  32.  
  33.     while(1)
  34.     {
  35.    
  36.     }
  37. }
  38.  
  39. ISR(TIMER1_COMPA_vect)
  40. {
  41.         PORTA = 0xFF;
  42.         PORTB =  ~pgm_read_byte(&(TABZN[TAB[wysw]]));  
  43.         PORTA = ~_BV(wysw);
  44.         wysw++;
  45.         if(wysw==4) {wysw=0;}
  46.  
  47.         if(y==4) y=0; //jeśli licznik przekroczył 3 jest wyzerowany
  48.         x=PORTA;      //do x pobierana wartość portu A
  49.         x=(x | 0x0F ) ^ (1<<y); //wybierany aktywny wiersz bez zmainy innych pinów
  50.         PORTA = x;              //wartość x wpisana do portu A
  51.         asm volatile ("nop"); //synchronizacja
  52.         x=PINA;                 //wartość pinów portu A wpisana do x
  53.         if((x & 0xF0)!=0xF0)    //Sprawdzenie czy jakiś klawisz był wciśnięty
  54.         {                       //Jeśli tak, to z której kolumny
  55.         if((x & 0x10)==0) x=0;    //0
  56.         else if((x & 0x20)==0) x=1; //1
  57.         else if((x & 0x30)==0) x=2; //2
  58.         else x=3;                   //3
  59.         x=x+y*4; //nr wciśniętego przycisku
  60.         TAB[3] = TAB[2];
  61.         TAB[2] = TAB[1];
  62.         TAB[1] = TAB[0];
  63.         TAB[0] = x;
  64.         }
  65.         y++; //inkrementacja licznika/kolumny
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement