Digitala System Projekt

Om

Simon Says att du ska gilla vårt projekt. För med det kan du spela Simon Says, allas favorit spel, men nu i en mer naken version som gör att även de mest tekniska personerna blir sugna på att spela ett enkelt men roligt spel!

Hur ser projektet ut? Bara kolla in bilden:Chef

Saker som har använts i projektet:

1. Sladdar

3. 4 st Knappar

5. 4 st led lampor

2. Atmega1284 Processor

4. 16x2 Display

6. Kod

Hur fungerar spelet?

När du ska starta spelet slår du på strömmen och när du är redo, klickar du på knapp 1!

Nu kommer lamporna att börja lyssa. När lampan som lysser rakt ovanför en knapp så ska du klicka på den knapp som är under! Om du klickar fel, förlorar du.

Om du klickar rätt kommer samma lampor att lyssa, men med en ny lampa i slutet och du ska nu klicka samma knappar igen i rätt sekvens som lamporna lysser plus den nya.

Om du på något sätt vinner, alltså komma upp i 1000 stycken rätta tryck i sekvensen, så har du vunnit! (Hur har du lyckats?) Men då kommer skärmen att säga att du ska klicka på knapp 1 för att starta igen, det gör det även om du har förlorat, så om du vill spela igen, klicka på knapp 1!

Målet med spelet är nu att klicka på rätt knappar i rätt sekvens så länge som möjligt! Den som klickar rätt mest vinner!

Om du vill se hur det funkar i en video istället kan du kolla på videon nedan:

Spel Redovisning

Kabeldragning

