I2C (Inter-Integrated Circuit)는 2개의 선을 이용하여 하나의 마스터 기와 여러 슬레이브 기기들이 통신하는 방식으로 동기식 통신 방식이다
아이 투 씨 또는 아이 스퀘어 씨 이렇게 부른다
선은 SDA (Serial Data), SCL (Serial Clock) 이렇게 두 개가 있고, 각각 데이터를 주고 받기 위한 선, 타이밍을 동기화 하기 위한 클럭 선이다


사용할 LCD는 위처럼 생겼다
오른쪽 끝을보면 핀이 4개가 있는데, 위에서부터 GND, VCC, SDA ,SCL 핀이다
ioc에서 개발보드의 I2C를 활성화하자

표시한 부분을 I2C로 바꿔주면 된다
그러면 오른쪽 Pinout view에서 PB9번 핀이 I2C1_SDA 이름으로 활성화되는데

옆에 있는 PB8번 핀도 I2C1_SCL로 활성화해주자
당연히 저장하고 코드 생성
// i2c_lcd.h
/*
* i2c_lcd.h
*
* Created on: 2019. 9. 4.
* Author: k
*/
#ifndef INC_I2C_LCD_H_
#define INC_I2C_LCD_H_
#define I2C_LCD_ADDRESS (0x27<<1)
#define BACKLIGHT_ON 0x08
/* LCD command */
#define DISPLAY_ON 0x0C
#define DISPLAY_OFF 0x08
#define CLEAR_DISPLAY 0x01 //Delay 2msec
#define RETURN_HOME 0x02
void lcd_command(uint8_t command);
void lcd_data(uint8_t data);
void i2c_lcd_init(void);
void lcd_string(uint8_t *str);
void move_cursor(uint8_t row, uint8_t column);
#endif /* INC_I2C_LCD_H_ */
i2c_lcd.h 파일을 생성 후 위 코드를 옮겨 적고
// i2c_lcd.c
/*
* i2c_lcd.c
*
* Created on: 2019. 9. 4.
* Author: k
*/
#include "main.h"
#include "i2c_lcd.h" // < >
#include "stm32f4xx_hal.h"
#include <string.h>
#include <stdio.h>
extern I2C_HandleTypeDef hi2c1;
extern UART_HandleTypeDef huart3;
void i2c_lcd_main(void);
void i2c_lcd_main(void)
{
uint8_t value=0;
i2c_lcd_init();
while(1)
{
move_cursor(0,0);
lcd_string("Hello World!!!");
move_cursor(1,0);
lcd_data(value + '0');
value++;
if(value>9)value=0;
HAL_Delay(500);
}
}
void lcd_command(uint8_t command)
{
uint8_t high_nibble, low_nibble;
uint8_t i2c_buffer[4];
high_nibble = command & 0xf0;
low_nibble = (command<<4) & 0xf0;
i2c_buffer[0] = high_nibble | 0x04 | 0x08; //en=1, rs=0, rw=0, backlight=1
i2c_buffer[1] = high_nibble | 0x00 | 0x08; //en=0, rs=0, rw=0, backlight=1
i2c_buffer[2] = low_nibble | 0x04 | 0x08; //en=1, rs=0, rw=0, backlight=1
i2c_buffer[3] = low_nibble | 0x00 | 0x08; //en=0, rs=0, rw=0, backlight=1
while(HAL_I2C_Master_Transmit(&hi2c1, I2C_LCD_ADDRESS,
i2c_buffer, 4, 100)!=HAL_OK){
//HAL_Delay(1);
}
return;
}
// 1 byte write
void lcd_data(uint8_t data)
{
uint8_t high_nibble, low_nibble;
uint8_t i2c_buffer[4];
high_nibble = data & 0xf0;
low_nibble = (data<<4) & 0xf0;
i2c_buffer[0] = high_nibble | 0x05 | 0x08; //en=1, rs=1, rw=0, backlight=1
i2c_buffer[1] = high_nibble | 0x01 | 0x08; //en=0, rs=1, rw=0, backlight=1
i2c_buffer[2] = low_nibble | 0x05 | 0x08; //en=1, rs=1, rw=0, backlight=1
i2c_buffer[3] = low_nibble | 0x01 | 0x08; //en=0, rs=1, rw=0, backlight=1
while(HAL_I2C_Master_Transmit(&hi2c1, I2C_LCD_ADDRESS,
i2c_buffer, 4, 100)!=HAL_OK){
//HAL_Delay(1);
}
return;
}
// lcd 초기화
void i2c_lcd_init(void)
{
lcd_command(0x33);
lcd_command(0x32);
lcd_command(0x28); //Function Set 4-bit mode
lcd_command(DISPLAY_ON);
lcd_command(0x06); //Entry mode set
lcd_command(CLEAR_DISPLAY);
HAL_Delay(2);
}
// null을 만날때 까지 string을 LCD에 출력
void lcd_string(uint8_t *str)
{
while(*str)
{
lcd_data(*str++);
}
}
// 해당 줄,col으로 이동 하는 함수
void move_cursor(uint8_t row, uint8_t column)
{
lcd_command(0x80 | row<<6 | column);
return;
}
i2c_lcd.c 파일을 생성해 위 코드를 옮겨 적는다
이제 i2c_lcd.c 파일의 코드들을 이용해 LCD에 온 습도 정보와 거리 정보를 출력해보자


먼저 i2c_lcd.c의 i2c_lcd_init()을 main.c에 extern하고 main()에서 호출한다

lcd_string(), move_cursor() 이 개의 함수를 dht11.c과 ultrasonic.c에 extern 하자

dht11.c에는 위와 같이 코드를 추가해준다
그러면 lcd_buff에 온 습도 정보를 담고 첫 번째 줄에 버퍼의 내용을 출력한다

ultrasonic.c도 위와 같이 작성하면 얘는 두번째 줄에 버퍼의 내용을 출력한다

마지막으로 main.c의 while문 안에서 두 함수를 호출해주면 끝
'임베디드 > STM32 (ARM Cortex - M4)' 카테고리의 다른 글
| [STM32] RTC (1) | 2023.10.22 |
|---|---|
| [STM32] PWM DCMotor 제어 (0) | 2023.10.22 |
| [STM32] 초음파 측정기 (1) | 2023.10.21 |
| [STM32] DHT11 온 습도 측정기 (0) | 2023.10.21 |
| [STM32] 타이머 (1) | 2023.10.21 |