/* 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