#include "main.h"
#include "stm32c0xx_hal.h"
#include "LiquidCrystal_I2C.h"
#include "Keypad.h"
// Button config
#define BUTTON_PIN GPIO_PIN_0
#define BUTTON_GPIO_PORT GPIOA
#define DEBOUNCE_DELAY 50
#define TRIPLE_PRESS_TIME 3000
// Global variables
I2C_HandleTypeDef hi2c1;
uint8_t buttonState = 0;
uint8_t lastButtonState = 0;
uint32_t lastDebounceTime = 0;
uint32_t firstPressTime = 0;
uint8_t pressCount = 0;
char inputBuffer[20] = {0};
uint8_t inputIndex = 0;
uint8_t displayOn = 1;
// Function declarations
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
void toggleDisplay(void);
void clearInputBuffer(void);
void updateLCD(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
Keypad_Init(); // <-- Your Keypad driver must have this function
LCD_Init(&hi2c1); // Custom LCD driver (I2C-based)
LCD_Clear(&hi2c1);
LCD_Backlight(&hi2c1, 1); // Turn on backlight
while (1)
{
char key = Keypad_GetKey();
if (key != 0)
{
if (inputIndex < 20)
{
inputBuffer[inputIndex++] = key;
}
else
{
// Shift buffer for rolling display
for (int i = 0; i < 19; i++)
{
inputBuffer[i] = inputBuffer[i + 1];
}
inputBuffer[19] = key;
}
if (displayOn)
{
updateLCD();
}
}
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == BUTTON_PIN)
{
uint32_t currentTime = HAL_GetTick();
if ((currentTime - lastDebounceTime) > DEBOUNCE_DELAY)
{
if ((currentTime - firstPressTime) <= TRIPLE_PRESS_TIME)
{
pressCount++;
}
else
{
pressCount = 1;
firstPressTime = currentTime;
}
if (pressCount == 3)
{
pressCount = 0;
clearInputBuffer();
LCD_Clear(&hi2c1);
}
else
{
toggleDisplay();
}
lastDebounceTime = currentTime;
}
}
}
void toggleDisplay(void)
{
displayOn = !displayOn;
if (displayOn)
{
LCD_Backlight(&hi2c1, 1);
updateLCD();
}
else
{
LCD_Backlight(&hi2c1, 0);
}
}
void clearInputBuffer(void)
{
for (int i = 0; i < 20; i++)
{
inputBuffer[i] = 0;
}
inputIndex = 0;
}
void updateLCD(void)
{
LCD_Clear(&hi2c1);
for (int i = 0; i < inputIndex && i < 16; i++)
{
LCD_SetCursor(&hi2c1, 0, i);
LCD_WriteChar(&hi2c1, inputBuffer[i]);
}
if (inputIndex > 16)
{
LCD_SetCursor(&hi2c1, 1, 0);
for (int i = 16; i < inputIndex && i < 32; i++)
{
LCD_WriteChar(&hi2c1, inputBuffer[i]);
}
}
}