Kod

          
            #include stdio.h
            #include string.h
            #include ctype.h
            
            #define F_CPU 20000000UL
            
            #include avr/io.h
            #include util/delay.h
            #include stdlib.h
            
            void start_sec();
            int rnd_number();
            int simon_game();
            void not_win();
            void win_win();
            void start_new_game();
            void show_led();
            void new_game_seq();
            int get_button();
            void display_set_char();
            void display_setup();
            void display_clear();
            void display_set_number();
            
            #define MAX_SEQUENCE_LENGTH 100
            int game_vector[MAX_SEQUENCE_LENGTH];
            
            int round_game_vector[MAX_SEQUENCE_LENGTH];
            int pressed_vector[MAX_SEQUENCE_LENGTH];
            
            int time_to_get = 0;
            
            int main(void){
              DDRA = 0x00; // Set PA as input
              DDRB = 0xff; // Set PB as output
              DDRC |= 0b00000011;
              DDRD = 0xff; //Screen programing pins
              
              start_sec();
              
              display_setup();
              
              char arr[] = "BTN 1 to start";
              int size = sizeof(arr) / sizeof(arr[0]);
              display_set_char(arr, size, 1);
              
              int wat = 1;
              while(wat){
                if(PINA & 0b00000001){
                  wat = 0;
                }
                time_to_get++;
              }
              srand(time_to_get);
              
              new_game_seq();
              display_clear();
              simon_game();
              while(1){}
            }
            void display_set_number(int num, int row){
              int num2 = num;
              int count = 0;
              while (num2 != 0) {
                num2 /= 10;
                ++count;
              }
              
              char arr2[count+1];
              int size2 = sizeof(arr2) / sizeof(arr2[0]);
              sprintf(arr2, "%d", num);
              display_set_char(arr2, size2, row);
            }
            void check_game_vector_values(){
              for (int i = 0; i < MAX_SEQUENCE_LENGTH; i++){
                show_led(8);
                _delay_ms(10);
                show_led(game_vector[i]);
                _delay_ms(10);
              }
            }
            void show_led(int choosen){
              switch(choosen){
                case 0:
                PORTB = 0b00000000;
                case 1:
                PORTB = 0b00000001;
                break;
                case 2:
                PORTB = 0b00000010;
                break;
                case 3:
                PORTB = 0b00000100;
                break;
                case 4:
                PORTB = 0b00001000;
                break;
                default:
                PORTB = 0b10000000;
                break;
                
              }
            }
            int get_button(){
              int waiting = 0;
              int noPressTime = 250;
              int loop = 0;
              
              while (waiting != 1){
                if (PINA & 0b00000001){ // Check if the first button on PA is pressed
                  waiting = 1;
                  while(PINA & 0b00000001){}
                  return 1;
                }
                
                if (PINA & 0b00000010){ // Check if the first button on PA is pressed
                  waiting = 1;
                  while(PINA & 0b00000010){}
                  return 2;
                }
                
                if (PINA & 0b00000100){ // Check if the first button on PA is pressed
                  waiting = 1;
                  while(PINA & 0b00000100){}
                  return 3;
                }
                
                if (PINA & 0b00001000){ // Check if the first button on PA is pressed
                  waiting = 1;
                  while(PINA & 0b00001000){}
                  return 4;
                }
                
                if(loop >= noPressTime){
                  waiting = 1;
                  return 0;
                  }else{
                  loop++;
                }
                
                time_to_get++;
                _delay_ms(1);
              }
              return 0;
            }
            void start_sec(){
              int delay_amount = 15;
              _delay_ms(delay_amount);
              PORTB = 0b00000001;
              _delay_ms(delay_amount);
              PORTB = 0b00000010;
              _delay_ms(delay_amount);
              PORTB = 0b00000100;
              _delay_ms(delay_amount);
              PORTB = 0b00001000;
              _delay_ms(delay_amount);
              PORTB = 0b10000000;
              _delay_ms(delay_amount);
              PORTB = 0b11111111;
              _delay_ms(delay_amount);
              PORTB = 0x00;
            }
            int rnd_number(){
              uint8_t random_number = (rand() % 4) + 1;
              return random_number;
            }
            void new_game_seq(){
              for (int i = 0; i < MAX_SEQUENCE_LENGTH; i++){
                game_vector[i] = rnd_number();
              }
            }
            int simon_game(){
              int round = 1;
              int win_amount = 1000;
            
              while(round < win_amount+1){
                display_clear();
                char arr[] = "Score: ";
                int size = sizeof(arr) / sizeof(arr[0]);
                display_set_char(arr, size, 2, 1);
                
                display_set_number(round-1, 2);
            
                for (int i = 0 ; i < round; i++){
                  _delay_ms(20);
                  PORTB = 0b10000000;
                  show_led(game_vector[i]);
                  _delay_ms(20);
                  PORTB = 0b00000000;
                }
            
                for (int j = 0; j < round; j++){
                  int pressed_button = get_button();
                  if(pressed_button != game_vector[j]){
                    not_win(round-1);
                    return 0;
                  }
                }
                round++;
              }
              win_win(round-1);
              return 1;
            }
            void not_win(int round){
              int loss = 1;
              
              display_clear();
              char arr[] = "You Lost: ";
              int size = sizeof(arr) / sizeof(arr[0]);
              display_set_char(arr, size, 1, 1);
              
              display_set_number(round, 1);
              
              char arr2[] = "BTN 1 to Start!";
              int size2 = sizeof(arr2) / sizeof(arr2[0]);
              display_set_char(arr2, size2, 2, 1);
              
              while(loss){
                PORTB = 0b00000001;
                if (PINA & 0b00000001){ // Check if the first button on PA is pressed
                  loss = 0; // Turn on the first LED on PB
                }
              }
              start_new_game();
            }
            void win_win(int round){
              int loss = 1;
              
              display_clear();
              char arr[] = "You Won: ";
              int size = sizeof(arr) / sizeof(arr[0]);
              display_set_char(arr, size, 1, 1);
              
              display_set_number(round, 1);
              
              char arr2[] = "BTN 1 to Start!";
              int size2 = sizeof(arr2) / sizeof(arr2[0]);
              display_set_char(arr2, size2, 2, 1);
              
              while(loss){
                PORTB = 0b00001000;
                if (PINA & 0b10000001){ // Check if the first button on PA is pressed
                  loss = 0; // Turn on the first LED on PB
                }
              }
              start_new_game();
            }
            void start_new_game(){
              display_clear();
              new_game_seq();
              simon_game();
            }
            void display_setup(){
              PORTC = 0b00000010;
              PORTD = 0b00111100;	//Function set
              PORTC = 0b00000000;
              
              PORTC = 0b00000010;
              PORTD = 0b00001100;
              PORTC = 0b00000000;
              
              display_clear();
            }
            void display_clear(){
              PORTC = 0b00000010;
              _delay_us(1);
              PORTD = 0b00000001;
              _delay_us(1);
              PORTC = 0b00000000;
              _delay_us(1);
              PORTC = 0b00000011;
              _delay_us(1);
            }
            void display_set_char(char str[], int size, int row, int cur_start){
              int _cur_start = 0;
              
              if(cur_start == 1){
                _cur_start = 1;
              }
              
              if(row == 0){
                display_clear();
              }
              
              if(_cur_start == 1){
                PORTC = 0b00000010;
                _delay_us(1);
                PORTD = 0b10000000;
                _delay_us(1);
                PORTC = 0b00000000;
              }
              
              if(row == 0){
                for (int i = 0; i < size-1; i++){
                  if(i==16){
                    PORTC = 0b00000010;
                    _delay_us(1);
                    PORTD = 0b11000000;
                    _delay_us(1);
                    PORTC = 0b00000000;
                  }
                  PORTC = 0b00000011;
                  _delay_us(1);
                  PORTD = str[i];
                  _delay_us(1);
                  PORTC = 0b00000001;
                  _delay_us(1);
                }
              }else if(row == 1){
                for (int i = 0; i < size-1; i++){
                  PORTC = 0b00000011;
                  _delay_us(1);
                  PORTD = str[i];
                  _delay_us(1);
                  PORTC = 0b00000001;
                  _delay_us(1);
                }
              }else{
                if(_cur_start == 1){
                  PORTC = 0b00000010;
                  _delay_us(1);
                  PORTD = 0b11000000;
                  _delay_us(1);
                  PORTC = 0b00000000;
                }
                
                for (int i = 0; i < size-1; i++){
                  PORTC = 0b00000011;
                  _delay_us(1);
                  PORTD = str[i];
                  _delay_us(1);
                  PORTC = 0b00000001;
                  _delay_us(1);
                }
              }
            }