티스토리 뷰
이전 글에서 MCU와 OLED 모듈간의 SPI 통신이 제대로 수행되는지 확인하는 방법에 대해서 설명하였다. 확인하는 방법으로 Entire Display ON 레지스터의 값을 1로 설정하여 전 영역의 픽셀들이 모두 켜보는것이었다.
기본적인 통신이 잘 되는지 확인하였으면 정상적인 화면 출력을 위하여 Entire Display ON 레지스터의 값을 0으로 만들어 어떻게 화면 출력이 이루어지는지 확인해 보도록 하겠다.
8번 줄에 보이는것처럼 ssd1306_entire_on()의 인자를 false로 넣어준다음 프로그램을 실행 시켜 결과를 확인해 본다.
실행하여 화면을 보면 위의 그림처럼 랜덤한 분포로 점들이 찍혀지는것을 확인할 수 있게 된다. 초기화 되어 있지 않은 GDDRAM에 들어 있는 값들이 화면에 그대로 출력되기 때문이다.
그럼 GDDRAM이 어떻게 생겼고 GDDRAM에는 어떤 방법으로 쓸수 있는지 알아보도록 하자.
위의 그림이 GDDRAM의 구조이다. 가로로 SEG0 ~ SEG127이 있고, 세로로 COM0 ~ COM63까지 있다. 따라서 가로 128개, 세로 64개의 점들이 있게 되는 것이다.
세로 방향은 다시 PAGE0 ~ PAGE7까지 8개 영역으로 나누어 지게 되는데 PAGE 구조는 아래 그림과 같다.
각 PAGE는 여덟개의 COM 픽셀들에 해당되는 비트값이 있게 된다.
가로 방향으로는 SEG값을 이용하여 특정 픽셀의 위치를 지정하게 되고, 세로 방향으로는 PAGE를 선택하여 8개의 비트값중에 하나를 선택하는 방식으로 이루어 진다.
위에 보이는 그림8-13에서 초록색으로 보이는 부분은 re-mapping 방법을 이용할 경우 PAGE와 SEG의 위치를 변경할 수 있음을 보여 주는것이다. 둘다 re-mapping 할 경우 180도 회전하는 효과를 보여주게 된다.
ssd1306_data()을 이용하여 GDDRAM에 데이터를 쓸수 있게 된다. 5번줄을 보면 D/C 신호를 high로 만든것을 볼 수 있다.
display_test_pattern() 함수를 이용하여 GDDRAM 전 영역에 대해서 1씩 증가되는 데이터를 쓰고 난 후 결과를 확인해 본다.
원래 의도는 전 영역에 대한 패턴값을 보이는 것이었는데, 실제 출력되는 결과는 PAGE0에 대해서 overwrite 되는 것처럼 보인다. 왜 이런 결과가 나오게 되는지 datasheet를 분석해 볼 필요가 있다.
SSD1306에 Set Memory Addressing Mode 레지스터라는 것이 있다. 위의 그림을 보면 알겠지만, 모드 설정을 위하여 0x20을 쓴 다음 하위 2비트값으로 mode를 선택할 수 있는데, 값이 00이면 Horizontal Addressing mode이고, 01이면 Vertical Addressing mode가 된다. 그리고, 10값으로 설정되면 Page Addressing mode가 되는데 초기값으로 10으로 설정되기 때문에 리셋이 되면 자동으로 Page Addressing mode로 설정되게 된다.
위의 그림이 page addressing mode에 대한 설명을 보여준다. GDDRAM에 데이터를 쓰면 자동적으로 column 주소가 증가하게 된다. 만약 column주소가 COL127에 도달한 상황에서 RAM에 데이터를 쓰게 되면 column주소가 COL0으로 가게 된다. 하지만 PAGE 번호는 변화가 없다. 따라서 위의 그림에 보이는 초록색 화살표처럼 PAGE 번호를 강제로 변경하지 않는 한 같은 Page안에서 계속 데이터가 쓰여지게 되는 것이다. 실행된 결과가 PAGE0에만 보여지게 되는 이유를 알게 된것이다. 다른 PAGE에 데이터를 써 주려면 PAGE 번호를 직접 선택해 주어야 한다.
Page 번호를 설정해 주기 위해서 위에 보이는것처럼 B0 ~ B7의 값을 써주면 된다.
ssd1306_set_page_addr() 함수를 만들어 page address를 변경할 수 있게 하였다.
display_test_pattern() 코드를 위와 같이 수정하여 결과를 확인해 본다.
이제 전 영역에 미리 설정한 패턴 데이터가 표시되는것을 볼 수 있다. 위의 경우에는 항상 column의 시작 위치가 0으로 설정되는 경우인데, 이 또한 임의의 위치에서 시작될수 있도록 할 수 있다.
ssd1306_set_column_addr() 이용하여 특정 column을 선택할 수 있도록 하였다.
위의 코드를 작성하여 보드에서 실행 시켜 보면 다음과 같은 결과를 볼 수 있다.
특정 PAGE의 특정 Column에 데이터를 써서 원하는 출력이 나오게 만들었다.
'프로젝트 > OLED12864' 카테고리의 다른 글
OLED 12864 - I2C (6) | 2018.03.10 |
---|---|
OLED 12864 - String(문자 출력) (6) | 2018.03.09 |
OLED 12864 - Draw Dot (0) | 2018.03.03 |
OLED 12864 - HORIZONTAL, VERTICAL Addressing Mode (0) | 2018.03.01 |
OLED 12864 - SSD1306 (1) | 2018.02.10 |