#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define PLUS_GPIO_PORT GPIOB
#define PLUS_GPIO_PIN GPIO_PIN_10
#define MINUS_GPIO_PORT GPIOB
#define MINUS_GPIO_PIN GPIO_PIN_3
LiquidCrystal_I2C lcd(0x27, 20, 4);
int counter = 0;
int plus_counter = 0;
int minus_counter = 0;
void setup()
{
lcd.init();
lcd.backlight();
// Включаем тактирование порта B (если ещё не включено ядром)
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// Кнопка + — вход с подтяжкой вверх
GPIO_InitStruct.Pin = PLUS_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(PLUS_GPIO_PORT, &GPIO_InitStruct);
// Кнопка - — вход с подтяжкой вверх
GPIO_InitStruct.Pin = MINUS_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(MINUS_GPIO_PORT, &GPIO_InitStruct);
// Начальное сообщение
lcd.setCursor(0, 0);
lcd.print("Total count: ");
lcd.print(counter);
lcd.setCursor(0, 1);
lcd.print("Total + count: ");
lcd.print(plus_counter);
lcd.setCursor(0, 2);
lcd.print("Total - count: ");
lcd.print(minus_counter);
lcd.setCursor(0, 3);
lcd.print("Frequency: ");
lcd.print(counter);
lcd.print(" Hz");
// Можно сразу выключить светодиод (если используете)
digitalWrite(PB8, HIGH);
}
void loop()
{
static uint32_t last_plus = 0;
static uint32_t last_minus = 0;
if (counter >0){
tone(PB8, counter);
}
else{
noTone(PB8);
digitalWrite(PB8, HIGH);
}
uint32_t now = millis();
// ─── Кнопка + ─────────────────────────────────────────────────────
if (HAL_GPIO_ReadPin(PLUS_GPIO_PORT, PLUS_GPIO_PIN) == GPIO_PIN_RESET)
{
if (now - last_plus >= 200) // дебаунс 200 мс
{
counter++;
plus_counter ++;
last_plus = now;
update_display();
return;
}
}
// ─── Кнопка - ─────────────────────────────────────────────────────
if (HAL_GPIO_ReadPin(MINUS_GPIO_PORT, MINUS_GPIO_PIN) == GPIO_PIN_RESET)
{
if (now - last_minus >= 200)
{
counter--;
minus_counter ++;
last_minus = now;
update_display();
return;
}
}
}
void update_display()
{
lcd.setCursor(13, 0);
lcd.print(" ");
lcd.setCursor(13, 0);
lcd.print(counter);
lcd.setCursor(15, 1);
lcd.print(" ");
lcd.setCursor(15, 1);
lcd.print(plus_counter);
lcd.setCursor(15, 2);
lcd.print(" ");
lcd.setCursor(15, 2);
lcd.print(minus_counter);
lcd.setCursor(11, 3);
lcd.print(" ");
lcd.setCursor(11, 3);
lcd.print(counter);
lcd.print(" Hz");
}