Facebook
From Stained Moth, 5 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 215
  1. #include <avr/common.h>
  2. #define F_CPU 4000000UL
  3. #include <util/delay.h>
  4. #include <avr/interrupt.h>
  5.  
  6. void setColumnToZero(char bit)
  7. {
  8.         bit = 3 - bit;
  9.         PORTA &= ~_BV(bit);
  10. }
  11.  
  12. void setColumnToOne(char bit)
  13. {
  14.         bit = 3 - bit;
  15.         PORTA |= _BV(bit);
  16. }
  17.  
  18. char isRowZero(char bit)
  19. {
  20.         bit += 4;
  21.         return (PINA & _BV(bit)) == _BV(bit);
  22. }
  23.  
  24. void timer1_init()
  25. {
  26.     TCCR1B |= (1 << WGM12)|(1 << CS11)|(1 << CS10);
  27.  
  28.     TCNT1 = 0;
  29.  
  30.     OCR1A = 24;
  31.  
  32.     TIMSK |= (1 << OCIE1A);
  33.  
  34.     sei();
  35. }
  36.  
  37. ISR (TIMER1_COMPA_vect)
  38. {
  39.         for (char i = 0; i < 4; i++)
  40.         {
  41.                 setColumnToZero(i);
  42.                 for (char j = 0; j < 4; j++)
  43.                 {
  44.                         if (isRowZero(j))
  45.                         {
  46.                                 PORTC = ~_BV(j);
  47.                                 _delay_ms(1000);
  48.                                 PORTC = 0xff;
  49.                         }
  50.                 }
  51.                 setColumnToOne(i);
  52.  
  53.         }
  54. }
  55.  
  56. void setup()
  57. {
  58.         DDRC = 0xff; // input
  59.     timer1_init();
  60. }
  61.  
  62. int main(void)
  63. {
  64.    
  65.         setup();
  66.  
  67.     while(1)
  68.     {
  69.     }
  70. }
  71.