Advertisement
simeonvarbanov

Peter AVR

Oct 3rd, 2012
378
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.50 KB | None | 0 0
  1. /*
  2.  * Peter_Game.c
  3.  *
  4.  * Created: 10/03/2012 13:57:46
  5.  *  Author: Peter
  6.  */
  7.  
  8.  
  9. #include <avr/io.h>
  10. #include <stdlib.h>
  11. #define LIGHTDIODE 0
  12. #define WAITPRESS 1
  13. #define GETPRESS 2
  14. #define CHECKPRESS 3
  15. #define BLINK 4
  16.  
  17. static unsigned char state;
  18.  
  19. static unsigned char get_portB_input(void) {
  20.     return ~PINB;
  21. }
  22.  
  23. static void set_portA(unsigned char port_value) {
  24.     PORTA = ~port_value;
  25. }
  26.  
  27. static void led_on(unsigned char ledNo) {
  28.     PORTA &= ~(1 << ledNo);
  29. }
  30.  
  31. static void leds_on() {
  32.     set_portA(0xff);
  33. }
  34.  
  35. static void leds_off(void) {
  36.     set_portA(0x00);
  37. }
  38.  
  39. static void init_io(void) {
  40.     DDRA = 0xff;
  41.     DDRB = 0x00;
  42.     leds_off();
  43. }
  44.  
  45. static void delay(int time) {
  46.     volatile int count1 = 0;
  47.  
  48.     while (count1 < time) {
  49.         volatile int count2 = 0;
  50.  
  51.         while (count2 < time) {
  52.             count2++;
  53.         }
  54.         count1++;
  55.     }
  56. }
  57.  
  58.  
  59. static void blink(void)
  60. {
  61.     int x = 10;
  62.  
  63.     while (x)
  64.     {
  65.         leds_on();
  66.         delay(250);
  67.         leds_off();
  68.         delay(250);
  69.         x--;
  70.     }
  71. }
  72.  
  73. int main(void) {
  74.     int time = 0, wait_time = 0;
  75.     int pressed = 0;
  76.     int random_led = 0;
  77.     int time_treshold = 0;
  78.     int score = 0;
  79.  
  80.     init_io();
  81.    
  82.     state = BLINK;
  83.    
  84.     while (1)
  85.     {
  86.         switch (state)
  87.         {
  88.             case BLINK:
  89.             {
  90.                 blink();
  91.                 state = LIGHTDIODE;
  92.                 delay(250);
  93.                 wait_time = 1000;
  94.                 score = 0;
  95.                 break;
  96.             }
  97.             case LIGHTDIODE:
  98.             {
  99.                 random_led = 4 + (int)(rand() / (RAND_MAX / 4 + 1));
  100.                 led_on(random_led);
  101.                 delay(250);
  102.                 time = wait_time;
  103.                 state = WAITPRESS;
  104.                 time_treshold = wait_time / 4;
  105.                 break;
  106.             }
  107.             case WAITPRESS:
  108.             {
  109.                 if(time > 0) {
  110.                     if(time == time_treshold){
  111.                         set_portA(15 | (1 << random_led));
  112.                     }
  113.                     else if(time == 2*time_treshold){
  114.                         set_portA(7 | (1 << random_led));
  115.                     }
  116.                     else if(time == 3*time_treshold){
  117.                         set_portA(3 | (1 << random_led));
  118.                     }
  119.                     else if(time == 4*time_treshold){
  120.                         set_portA(1 | (1 << random_led));
  121.                     }
  122.                     state = GETPRESS;
  123.                     break;
  124.                 }
  125.                 state = CHECKPRESS;
  126.                 break;
  127.             }
  128.             case GETPRESS:
  129.             {
  130.                 pressed = get_portB_input();
  131.                 if(pressed == 0) {
  132.                     state = WAITPRESS;
  133.                     time--;
  134.                 } else {
  135.                     state = CHECKPRESS;
  136.                 }
  137.                 delay(70);
  138.                 break;
  139.             }
  140.             case CHECKPRESS:
  141.             if(pressed == (1 << random_led)) {
  142.                 wait_time -= 0.1 * wait_time;
  143.                 leds_off();
  144.                 delay(500);
  145.                 state = LIGHTDIODE;
  146.                 score++;
  147.                 break;
  148.             } else {
  149.                 leds_off();
  150.                 delay(500);
  151.                 state = BLINK;
  152.                 set_portA(score);
  153.                 delay(2000);
  154.                 break;
  155.             }
  156.         }
  157.     }
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement