아트메가/ATMEGA32U4 Breakout

ATMEGA32U4 breakout-보드 사용하기 6편(SSD1306)

원원 2024. 4. 14. 08:43

안녕하세요. 오늘은 기존의 프로젝트에서 SSD1306를 사용해보겠습니다.
SSD1306은 다양한 통신인터페이스를 지원하는데 이 글에서는 I2C를 이용하겠습니다.
(참고한 소스코드 : https://github.com/elo1957/OLED-ssd1306-atmega/tree/master)

SSD1306은 128x64 Dot matrix panel입니다. 이 글에서는 가로 8bit 세로8bit를 이용해서 한글자를 만들것이므로 한줄당 글자는 최대 16글자, 줄은 8줄이 됩니다. 기본적인 SSD1306 동작하는방식을 알아보겠습니다.

I2C Write통신 데이터포맷입니다. slave  address - control byte - data byte 포맷으로 보내면 됩니다. SSD1306은 read는 사용하지않습니다.

 

GDDRAM(Graphic Display Data RAM)
디스플레이할때 표시되는 데이터가 저장되는 메모리입니다. 사이즈는 128x64bit입니다. RAM은 8개의 Page로 나뉘어있습니다.  8개의 Row가 1개의 Page가 됩니다. 


3개의 Memory Addressing Mode가 있습니다. (0x20) 데이터를 표시할때 자동적으로 다음줄에 표시하는지, 한줄에 계속 표시하는지 설정하는 모드입니다.
1) Page addressing mode(0x10) : Column address를 1씩 증가시키고 Column address가 end address에 도달하면 start address로 reset됩니다.

처음에 wowonwowonwowon 가 적혀있었고 12345데이터를 계속 write해도 첫번째줄에 글자가 표시됩니다.

Page addressing mode에서 다른줄에 글자를 표시하는 방법이 있습니다.
page 번호 설정은 0xb0~0xb7 (8개)로 하고 column은 low start colum address 0~0x0f와 upper start column address  0x10~0x1f를 이용합니다.
page번호 설정은 1바이트를 사용하므로 이해가기가 쉽습니다. 0xb0이면 PAGE0, 0xb1이면 PAGE1... 입니다
column 주소는 아래처럼 구성되어있습니다. 0x1000주소가 상위 맨왼쪽 부분입니다. 그래서 주소설정을하고나서 데이터를 write해주면 됩니다. 

page번호는 0xb0, column 주소는 0x1000~0x100f로 설정하고 0xff를 write했습니다.

결론적으로 가로를 8bit를 사용할것이므로 주소는 아래처럼 설정해주면 됩니다.

코드는 아래처럼 작성하면 됩니다.

void setXY(unsigned char row,unsigned char col)
{
    ssd1306_command(0xb0+row);                //set page address
    ssd1306_command(0x00+(8*col&0x0f));       //set low col address
    ssd1306_command(0x10+((8*col>>4)&0x0f));  //set high col address
}




2) horizontal addressing mode(0x00) :  Column address를 1씩 증가시키고 Column address가 end address에 도달하면 start address로 reset되고 page address를 1증가시킵니다.


3) Vertical address mode(0x01) : page address를 1씩 증가시키고 page address가 end address에 도달하면 page address는 reset되고 column을 1증가시킵니다


글자쓰는 방식(Page addressing mode 방식을 사용합니다)
A를 표현할경우 아래와같은 방식으로 데이터를 쓰면 됩니다.

void SendChar(unsigned char data)
{
    i2c_write2(_i2c_address, 0x40, data);
}

위의 내용까지가 글자를 표시할때 알아야하는 내용이고 다른 SSD1306 세팅들은 코드와 데이터시트를보면 될것같습니다

코드에는 cli를 이용해서 테스트하는 기능들을 넣어놨습니다


소스코드(Commits: ADD SD1306)
https://github.com/yhunterr/ATMEGA32u4/commits/main/