๐งฟ ์ค์ต ๋ชฉํ
1. F429zi์ HD44780 ์ฐ๊ฒฐ
2. i2c_HD44780.h, i2c_HD44780.c, app.c ํ์ผ ์์ฑ
3. LCD ๋ฌธ์์ด ์ถ๋ ฅ ํ์ธ
๐งฟ I2C ์ค์
๐งฟ ์ค์ต ๊ฒฐ๊ณผ
https://github.com/Tobbyvv/stm32-project/tree/main/lcd_I2c
F429zi์ HD44780 ์ฐ๊ฒฐ
I2C ๋ชจ๋์ VCC, ๋ฐฑ๋ผ์ดํธ, GND๋ฅผ CN8 ์ปค๋ฅํฐ์ 5V์ GND์ ์ฐ๊ฒฐ
I2C ๋ชจ๋์ SCL๊ณผ SDA๋ฅผ CN7 ์ปค๋ฅํฐ์ PB8, PB9ํ๊ณผ ์ฐ๊ฒฐ
i2c_HD44780.h, i2c_HD44780.c, app.c ํ์ผ ์์ฑ
2.1 i2c_HD44780.h
#ifndef __I2C_HD44780__H__
#define __I2C_HD44780__H__
#ifdef __cplusplus
extern "C" {
#endif
void lcd_init (void); // LCD๋ฅผ ์ด๊ธฐํ
//void lcd_send_cmd (char cmd); // LCD์ ๋ช
๋ น์ ์ ์ก
//void lcd_send_data (char data); // LCD์ ๋ฐ์ดํฐ ์ ์ก
void lcd_disp_on(void); // LCD ๋์คํ๋ ์ด ํ์ฑํ
void lcd_disp_off(void); // LCD ๋์คํ๋ ์ด ๋นํ์ฑํ
void lcd_home(void); // ์ปค์๋ฅผ ํ ์์น๋ก ์ด๋
void lcd_clear_display(void); // LCD ๋์คํ๋ ์ด ํด๋ฆฌ์ด
void lcd_locate(uint8_t row, uint8_t column); // ์ปค์๋ฅผ ์ง์ ํ ํ๊ณผ ์ด๋ก ์ด๋
void lcd_printchar(unsigned char ascode); // ๋ฌธ์๋ฅผ LCD์ ์ถ๋ ฅ
void lcd_print_string (char *str); // ๋ฌธ์์ด์ LCD์ ์ถ๋ ฅ
void lcd_printf(const char *fmt, ...); // ์์์ ์ง์ ํ์ฌ LCD์ ์ถ๋ ฅ
#ifdef __cplusplus
}
#endif
#endif
2.2 i2c_HD44780.c
#include "main.h"
#include "stm32f4xx_hal.h"
#include "i2c_HD44780.h"
#include <stdarg.h>
#include <stdio.h>
extern I2C_HandleTypeDef hi2c1;
#define SLAVE_ADDRESS_LCD (0x27<<1) //I2C ์ฃผ์๋ฅผ ์ง์ F429zi์ ๊ฒฝ์ฐ 0x27
/**
* @brief HD44780 LCD ๋ชจ๋์ ๋ช
๋ น์ I2C๋ฅผ ํตํด ์ ์ก
* @param cmd: ์ ์กํ ๋ช
๋ น์ด(์ต๋ 8๋นํธ๊น์ง ์ ์ก ๊ฐ๋ฅ)
* @retval None
*/
static void lcd_send_cmd(char cmd)
{
char data_u, data_l; // ๋ช
๋ น์ด๋ฅผ ์์ 4๋นํธ์ ํ์ 4๋นํธ๋ก ๋ถ๋ฆฌํ๊ธฐ ์ํ ๋ณ์ ์ ์ธ
uint8_t data_t[4]; // I2C๋ฅผ ํตํด ์ ์กํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด ์ ์ธ
data_u = (cmd & 0xf0); // ๋ช
๋ น์ ์์ 4๋นํธ ์ถ์ถ
data_l = ((cmd << 4) & 0xf0); // ๋ช
๋ น์ ํ์ 4๋นํธ๋ฅผ ์์ 4๋นํธ๋ก ์ด๋ํ์ฌ ์ถ์ถ
data_t[0] = data_u | 0x0C; //en=1, rs=0 -> en, rs ๋นํธ ์ถ๊ฐ, ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ ๋ช
๋ น ์ฒ๋ฆฌ ์ํ
data_t[1] = data_u | 0x08; //en=0, rs=0 -> enm rs ๋นํธ ์ถ๊ฐ, ๋๊ธฐ ์ํ
data_t[2] = data_l | 0x0C; //en=1, rs=0
data_t[3] = data_l | 0x08; //en=0, rs=0
/*
๋ช
๋ น์ด๋ฅผ ์์ ํ์๋ก ๊ตฌ๋ถํ์ฌ 4๋นํธ๋ก ๋๋ ์ด์ ๋ ๋ฐ์ดํฐ์ en, rs ๊ฐ์ ์ถ๊ฐํด 8๋นํธ๋ก ๋ง๋ค๊ณ
4๋นํธ ๋จ์๋ก LCD ๋ชจ๋์ ์ ๋ฌํด์ผ ํ๋ 4๋นํธ๋ก 2๋ฒ ๋๋ ์ ์ ๋ฌํ๋ ๋ฐฉ์์ด ํจ์จ์ ์ด๊ธฐ ๋๋ฌธ
*/
while (HAL_I2C_Master_Transmit(&hi2c1, SLAVE_ADDRESS_LCD, (uint8_t *)data_t, 4, 100) != HAL_OK)
{
// I2C๋ก ๋ฐ์ดํฐ๋ฅผ LCD ๋ชจ๋์ ์ ์กํ๊ณ , ์ฑ๊ณตํ ๋๊น์ง ๋๊ธฐ
// Timeout ์ค๋ฅ ๋ฐ์ ์ Error_Handler() ํธ์ถ
if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
{
Error_Handler();
}}}
/**
* @brief HD44780 LCD ๋ชจ๋์ ๋ฐ์ดํฐ๋ฅผ I2C๋ฅผ ํตํด ์ ์ก
* @param data: ์ ์กํ ๋ฐ์ดํฐ
* @retval None
*/
static void lcd_send_data(char data)
{
char data_u, data_l;
uint8_t data_t[4];
data_u = (data & 0xf0);
data_l = ((data << 4) & 0xf0);
data_t[0] = data_u | 0x0D; //en=1, rs=0
data_t[1] = data_u | 0x09; //en=0, rs=0
data_t[2] = data_l | 0x0D; //en=1, rs=0
data_t[3] = data_l | 0x09; //en=0, rs=0
while (HAL_I2C_Master_Transmit(&hi2c1, SLAVE_ADDRESS_LCD, (uint8_t *)data_t, 4, 100) != HAL_OK)
{
// Timeout ์ค๋ฅ ๋ฐ์ ์ Error_Handler() ํจ์๋ฅผ ํธ์ถ
if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
{
Error_Handler();
}}}
/**
* @brief 4-bit ๋ชจ๋์์ HD44780 LCD ๋ชจ๋ ์ด๊ธฐํ
* @param None
* @retval None
*/
void lcd_init(void)
{
lcd_send_cmd(0x33); // ํ์ฅ ๋ช
๋ น ๋ชจ๋ ์ค์
lcd_send_cmd(0x32); // 4๋นํธ ๋ชจ๋ ์ค์
lcd_send_cmd(0x28); // 4-bit ๋ชจ๋, 2์ค ๋์คํ๋ ์ด, 5x8 ํฐํธ ์ค์
lcd_send_cmd(0x0C); // ๋์คํ๋ ์ด ์ผ๊ธฐ, ์ปค์ ๋นํ์ฑํ, ์ปค์ ๊น๋นก์ ๋นํ์ฑํ
lcd_send_cmd(0x06); // ์ปค์ ์ด๋ ๋ฐฉํฅ ์ค์ (์ปค์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋, ํ๋ฉด ์ด๋)
lcd_send_cmd(0x02); // ๋์คํ๋ ์ด clear
// LCD ๋ชจ๋์ ๊ตฌ๋ํ๊ธฐ ์ ์ ํ์ํ ์ต์ํ์ ์ง์ฐ ์๊ฐ ์ค์
HAL_Delay(200);
}
/**
* @brief ๋์คํ๋ ์ด ํ์ฑํ
* @param None
* @retval None
*/
void lcd_disp_on(void)
{
lcd_send_cmd(0x0C);
}
/**
* @brief ๋์คํ๋ ์ด ๋นํ์ฑํ
* @param None
* @retval None
*/
void lcd_disp_off(void)
{
lcd_send_cmd(0x08);
}
/**
* @brief ์ปค์๋ฅผ ํ ์์น๋ก ์ด๋
* @param None
* @retval None
*/
void lcd_home(void)
{
lcd_send_cmd(0x02);
HAL_Delay(2);
}
/**
* @brief LCD ๋ชจ๋ ๋์คํ๋ ์ด clear
* @param None
* @retval None
*/
void lcd_clear_display(void)
{
lcd_send_cmd(0x01);
HAL_Delay(2);
}
/**
* @brief ํน์ ์์น๋ก ์ปค์ ์ด๋
* @param row: ์ด๋ํ ํ (1์์ 4๊น์ง)
* @param column: ์ด๋ํ ์ด (1์์ 20๊น์ง, 4x20 ๋ฌธ์ ๋์คํ๋ ์ด ๊ธฐ์ค)
* @retval None
*/
void lcd_locate(uint8_t row, uint8_t column)
{
column--;
switch (row)
{
case 1:
// 1ํ ์ฃผ์๋ก ์ปค์๋ฅผ ์ค์ ํ๊ณ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐ
lcd_send_cmd(0x80);
break;
case 2:
// 2ํ ์ฃผ์๋ก ์ปค์๋ฅผ ์ค์ ํ๊ณ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐ
lcd_send_cmd(0xc0);
break;
case 3:
// 3ํ ์ฃผ์๋ก ์ปค์๋ฅผ ์ค์ ํ๊ณ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐ
lcd_send_cmd(column |= 0x94);
break;
case 4:
// 4ํ ์ฃผ์๋ก ์ปค์๋ฅผ ์ค์ ํ๊ณ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐ
lcd_send_cmd(column |= 0xd4);
break;
default:
break;
}}
/**
* @brief LCD ๋ชจ๋์ ๋ฌธ์ ์ถ๋ ฅ
* @param ์ถ๋ ฅํ ๋ฌธ์์ ASCII ๊ฐ
* @retval None
*/
void lcd_printchar(unsigned char ascode)
{
lcd_send_data(ascode);
}
/**
* @brief ๋ฌธ์์ด์ LCD ๋ชจ๋์ ํ์
* @param ํ์ํ ํ
์คํธ
* @retval None
*/
void lcd_print_string(char *str)
{
while (*str)
lcd_send_data(*str++); // ๋ฌธ์์ด์ ๊ฐ ๋ฌธ์๋ฅผ LCD ๋ชจ๋์ ์ ์กํ์ฌ ํ์
}
/**
* @brief ํ์ ์ง์ ๋ ๋ฌธ์์ด์ LCD์ ์ถ๋ ฅํ๋ ํจ์
* @param ํ์ค ์ ์ ํ์ ์ง์ ๋ฌธ์์ด
* @param ๊ฐ๋ณ ์ธ์ ๋ชฉ๋ก
* @retval None
*/
void lcd_printf(const char *fmt, ...)
{
uint32_t i;
uint32_t text_size, letter;
static char text_buffer[32];
va_list args;
va_start(args, fmt);
text_size = vsprintf(text_buffer, fmt, args); // ํ์ ์ง์ ๋ฌธ์์ด์ ํ
์คํธ ๋ฒํผ์ ํฌ๋งท
// ๋ฌธ์์ด ์ฒ๋ฆฌ
for (i = 0; i < text_size; i++)
{
letter = text_buffer[i];
if (letter == 10) // ๊ฐํ ๋ฌธ์์ธ ๊ฒฝ์ฐ ์ฒ๋ฆฌ ์ค๋จ
break;
else
{
if ((letter > 0x1F) && (letter < 0x80)) // ์ธ์ ๊ฐ๋ฅํ ASCII ๋ฌธ์ ๋ฒ์์ธ ๊ฒฝ์ฐ ์ถ๋ ฅ
lcd_printchar(letter);
}}}
2.3 app.c
#include "main.h"
#include "app.h"
#include "stm32f4xx_hal.h"
#include "cmsis_os2.h"
#include "i2c_hd44780.h"
#include <stdio.h>
extern UART_HandleTypeDef huart3;
void app_main(void)
{
lcd_init(); // LCD ์ด๊ธฐํ
lcd_disp_on(); //ํ๋ฉด ํ์ ํ์ฑํ
lcd_clear_display(); //ํ๋ฉด ์ด๊ธฐํ
lcd_home(); //์ปค์ ์ด๋
lcd_print_string("Hello22"); //๋ฌธ์์ด LCD์ ์ถ๋ ฅ
}
int fputc(int ch, FILE *f)
{
// UART๋ก ๋ฌธ์ ์ถ๋ ฅ
HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 100);
return ch;
}
void app(void)
{
app_main();
while (1);
}
LCD ๋ฌธ์์ด ์ถ๋ ฅ ํ์ธ
'embedded' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[stm32] RTOS ์ค์ต (0) | 2023.09.18 |
---|---|
[stm32] RTOS ์ด๋ก ์ ๋ฆฌ (0) | 2023.09.11 |
[stm32] I2C ํต์ ์ด๋ก ์ ๋ฆฌ (0) | 2023.09.11 |
[stm32] ADC & DMA ์ค์ต (0) | 2023.09.06 |
[stm32] ADC & DMA ์ด๋ก ์ ๋ฆฌ (0) | 2023.09.06 |