/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * *

© Copyright (c) 2020 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "usart.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "led.h" #include "button.h" #include "lcd_1602.h" #include #include #include #include #include /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ //Declaration des leds et buttons LED_TypeDef led_rouge; //rouge LED_TypeDef led_verte; //verte LED_TypeDef led_jaune; //jaune LED_TypeDef led_system; //vert sur la carte BUTTON_TypeDef button_rouge; //rouge BUTTON_TypeDef button_vert; //vert BUTTON_TypeDef button_jaune; //jaune BUTTON_TypeDef button_deux_joueur; //gris BUTTON_TypeDef button_system; //bleu sur la carte // fonction pour allumer et eteindre les leds void fonction_led(char* couleur, int position) { if (strcmp(couleur,"R")==0 && (position==0)){ //eteind rouge Led_turnOff(&led_rouge); } else if (strcmp(couleur,"R")==0 && (position==1)){ //allume rouge Led_turnOn(&led_rouge); } else if (strcmp(couleur,"V")==0 && (position==0)){ Led_turnOff(&led_verte); } else if (strcmp(couleur,"V")==0 && (position==1)){ Led_turnOn(&led_verte); } else if (strcmp(couleur,"J")==0 && (position==0)){ Led_turnOff(&led_jaune); } else if (strcmp(couleur,"J")==0 && (position==1)){ Led_turnOn(&led_jaune); } else if (strcmp(couleur,"S")==0 && (position==0)){ Led_turnOff(&led_system); } else if (strcmp(couleur,"S")==0 && (position==1)){ Led_turnOn(&led_system); } } void affiche_lcd(char* contenu, int positiony, int clear) { if (clear==1){ lcd_clr(); } lcd_gotoxy(0,positiony); lcd_puts(contenu); } char* choix_aleatoire(void) { char* couleur_leds[3]={"R","V","J"}; //nos couleurs de led srand(time(0)); int aleatoire = (rand() % (2 - 0 + 1)) + 0; //choix entre 0 et 2 pour avoir 3 valeurs differentes (3 couleurs/leds) char* choix = couleur_leds[aleatoire]; return choix; } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ // //configuration de l'horloge du système en 16MHz RCC->CR|=1; //activer HSI RCC->CFGR&=~(0b11); RCC->CFGR|=01; //selection de HSI HAL_InitTick(16000000); // // Init de nos leds et buttons Led_init(&led_system, GPIOA,5); //led_system sur PA5 Led_init(&led_rouge, GPIOA,6); //led_rouge sur PA6 Led_init(&led_verte, GPIOA,7); //led_verte sur PA7 Led_init(&led_jaune, GPIOC,4); //led_jaune sur PC4 Button_init(&button_system, GPIOC, 13); //button_system sur PC13 Button_init(&button_rouge, GPIOC, 0); //button_rouge sur PC0 Button_init(&button_vert, GPIOC, 1); //button_vert sur PC1 Button_init(&button_jaune, GPIOH, 2); //button_jaune sur PC2 Button_init(&button_deux_joueur, GPIOH, 3); //button_deux_joueur sur PH3 // /* EXEMPLE D'UTILISATION POUR LED ET BUTTON uint8_t last_button_state = 1; //button non appuyé uint8_t current_button_state = 1; //button non appuyé for (;;) { //lire l’état courant current_button_state = Button_State(&button_system); //si front descendant (bouton appuyé) if (last_button_state == 1 && (current_button_state == 0)) { Led_turnOn(&led_system); //allume //suppression des rebonds HAL_Delay(20); } //si front montant (bouton relâché) if (last_button_state == 0 && (current_button_state != 0)) { //suppression des rebonds HAL_Delay(20); Led_turnOff(&led_system); //eteind } //mise à jour de l’état précédent du bouton last_button_state = current_button_state; } */ affiche_lcd("SIMON_STM32",0,1); int score = 0; //pour le systeme de score int deuxieme_joueur_joue = 0; //pour check si le 2e joueur a joué int score_un=0; //pour store le score du j1 int score_deux=0; //pour store le score du j1 char* suite_de_leds[100]={}; //la suite de leds a faire cligoter /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ lcd_init(); //gestion du mode 2joueurs uint8_t last_button_2j_state = 1; uint8_t current_button_2j_state = 1; int etat_bouton_deux_joueurs=0; //lire l’état courant current_button_2j_state = Button_State(&button_deux_joueur); //si front descendant (bouton appuyé) if (last_button_2j_state == 1 && (current_button_2j_state == 0) && (etat_bouton_deux_joueurs==0)) { etat_bouton_deux_joueurs = 1; //si on avait pas activé le mode 2j, on l'active fonction_led("S",1); //allume la led de la carte } else if (last_button_2j_state == 1 && (current_button_2j_state == 0) && (etat_bouton_deux_joueurs==1)) { etat_bouton_deux_joueurs = 0; //si on avait activé le mode 2j, on le desactive fonction_led("S",0); //eteind la led de la carte } //mise à jour de l’état précédent du bouton last_button_2j_state = current_button_2j_state; //gestion du bouton start/system uint8_t last_button_system_state = 1; //button non appuyé uint8_t current_button_system_state = 1; //button non appuyé int etat_bouton_start=0; //lire l’état courant current_button_system_state = Button_State(&button_system); //si front descendant (bouton appuyé) if (last_button_system_state == 1 && (current_button_system_state == 0)) { etat_bouton_start = 1; } //mise à jour de l’état précédent du bouton last_button_system_state = current_button_system_state; int perdu = 0; //pour check si le j a perdu if (etat_bouton_start){ //Sequence d'allumage affiche_lcd("LET'S GO !",0,1); fonction_led("R", 1); HAL_Delay(250); fonction_led("V", 1); HAL_Delay(250); fonction_led("J", 1); HAL_Delay(250); fonction_led("R", 0); HAL_Delay(250); fonction_led("V", 0); HAL_Delay(250); fonction_led("J", 0); HAL_Delay(250); if (etat_bouton_deux_joueurs && !deuxieme_joueur_joue){ //lancement du mode 2J affiche_lcd("MODE 2J",0,1); affiche_lcd("J1!",1,0); } else if (!etat_bouton_deux_joueurs && !deuxieme_joueur_joue) { //lancement du mode 1J affiche_lcd("MODE 1J",0,1); } while (perdu!= 1) { //ici on lance un niveau (suite de leds), tant qu'on a pas perdu suite_de_leds[score] = choix_aleatoire(); score++; for (int i = 0; iscore_deux){affiche_lcd("JOUEUR 1 GAGNE!",0,1);} else if (score_un