Ilinskaya

Untitled

Dec 27th, 2022
1,140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.95 KB | None | 0 0
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * @file           : main.c
  5.   * @brief          : Main program body
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  10.   * All rights reserved.</center></h2>
  11.   *
  12.   * This software component is licensed by ST under BSD 3-Clause license,
  13.   * the "License"; You may not use this file except in compliance with the
  14.   * License. You may obtain a copy of the License at:
  15.   *                        opensource.org/licenses/BSD-3-Clause
  16.   *
  17.   ******************************************************************************
  18.   */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "main.h"
  22. #include "i2c.h"
  23. #include "tim.h"
  24. #include "usart.h"
  25. #include "gpio.h"
  26.  
  27. /* Private includes ----------------------------------------------------------*/
  28. /* USER CODE BEGIN Includes */
  29. #include "buzzer.h"
  30. #include "kb.h"
  31. #include "pca9538.h"
  32. #include <stdlib.h>
  33. #include <ctype.h>
  34. /* USER CODE END Includes */
  35.  
  36. /* Private typedef -----------------------------------------------------------*/
  37. /* USER CODE BEGIN PTD */
  38.  
  39. /* USER CODE END PTD */
  40.  
  41. /* Private define ------------------------------------------------------------*/
  42. /* USER CODE BEGIN PD */
  43. #define MAX_NOTES_CNT 2048
  44. /* USER CODE END PD */
  45.  
  46. /* Private macro -------------------------------------------------------------*/
  47. /* USER CODE BEGIN PM */
  48.  
  49. /* USER CODE END PM */
  50.  
  51. /* Private variables ---------------------------------------------------------*/
  52.  
  53. /* USER CODE BEGIN PV */
  54.  
  55. /* USER CODE END PV */
  56.  
  57. /* Private function prototypes -----------------------------------------------*/
  58. void SystemClock_Config(void);
  59. /* USER CODE BEGIN PFP */
  60.  
  61. /* USER CODE END PFP */
  62.  
  63. /* Private user code ---------------------------------------------------------*/
  64. /* USER CODE BEGIN 0 */
  65. int is_test = 0;
  66. /* USER CODE END 0 */
  67.  
  68. /**
  69.   * @brief  The application entry point.
  70.   * @retval int
  71.   */
  72. int main(void)
  73. {
  74.   /* USER CODE BEGIN 1 */
  75.     uint32_t megalovania_melody[] = {
  76.             N_D3, N_D3, N_D4, N_A3, 0, N_GS3, N_G3, N_F3, N_D3, N_F3, N_G3, N_C3, N_C3, N_D4, N_A3, 0, N_GS3, N_G3, N_F3, N_D3, N_F3, N_G3, N_B2, N_B2, N_D4, N_A3, 0, N_GS3, N_G3, N_F3, N_D3, N_F3, N_G3, N_AS2, N_AS2, N_D4, N_A3, 0, N_GS3, N_G3, N_F3, N_D3, N_F3, N_G3, N_D3, N_D3, N_D4, N_A3, 0, N_GS3, N_G3, N_F3, N_D3, N_F3, N_G3, N_C3, N_C3, N_D4, N_A3, 0, N_GS3, N_G3, N_F3, N_D3, N_F3, N_G3, N_B2, N_B2, N_D4, N_A3, 0, N_GS3, N_G3, N_F3, N_D3, N_F3, N_G3, N_AS2, N_AS2, N_D4, N_A3, 0, N_GS3, N_G3, N_F3, N_D3, N_F3, N_G3, N_D4, N_D4, N_D5, N_A4, 0, N_GS4, N_G4, N_F4, N_D4, N_F4, N_G4, N_C4, N_C4, N_D5, N_A4, 0, N_GS4, N_G4, N_F4, N_D4, N_F4, N_G4, N_B3, N_B3, N_D5, N_A4, 0, N_GS4, N_G4, N_F4, N_D4, N_F4, N_G4, N_AS3, N_AS3, N_D5, N_A4, 0, N_GS4, N_G4, N_F4, N_D4, N_F4, N_G4, N_D4, N_D4, N_D5, N_A4, 0, N_GS4, N_G4, N_F4, N_D4, N_F4, N_G4, N_C4, N_C4, N_D5, N_A4, 0, N_GS4, N_G4, N_F4, N_D4, N_F4, N_G4, N_B3, N_B3, N_D5, N_A4, 0, N_GS4, N_G4, N_F4, N_D4, N_F4, N_G4, N_AS3, N_AS3, N_D5, N_A4, 0, N_GS4, N_G4, N_F4, N_D4, N_F4, N_G4, N_F4, N_F4, N_F4, N_F4, N_F4, N_D4, N_D4, N_D4, N_F4, N_F4, N_F4, N_G4, N_GS4, N_G4, N_F4, N_D4, N_F4, N_G4, 0, N_F4, N_F4, N_F4, N_G4, N_GS4, N_A4, N_C5, N_A4, N_D5, N_D5, N_D5, N_A4, N_D5, N_C5, N_F4, N_F4, N_F4, N_F4, N_F4, N_D4, N_D4, N_D4, N_F4, N_F4, N_F4, N_F4, N_D4, N_F4, N_E4, N_D4, N_C4, 0, N_G4, N_E4, N_D4, N_D4, N_D4, N_D4, N_F3, N_G3, N_AS3, N_C4, N_D4, N_F4, N_C5, 0, N_F4, N_D4, N_F4, N_G4, N_GS4, N_G4, N_F4, N_D4, N_GS4, N_G4, N_F4, N_D4, N_F4, N_F4, N_F4, N_GS4, N_A4, N_C5, N_A4, N_GS4, N_G4, N_F4, N_D4, N_E4, N_F4, N_G4, N_A4, N_C5, N_CS5, N_GS4, N_GS4, N_G4, N_F4, N_G4, N_F3, N_G3, N_A3, N_F4, N_E4, N_D4, N_E4, N_F4, N_G4, N_E4, N_A4, N_A4, N_G4, N_F4, N_DS4, N_CS4, N_DS4, 0, N_F4, N_D4, N_F4, N_G4, N_GS4, N_G4, N_F4, N_D4, N_GS4, N_G4, N_F4, N_D4, N_F4, N_F4, N_F4, N_GS4, N_A4, N_C5, N_A4, N_GS4, N_G4, N_F4, N_D4, N_E4, N_F4, N_G4, N_A4, N_C5, N_CS5, N_GS4, N_GS4, N_G4, N_F4, N_G4, N_F3, N_G3, N_A3, N_F4, N_E4, N_D4, N_E4, N_F4, N_G4, N_E4, N_A4, N_A4, N_G4, N_F4, N_DS4, N_CS4, N_DS4,
  77.     };
  78.     uint32_t megalovania_delays[] = {
  79.             16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 16, 16, 8, 6, 32, 8, 8, 8, 16, 16, 16, 8, 16, 8, 8, 8, 8, 4, 16, 8, 16, 8, 8, 8, 16, 16, 16, 16, 16, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 2, 8, 16, 8, 8, 8, 8, 4, 16, 8, 16, 8, 8, 8, 8, 8, 16, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, 15, 8, 8, 2, 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 2, 16, 8, 16, 8, 16, 16, 16, 16, 16, 16, 8, 8, 8, 8,  8, 8, 16, 16, 16, 2, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 2, 8, 8, 8, 8, 2, 2, 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 2, 16, 8, 16, 8, 16, 16, 16, 16, 16, 16, 8, 8, 8, 8,  8, 8, 16, 16, 16, 2, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 2, 8, 8, 8, 8, 2, 1
  80.     };
  81.     uint32_t zelda_melody[] = {
  82.             N_AS4, 0, 0, N_AS4, N_AS4, N_AS4, N_AS4, N_AS4, 0, N_GS4, N_AS4, 0, 0, N_AS4, N_AS4, N_AS4, N_AS4, N_AS4, 0, N_GS4, N_AS4, 0, 0, N_AS4, N_AS4, N_AS4, N_AS4, N_AS4, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_AS4, N_F3, N_F3, 0, N_AS4, N_AS4, N_C5, N_D5, N_DS5, N_F5, 0, N_F5, N_F5, N_FS5, N_GS5, N_AS5, 0, N_AS5, N_AS5, N_AS5, N_GS5, N_FS5, N_GS5, 0, N_FS5, N_F5, N_F5, N_DS5, N_DS5, N_F5, N_FS5, N_F5, N_DS5, N_CS5, N_CS5, N_DS5, N_F5, N_DS5, N_CS5, N_C5, N_C5, N_D5, N_E5, N_G5, N_F5, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_AS4, N_F3, N_F3, 0, N_AS4, N_AS4, N_C5, N_D5, N_DS5, N_F5, 0, N_F5, N_F5, N_FS5, N_GS5, N_AS5, 0, N_CS6, N_C6, N_A5, 0, N_F5, N_FS5, 0, N_AS5, N_A5, N_F5, 0, N_F5, N_FS5, 0, N_AS5, N_A5, N_F5, 0, N_D5, N_DS5, 0, N_FS5, N_F5, N_CS5, 0, N_AS4, N_C5, N_C5, N_D5, N_E5, 0, N_G5, N_F5, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_AS4, N_F3, N_F3, 0, N_AS4, N_AS4, N_C5, N_D5, N_DS5, N_F5, 0, N_F5, N_F5, N_FS5, N_GS5, N_AS5, 0, N_AS5, N_AS5, N_AS5, N_GS5, N_FS5, N_GS5, 0, N_FS5, N_F5, N_F5, N_DS5, N_DS5, N_F5, N_FS5, N_F5, N_DS5, N_CS5, N_CS5, N_DS5, N_F5, N_DS5, N_CS5, N_C5, N_C5, N_D5, N_E5, N_G5, N_F5, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_AS4, N_F3, N_F3, 0, N_AS4, N_AS4, N_C5, N_D5, N_DS5, N_F5, 0, N_F5, N_F5, N_FS5, N_GS5, N_AS5, 0, N_CS6, N_C6, N_A5, 0, N_F5, N_FS5, 0, N_AS5, N_A5, N_F5, 0, N_F5, N_FS5, 0, N_AS5, N_A5, N_F5, 0, N_D5, N_DS5, 0, N_FS5, N_F5, N_CS5, 0, N_AS4, N_C5, N_C5, N_D5, N_E5, 0, N_G5, N_F5, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3, N_F3
  83.     };
  84.     uint32_t zelda_delays[] = {
  85.             2, 8, 8, 8, 8, 8, 8, 6, 16, 16, 4, 8, 8, 8, 8, 8, 8, 6, 16, 16, 4, 8, 8, 8, 8, 8, 8, 8, 16, 16, 8, 16, 16, 8, 16, 16, 8, 8, 4, 4, 6, 16, 16, 16, 16, 16, 16, 2, 8, 8, 8 ,8 ,8, 2, 8, 8, 8 ,8 ,8, 8, 6, 16, 16, 2, 4, 8, 16, 16, 2, 8, 8, 8, 16, 16, 2, 8, 8, 8, 16, 16, 2, 4, 8, 16, 16, 8, 16, 16, 8, 16, 16, 8, 8, 4, 4, 6, 16, 16, 16, 16, 16, 16, 2, 8, 8, 8 ,8 ,8, 2, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 8, 16, 16, 4, 4, 4, 8, 16, 16, 8, 16, 16, 8, 16, 16, 8, 8, 4, 4, 6, 16, 16, 16, 16, 16, 16, 2, 8, 8, 8 ,8 ,8, 2, 8, 8, 8 ,8 ,8, 8, 6, 16, 16, 2, 4, 8, 16, 16, 2, 8, 8, 8, 16, 16, 2, 8, 8, 8, 16, 16, 2, 4, 8, 16, 16, 8, 16, 16, 8, 16, 16, 8, 8, 4, 4, 6, 16, 16, 16, 16, 16, 16, 2, 8, 8, 8 ,8 ,8, 2, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 8, 16, 16, 4, 4, 4, 8, 16, 16, 8, 16, 16, 8, 16, 16, 8, 8
  86.     };
  87.     uint32_t was_melody[] = {
  88.             N_D4, N_D4, N_C4, N_B3, N_C4, N_A3, N_G3, N_A3, N_D4, N_D4, N_C4, N_B3, N_D4, N_D4, N_C4, N_B3, N_C4, N_A3, N_A3, N_B3, N_G3, N_A3, 0,
  89.             N_A3, N_C4, N_D4, N_E4, N_E4, N_F4, N_D4, N_E4, 0,
  90.             N_D4, N_D4, N_C4, N_B3, N_C4, N_A3, N_G3, N_A3, N_D4, N_D4, N_C4, N_B3, N_D4, N_D4, N_C4, N_B3, N_C4, N_A3, N_A3, N_B3, N_G3, N_A3, 0
  91.     };
  92.     uint32_t was_delays[] = {
  93.             8, 8, 16, 16, 4, 6, 12 , 6, 8, 8, 8, 8, 8, 8, 16, 16, 4, 8, 8, 8, 8, 8, 4,
  94.             8, 8, 8, 4, 4, 8, 8, 8, 4,
  95.             8, 8, 16, 16, 4, 6, 12 , 6, 8, 8, 8, 8, 8, 8, 16, 16, 4, 8, 8, 8, 8, 8, 4
  96.     };
  97.  
  98.     uint32_t pirate_melody[] = {
  99.             N_E4, N_G4, N_A4, N_A4, 0, N_A4, N_B4, N_C5, N_C5, 0, N_C5, N_D5, N_B4, N_B4, 0, N_A4, N_G4, N_A4, 0,
  100.             N_E4, N_G4, N_A4, N_A4, 0, N_A4, N_B4, N_C5, N_C5, 0, N_C5, N_D5, N_B4, N_B4, 0, N_A4, N_G4, N_A4, 0,
  101.     };
  102.  
  103.     uint32_t pirate_delays[]={
  104.             8, 8, 16, 8, 8, 8, 8, 16, 8, 8, 8, 8, 16, 8, 8, 8, 8, 375, 8,
  105.             8, 8, 16, 8, 8, 8, 8, 16, 8, 8, 8, 8, 16, 8, 8, 8, 8, 375, 8,
  106. };
  107.   /* USER CODE END 1 */
  108.  
  109.   /* MCU Configuration--------------------------------------------------------*/
  110.  
  111.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  112.   HAL_Init();
  113.  
  114.   /* USER CODE BEGIN Init */
  115.   MX_I2C1_Init();
  116.   /* USER CODE END Init */
  117.  
  118.   /* Configure the system clock */
  119.   SystemClock_Config();
  120.  
  121.   /* USER CODE BEGIN SysInit */
  122.  
  123.   /* USER CODE END SysInit */
  124.  
  125.   /* Initialize all configured peripherals */
  126.   MX_GPIO_Init();
  127.   MX_USART6_UART_Init();
  128.   MX_TIM2_Init();
  129.   MX_TIM6_Init();
  130.   MX_I2C1_Init();
  131.   /* USER CODE BEGIN 2 */
  132.   Buzzer_Init();
  133.   int calc_digit(int,int);
  134.   char read_number();
  135.  
  136.   /* USER CODE END 2 */
  137.  
  138.   /* Infinite loop */
  139.   /* USER CODE BEGIN WHILE */
  140.   uint8_t input[0];
  141.   uint32_t input_melody[MAX_NOTES_CNT] = {0};
  142.   uint32_t input_delay[MAX_NOTES_CNT] = {0};
  143.   uint16_t notes_count = 0;
  144.   uint8_t defaultChar = '~';
  145.   while (1)
  146.   {
  147.       if (!HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_15)) {
  148.           is_test = !is_test;
  149.           HAL_Delay(300);
  150.       }
  151.       TEST:
  152.       if (is_test) {
  153.           UART_Transmit("In test\n\r");
  154.           while (is_test) {
  155.               read_number();
  156.               if (!HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_15)) {
  157.                   is_test = !is_test;
  158.                   HAL_Delay(300);
  159.                   UART_Transmit("Test end\n\r");
  160.               }
  161.           }
  162.       }
  163.       input[0] = read_number();
  164.       if (input[0] == 'x') goto TEST;
  165.       if (input[0] != defaultChar) {
  166.             switch (input[0])
  167.             {
  168.               case '1':
  169.                   UART_Transmit("melody 1 plays\n\r");
  170.                   Buzzer_Play(was_melody, was_delays, sizeof(was_melody) / sizeof(uint32_t));
  171.                   break;
  172.               case '2':
  173.                   UART_Transmit("melody 2 plays\n\r");
  174.                   Buzzer_Play(pirate_melody, pirate_delays, sizeof(pirate_melody) / sizeof(uint32_t));
  175.                   break;
  176.               case '3':
  177.                   UART_Transmit("melody 3 plays\n\r");
  178.                   Buzzer_Play(zelda_melody, zelda_delays, sizeof(zelda_melody) / sizeof(uint32_t));
  179.                   break;
  180.               case '4':
  181.                   UART_Transmit("melody 4 plays\n\r");
  182.                   Buzzer_Play(megalovania_melody, megalovania_delays, sizeof(megalovania_melody) / sizeof(uint32_t));
  183.                   break;
  184.               case '5':
  185.                   if (input_melody == NULL || input_delay == NULL || notes_count == 0) {
  186.                       UART_Transmit("user melody is empty\n\r");
  187.                       break;
  188.                   }
  189.                   UART_Transmit("user melody plays\n\r");
  190.                   Buzzer_Play(input_melody, input_delay, notes_count);
  191.                   break;
  192.               case '\r':
  193.                 START_SETTINGS:
  194.                 UART_Transmit("enter notes count\n\r");
  195.                 notes_count = 0;
  196.                 while(1) {
  197.                     input[0] = read_number();
  198.                     if (input[0] == '\r') {
  199.                         break;
  200.                     } else if (isdigit(input[0])) {
  201.                         notes_count = 10*notes_count + atoi((const char *)input);
  202.                     } else {
  203.                         UART_Transmit("\n\rinput error\n\r");
  204.                         goto START_SETTINGS;
  205.                     }
  206.                 }
  207.                 UART_Transmit("\n\rtype user notes\n\r");
  208.                 uint32_t current_note = 0;
  209.                 size_t i = 0;
  210.                 while(1) {
  211.                     input[0] = read_number();
  212.                     if (input[0] == '\r') {
  213.                         input_melody[i] = current_note;
  214.                         break;
  215.                     } else if (input[0] == ','){
  216.                         input_melody[i] = current_note;
  217.                         i++;
  218.                         current_note = 0;
  219.                     } else if (isdigit(input[0])) {
  220.                         current_note = 10*current_note + atoi((const char *)input);
  221.                     } else {
  222.                         UART_Transmit("\n\rinput error\n\r");
  223.                         goto START_SETTINGS;
  224.                     }
  225.                 }
  226.  
  227.                 UART_Transmit("\n\rtype user delays\n\r");
  228.                 uint32_t current_delay = 0;
  229.                 i = 0;
  230.                 while(1) {
  231.                     input[0] = read_number();
  232.                     if (input[0] == '\r') {
  233.                         input_delay[i] = current_delay;
  234.                         break;
  235.                     } else if (input[0] == ',') {
  236.                         input_delay[i] = current_delay;
  237.                         i++;
  238.                         current_delay = 0;
  239.                     } else if (isdigit(input[0])) {
  240.                         current_delay = 10*current_delay + atoi((const char *)input);
  241.                     } else {
  242.                         UART_Transmit("\n\rinput error\n\r");
  243.                         goto START_SETTINGS;
  244.                     }
  245.                 }
  246.                 UART_Transmit("\n\ruser melody recorded\n\r");
  247.                 break;
  248.               default: {
  249.                 UART_Transmit("\n\rinput error\n\r");
  250.                 break;
  251.               }
  252.             }
  253.       }
  254.     /* USER CODE END WHILE */
  255.  
  256.     /* USER CODE BEGIN 3 */
  257.   }
  258.   /* USER CODE END 3 */
  259. }
  260.  
  261. /**
  262.   * @brief System Clock Configuration
  263.   * @retval None
  264.   */
  265. void SystemClock_Config(void)
  266. {
  267.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  268.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  269.  
  270.   /** Configure the main internal regulator output voltage
  271.   */
  272.   __HAL_RCC_PWR_CLK_ENABLE();
  273.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
  274.  
  275.   /** Initializes the RCC Oscillators according to the specified parameters
  276.   * in the RCC_OscInitTypeDef structure.
  277.   */
  278.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  279.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  280.   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  281.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  282.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  283.   {
  284.     Error_Handler();
  285.   }
  286.  
  287.   /** Initializes the CPU, AHB and APB buses clocks
  288.   */
  289.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  290.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  291.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  292.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  293.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  294.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  295.  
  296.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  297.   {
  298.     Error_Handler();
  299.   }
  300. }
  301.  
  302. /* USER CODE BEGIN 4 */
  303. uint32_t last_pressing_time = 0;
  304.  
  305. char read_number() {
  306.   int key;
  307.   int oldKey;
  308.   int Row[4] = {ROW4, ROW3, ROW2, ROW1};
  309.   while (1) {
  310.     if (!HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_15)) {
  311.         is_test = !is_test;
  312.         HAL_Delay(300);
  313.         return 'x';
  314.     }
  315.     for (int i = 0; i < 4; ++i) {
  316.       oldKey = key;
  317.       key = Check_Row(Row[i]);
  318.       if (key == 0 || key == oldKey) continue;
  319.  
  320.       const uint32_t t = HAL_GetTick();
  321.       if (t - last_pressing_time < 200) continue;
  322.       last_pressing_time = t;
  323.       if (i == 0) {
  324.         switch (key) {
  325.           case 0x04:
  326.             // start
  327.             UART_Transmit( (uint8_t*) ", pressed\n\r" );
  328.             return ',';
  329.             break;
  330.           case 0x02:
  331.             // 0
  332. //            if (number/100000000 != 0) continue;
  333. //            number *= 10;
  334.             UART_Transmit( (uint8_t*)"0 pressed\n\r" );
  335.             break;
  336.           case 0x01:
  337.             // reset
  338. //            number = 0;
  339.             UART_Transmit( (uint8_t*)"enter pressed\n\r" );
  340.             return '\r';
  341.             break;
  342.         }
  343.       } else {
  344.         char huy[1];
  345.         int digit = 0;
  346.         digit = calc_digit(i, key);
  347.         itoa(digit, huy, 10);
  348.         UART_Transmit((uint8_t*) huy);
  349.         UART_Transmit(" pressed\n\r");
  350.         return huy[0];
  351.       }
  352.       while (1) {
  353.         if (Check_Row(Row[i]) == 0) break;
  354.       }
  355.     }
  356.     HAL_Delay(50);
  357.   }
  358. }
  359.  
  360.  
  361. int calc_digit(int row, int binary_key) {
  362.   int key;
  363.   if (binary_key == 0x01) key = 3;
  364.   if (binary_key == 0x02) key = 2;
  365.   if (binary_key == 0x04) key = 1;
  366.   return 3 * (3 - row) + key;
  367. }
  368. /* USER CODE END 4 */
  369.  
  370. /**
  371.   * @brief  This function is executed in case of error occurrence.
  372.   * @retval None
  373.   */
  374. void Error_Handler(void)
  375. {
  376.   /* USER CODE BEGIN Error_Handler_Debug */
  377.   /* User can add his own implementation to report the HAL error return state */
  378.  
  379.   /* USER CODE END Error_Handler_Debug */
  380. }
  381.  
  382. #ifdef  USE_FULL_ASSERT
  383. /**
  384.   * @brief  Reports the name of the source file and the source line number
  385.   *         where the assert_param error has occurred.
  386.   * @param  file: pointer to the source file name
  387.   * @param  line: assert_param error line source number
  388.   * @retval None
  389.   */
  390. void assert_failed(uint8_t *file, uint32_t line)
  391. {
  392.   /* USER CODE BEGIN 6 */
  393.   /* User can add his own implementation to report the file name and line number,
  394.      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  395.   /* USER CODE END 6 */
  396. }
  397. #endif /* USE_FULL_ASSERT */
  398.  
Advertisement
Add Comment
Please, Sign In to add comment