Today, we'll try to connect Keypad and LCD Pannel (Output) with MCU.
Hardwares:
STM32F103C8T6 (Blue Pill)
ST-Link USB
4x4 Keypad
LCD Pannel
Pin Diagram:
Header files given below. Download the files and place to the specific folder.
Guidelines (STM CUBE MX):
Set PB13, PB14, PB15 and PA8 to GPIO_Output
Set PA9 to GPIO_EXTI9
Set PA10 to GPIO_EXTI10
Set PA11 to GPIO_EXTI11
Set PA12 to GPIO_EXTI12
Click NVIC → EXTI line[9-5] interrupt → Enabled (Tick)
Click NVIC → EXTI line[10-15] interrupt → Enabled (Tick)
Click connectivity --> Click I2C1
For I2C select I2C
main.c edit:
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "liquidcrystal_i2c.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
GPIO_InitTypeDef GPIO_InitStructPrivate = {0};
uint32_t previousMillis = 0;
uint32_t currentMillis = 0;
uint8_t keyPressed = 0;
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, 1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, 1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
char snum[5];
while (1)
{
/* USER CODE END WHILE */
sprintf(snum,"%d",keyPressed);
HD44780_SetCursor(0,0);
HD44780_PrintStr("Input ASCII");
HD44780_SetCursor(10,1);
HD44780_PrintStr(snum);
HAL_Delay (3000);
HD44780_Clear();
HD44780_SetCursor(0,0);
HD44780_PrintStr("Taking New Value");
HAL_Delay (3000);
HD44780_Clear();
/* USER CODE BEGIN 3 */
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
currentMillis = HAL_GetTick();
if (currentMillis - previousMillis > 10) {
/*Configure GPIO pins : PB6 PB7 PB8 PB9 to GPIO_INPUT*/
GPIO_InitStructPrivate.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStructPrivate.Mode = GPIO_MODE_INPUT;
GPIO_InitStructPrivate.Pull = GPIO_NOPULL;
GPIO_InitStructPrivate.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructPrivate);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, 0);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, 0);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, 0);
if(GPIO_Pin == GPIO_PIN_9 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9))
{
keyPressed = 68; //ASCII value of D
}
else if(GPIO_Pin == GPIO_PIN_10 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_10))
{
keyPressed = 67; //ASCII value of C
}
else if(GPIO_Pin == GPIO_PIN_11 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11))
{
keyPressed = 66; //ASCII value of B
}
else if(GPIO_Pin == GPIO_PIN_12 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12))
{
keyPressed = 65; //ASCII value of A
}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, 0);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, 0);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, 0);
if(GPIO_Pin == GPIO_PIN_9 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9))
{
keyPressed = 35; //ASCII value of #
}
else if(GPIO_Pin == GPIO_PIN_10 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_10))
{
keyPressed = 57; //ASCII value of 9
}
else if(GPIO_Pin == GPIO_PIN_11 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11))
{
keyPressed = 54; //ASCII value of 6
}
else if(GPIO_Pin == GPIO_PIN_12 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12))
{
keyPressed = 51; //ASCII value of 3
}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, 0);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, 0);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, 1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, 0);
if(GPIO_Pin == GPIO_PIN_9 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9))
{
keyPressed = 48; //ASCII value of 0
}
else if(GPIO_Pin == GPIO_PIN_10 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_10))
{
keyPressed = 56; //ASCII value of 8
}
else if(GPIO_Pin == GPIO_PIN_11 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11))
{
keyPressed = 53; //ASCII value of 5
}
else if(GPIO_Pin == GPIO_PIN_12 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12))
{
keyPressed = 50; //ASCII value of 2
}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, 0);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, 0);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, 0);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, 1);
if(GPIO_Pin == GPIO_PIN_9 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9))
{
keyPressed = 42; //ASCII value of *
}
else if(GPIO_Pin == GPIO_PIN_10 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_10))
{
keyPressed = 55; //ASCII value of 7
}
else if(GPIO_Pin == GPIO_PIN_11 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11))
{
keyPressed = 52; //ASCII value of 4
}
else if(GPIO_Pin == GPIO_PIN_12 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12))
{
keyPressed = 49; //ASCII value of 1
}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, 1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, 1);
/*Configure GPIO pins : PB6 PB7 PB8 PB9 back to EXTI*/
GPIO_InitStructPrivate.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStructPrivate.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructPrivate);
previousMillis = currentMillis;
}
}
/* USER CODE END 4 */
Tutorial Link: