
오랜만에 OLED쪽을 건들였습니다. 그동안 할 일이 많았습니다. 심화실습평가도 있었고, 뭐 그랬습니다.
이번에 한 작업은 엄청난 것은 아니지만, 유지보수를 위해서 반드시 필요한 작업이라고 생각합니다.
ssd1309_driver.cpp와 ssd1309_driver.h 파일을 만든 뒤, 지난번에 만든 함수들을 넣어주려고 합니다.
ssd1309_driver.h의 내용을 보면서 함수가 어떻게 생겼는지 확인해봅시다.
class SSD1309Driver
{
public:
SSD1309Driver(int fd);
~SSD1309Driver();
void clearDisplay();
void fullDisplay();
private:
void initOLED();
void sendCommand(uint8_t cmd);
void sendData(uint8_t data);
int fd;
};
원래는 fd를 각 함수마다 넣어줬는데, 클래스로 분리하면서 그럴 필요가 없어졌습니다. 생성자에서 fd 값을 받아온 뒤, 계속 사용하면 되니까요. 고민중인 부분은 file descriptor를 생성자에서 생성한 뒤, 나중에 getter를 설정해서 필요하면 메인에서 값을 받아오게 할지, 지금처럼 fd는 바깥에서 생성하도록 할지 입니다. 아직까진 정해지지 않았습니다.
initOLED() 함수를 통해 그동안 쓰던 값 설정을 다 몰아주었습니다. 이제 외부에서 불러올 때나, 아니면 내부의 다른 함수들도 깔끔하게 설정할 수 있습니다.sendCommand()와 sendData()는 기존과 동일합니다.
init에서 설정한 세팅 값은 너무 길어서 접은글로 올려두겠습니다. 보고 싶은 분들은 확인해보셔도 좋을듯 합니다. 다만, 직접 데이터시트를 보고 하나하나 확인해보는 것도 매우 좋을 것 같네요ㅎㅎ 어디까지나 제가 작성한 것은 정답은 아니니까요!
void SSD1309Driver::initOLED()
{
// display off
sendCommand(0xAE);
// memory address mode 설정, Horizontal addressing mode
sendCommand(0x20);
sendCommand(0x02);
// GDDRAM page 시작 주소 설정 (page 0)
sendCommand(0xB0);
// 메모리 읽는 방향을 결정(위에서 아래로)
sendCommand(0xC0);
// 메모리 읽는 방향을 결정(좌에서 우로)
sendCommand(0xA0);
// column address의 하위 4비트를 0으로 설정
// column address의 상위 4비트를 0으로 설정
sendCommand(0x00);
sendCommand(0x10);
// display 시작 라인을 0으로 맞춤
sendCommand(0x40);
// Contrast 설정 최대로
sendCommand(0x81);
sendCommand(0xFF);
// 흰 색을 글씨로
sendCommand(0xA6);
// 64줄을 사용
sendCommand(0xA8);
sendCommand(0x3F);
// RAM을 기준으로 화면을 출력
sendCommand(0xA4);
// 얼마나 row를 밀어서 시작할지 결정: 0칸 밀어서 시작.
sendCommand(0xD3);
sendCommand(0x00);
// 화면 리프레시 속도 설정(기본 설정)
sendCommand(0xD5);
sendCommand(0x70);
// 픽셀 당 전기 충전 시간
sendCommand(0xD9);
sendCommand(0x22);
// COM Pin 모드
sendCommand(0xDA);
sendCommand(0x12);
// 전압 설정 (기본)
sendCommand(0xD8);
sendCommand(0x34);
// display on
sendCommand(0xAF);
}
이제 진짜로 값을 띄워보는 일을 해보고 싶네요... 게다가 최근에 커널에 모듈로 드라이버를 만들어서 붙이는 것을 배웠는데... 그것도 흥미로워 보였습니다. 지금 제가 만든 드라이버는 말은 드라이버지만 사실 라이브러리나 다름없거든요. 언젠간 커널까지 확장할 수 있으면 좋겠습니다.
| [우당탕탕 OLED 드라이버 만들기] 2. 데이터 시트 (0) | 2026.05.25 |
|---|---|
| [우당탕탕 OLED 드라이버 만들기] 1. 핀 세팅과 I2C 설정 (0) | 2026.05.15 |
| [우당탕탕 OLED 드라이버 만들기] 0. 라즈베리파이와 oled 패널 구입 (0) | 2026.05.15 |
댓글 영역