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>
- #include <avr/pgmspace.h>
- volatile int wysw=0;
- unsigned char TABZN[16] PROGMEM = {63,6,91,79,102,109,125,7,127,111,119,124,57,94,121,113};
- unsigned char TAB[4];
- 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 = 255; //podłącony do wyświetlacza
- DDRA = 0x0F; //ustawienie bitów portu A od 0-3 na wyjście
- //port A podłączony do klawiatury jak i do kolumn wyświetlacza
- PORTA = 0xFF; //podciągnięcia na kolumnach i rzędy w stanie 1
- inicjalizacjaTIMERA(); //inicjalizacja timera
- sei(); //włączenie przerwań globalnych
- while(1)
- {
- }
- }
- ISR(TIMER1_COMPA_vect)
- {
- PORTA = 0xFF;
- PORTB = ~pgm_read_byte(&(TABZN[TAB[wysw]]));
- PORTA = ~_BV(wysw);
- wysw++;
- if(wysw==4) {wysw=0;}
- if(y==4) y=0; //jeśli licznik przekroczył 3 jest wyzerowany
- x=PORTA; //do x pobierana wartość portu A
- x=(x | 0x0F ) ^ (1<<y); //wybierany aktywny wiersz bez zmainy innych pinów
- PORTA = x; //wartość x wpisana do portu A
- asm volatile ("nop"); //synchronizacja
- x=PINA; //wartość pinów portu A wpisana do x
- if((x & 0xF0)!=0xF0) //Sprawdzenie czy jakiś 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
- TAB[3] = TAB[2];
- TAB[2] = TAB[1];
- TAB[1] = TAB[0];
- TAB[0] = x;
- }
- y++; //inkrementacja licznika/kolumny
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement