Ping-Pong на AVR

от автора

В очередную уборку в мастерской довелось мне наткнуться на два матричных индикатора 8х8, там же была найдена Mega16, кнопки, макетка. «Какой же ты программист, если за свою жизнь ни разу не написал Тетрис?», спросил мозг.
Конец дня был посвящен тому, чтобы навесом спаять это все хозяйство.
image

Схема выглядит следующим образом:
image

К сожалению руки до Тетриса пока не дошли, размялся тем, что написал Пинг-Понг.
Видео работы устройства можно посмотреть тут. Видео

/***************************************************** Chip type               : ATmega16 Program type            : Application AVR Core Clock frequency: 8,000000 MHz Memory model            : Small External RAM size       : 0 Data Stack size         : 256 *****************************************************/  #include <mega16.h> #include <delay.h> #include <math.h> #include <stdlib.h>  #include <stdio.h>  // Declare your global variables here int cnt = 0; char src = 0, start = 0, tmp = 0, cx = 3, cy = 14, mx = 2, my = 15, ex = 3, ey = 0, dx = 1, dy = 1, fld[16][8], speed = 200; char flds[16][8] = {{0,1,1,1,1,1,1,0},   // 0                    {1,0,0,0,0,0,0,1},   // 1                    {1,0,1,0,0,1,0,1},   // 2                    {1,0,0,0,0,0,0,1},   // 3                    {1,0,1,0,0,1,0,1},   // 4                    {1,0,0,1,1,0,0,1},   // 5                    {0,1,0,0,0,0,1,0},   // 6                    {0,0,1,1,1,1,0,0},   // 7                                        {0,0,0,0,0,0,0,0},   // 8                    {0,0,0,0,0,0,0,0},   // 9                    {0,0,0,0,0,0,0,0},   // 10                    {0,0,0,0,0,0,0,0},   // 11                    {0,0,0,0,0,0,0,0},   // 12                    {0,0,0,0,0,0,0,0},   // 13                    {0,0,0,0,0,0,0,0},   // 14                    {0,0,0,0,0,0,0,0}};  // 15                        void showsrc(void) { char x = 0, y = 0;     src = 0, start = 0, tmp = 0, cx = 3, cy = 14, mx = 2, my = 15, ex = 3, ey = 0, dx = 1, dy = 1, speed = 200;     while (y < 16) {          x = 0;         while (x < 8) {             fld[y][x] = flds[y][x];             x++;         }         y++;     } }                                // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Place your code here     if (cnt >= speed) {         if (start == 0)          {                    fld[9][5]  = 0; fld[10][5] = 0;             fld[11][5] = 0; fld[12][5] = 0;              fld[12][3] = 0; fld[12][7] = 0;             fld[13][3] = 0; fld[13][5] = 0;             fld[13][7] = 0; fld[13][4] = 0;             fld[13][6] = 0; fld[14][4] = 0;             fld[14][5] = 0; fld[14][6] = 0;             fld[15][5] = 0;              if (tmp == 0) {                  fld[10][5] = 1; fld[11][5] = 1;                 fld[12][5] = 1; fld[13][3] = 1;                 fld[13][5] = 1; fld[13][7] = 1;                 fld[14][4] = 1; fld[14][5] = 1;                 fld[14][6] = 1; fld[15][5] = 1;                        }             else {                 fld[9][5]  = 1; fld[10][5] = 1;                 fld[11][5] = 1; fld[12][3] = 1;                 fld[12][5] = 1; fld[12][7] = 1;                 fld[13][4] = 1; fld[13][5] = 1;                 fld[13][6] = 1; fld[14][5] = 1;                   };             tmp++;             if (tmp == 2) tmp = 0;          }         else //game cycle         {                fld[cy][cx] = 0;             if (dy == 1) {                 if (cy > 0) cy--;                  else {tmp = 0; start = 0; showsrc();}             }             else {                 if (cy < 15) cy ++;                 else {tmp = 0; start = 0; showsrc();}             }                              if ((cy == 1) && (fld[0][cx] == 1)) dy = 2;             if ((cy == 1) && (fld[0][cx] == 0)) {tmp = 0; start = 0; showsrc();}               if ((cy == 14) && (fld[15][cx] == 1)) dy = 1;             if ((cy == 14) && (fld[0][cx] == 0)) {tmp = 0; start = 0; showsrc();}              if (start == 1) {                            if (dx == 1) {                     cx--;                     if (cx == 0) {dx = 2;}                  }                 else {                     cx++;                     if (cx == 7) {dx = 1;}                 }                 fld[cy][cx] = 1;                       if (PINC.7 == 0) {                     delay_ms(1);                     if (PINC.7 == 0) {                         if ((mx > 0) && (mx != 0)) {mx--; fld[my][mx+3] = 0;}                     }                 }                     if (PINC.6 == 0) {                     delay_ms(1);                     if (PINC.6 == 0){                          if ((mx < 5) && (mx != 5)) {mx++; fld[my][mx-1] = 0;}                     }                   }                  ex = cx;                 if (cx > 5) ex = 5;                  if (ex > 0) fld[ey][ex-1] = 0;                  if (ex < 5) fld[ey][ex+3] = 0;                 fld[my][mx] = 1; fld[my][mx+1] = 1; fld[my][mx+2] = 1;                  fld[ey][ex] = 1; fld[ey][ex+1] = 1; fld[ey][ex+2] = 1;             }                              }      cnt = 0;         }     cnt++; }  void paint(void) { char x = 0;     while (x <= 7) {         PORTA = 0b00000000;         PORTB = 0b00000000;         PORTD = 0b11111111;         if (src == 0) {             PORTA.0 = fld[0][x];  PORTA.1 = fld[1][x];             PORTA.2 = fld[2][x];  PORTA.3 = fld[3][x];             PORTA.4 = fld[4][x];  PORTA.5 = fld[5][x];             PORTA.6 = fld[6][x];  PORTA.7 = fld[7][x];         } else {                 PORTB.0 = fld[8][x];  PORTB.1 = fld[9][x];             PORTB.2 = fld[10][x]; PORTB.3 = fld[11][x];             PORTB.4 = fld[12][x]; PORTB.5 = fld[13][x];             PORTB.6 = fld[14][x]; PORTB.7 = fld[15][x];         }             switch (x) {             case 0: {PORTD = 0b11111110; break;} case 1: {PORTD = 0b11111101; break;}             case 2: {PORTD = 0b11111011; break;} case 3: {PORTD = 0b11110111; break;}             case 4: {PORTD = 0b11101111; break;} case 5: {PORTD = 0b11011111; break;}             case 6: {PORTD = 0b10111111; break;} case 7: {PORTD = 0b01111111; break;}         }             delay_us(50);         x++;     }     src++;     if (src == 2) src = 0;  }  void initgame(void) { char x = 0, y = 0;     #asm("cli")     while (y < 16) {          x = 0;         while (x < 8) {             fld[y][x] = 0;             x++;         }         y++;     }      tmp = 1;      speed = 50;     #asm("sei") }  void inkey(void){ char key = 0;       if (PINC.1 == 0) {         delay_ms(1);         if (PINC.1 == 0) key = 3; //down      }      if (PINC.0 == 0) {         delay_ms(1);         if (PINC.0 == 0) key = 4; //button      }        switch (key) {     case 1: {              break;}     case 2: {          break;}     case 3: {          break;}     case 4: {         if (start == 0) {             start = 1;             initgame();         }             break;}      default: {     }     };              }    void main(void) { // Declare your local variables here  // Input/Output Ports initialization // Port A initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out  // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0  PORTA=0x00; DDRA=0xFF;  // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In  // State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P  PORTB=0x00; DDRB=0xFF;  // Port C initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out  // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0  PORTC=0xFF; DDRC=0x00;  // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out  // State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1  PORTD=0x00; DDRD=0xFF; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 1000,000 kHz // Mode: Normal top=0xFF // OC0 output: Disconnected TCCR0=0x02; TCNT0=0x00; OCR0=0x00;  // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;  // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=0xFF // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00;  // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00;  // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x01;   // USART initialization // USART disabled UCSRB=0x00;  // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00;  // ADC initialization // ADC disabled ADCSRA=0x00;  // SPI initialization // SPI disabled SPCR=0x00;  // TWI initialization // TWI disabled TWCR=0x00; showsrc(); #asm("sei") while (1)       {       // Place your code here       paint();       inkey();                } } 

ссылка на оригинал статьи http://habrahabr.ru/post/161951/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *