#include "main.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void LCD_SendCommand(uint8_t cmd);
void LCD_SendData(uint8_t data);
void LCD_SendString(char *str);
void LCD_Clear(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
HAL_Delay(50);
// 4-bit moda geçiş
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, RESET); // RS=0
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, RESET); // RW=0
GPIOA->ODR = (GPIOA->ODR & 0x0F) | 0x20;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, RESET);
HAL_Delay(5);
// LCD init komutları
LCD_SendCommand(0x28); // 4-bit mod, 2 satır, 5x8
LCD_SendCommand(0x0C); // Display ON, cursor OFF
LCD_SendCommand(0x06); // Entry mode: sola kaydır
LCD_SendCommand(0x01); // Ekranı temizle
HAL_Delay(2);
while (1)
{
uint8_t btn1 = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8);
uint8_t btn2 = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
uint8_t btn3 = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_10);
if (btn1 == GPIO_PIN_SET)
{
LCD_Clear();
LCD_SendString("Soru 1: 2x2?");
HAL_Delay(300);
while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == GPIO_PIN_SET);
}
else if (btn2 == GPIO_PIN_SET)
{
LCD_Clear();
LCD_SendString("Soru 2: 5x3?");
HAL_Delay(300);
while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9) == GPIO_PIN_SET);
}
else if (btn3 == GPIO_PIN_SET)
{
LCD_Clear();
LCD_SendString("Soru 3: 10/2?");
HAL_Delay(300);
while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_10) == GPIO_PIN_SET);
}
}
}
void LCD_SendCommand(uint8_t cmd)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, RESET); // RS=0
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, RESET); // RW=0
// HIGH nibble
GPIOA->ODR = (GPIOA->ODR & 0x0F) | (cmd & 0xF0);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, RESET);
HAL_Delay(1);
// LOW nibble
GPIOA->ODR = (GPIOA->ODR & 0x0F) | ((cmd << 4) & 0xF0);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, RESET);
HAL_Delay(1);
}
void LCD_SendData(uint8_t data)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, SET); // RS=1
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, RESET); // RW=0
// HIGH nibble
GPIOA->ODR = (GPIOA->ODR & 0x0F) | (data & 0xF0);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, RESET);
HAL_Delay(1);
// LOW nibble
GPIOA->ODR = (GPIOA->ODR & 0x0F) | ((data << 4) & 0xF0);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, RESET);
HAL_Delay(1);
}
void LCD_SendString(char *str)
{
while (*str)
LCD_SendData(*str++);
}
void LCD_Clear(void)
{
LCD_SendCommand(0x01);
HAL_Delay(2);
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) Error_Handler();
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) Error_Handler();
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
// LCD output pinleri (PA0-PA7)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// Buton pinleri (PA8-PA10) - INPUT PULLDOWN
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void Error_Handler(void)
{
__disable_irq();
while (1) {}
}