티스토리 뷰

프로젝트/OLED12864

OLED 12864 - Draw Dot

Just4Fun 2018. 3. 3. 12:34

앞의 글들을 통해서 기본적인 SSD1306의 동작 원리를 설명하였으므로 이를 응용하여 화면에 원하는 위치에 점 하나를 표시하는 방법을 구현해 보도록 하겠다.

점 하나만을 표시하고자 할때 주의할 점은 위의 그림을 보면 알겠지만, column의 위치는 특정 SEG위치를 지정해 줌으로써 원하는 위치를 직접 지정해 줄수 있지만, row의 위치는 Page단위, 즉, 1바이트 크기만큼씩 지정해 줄수밖에 없는 구조에 대해 고려해 주어야 한다는 것이다.

만약, 18번째 줄의 어딘가에 점하나를 출력하고자 원한다면, PAGE2의 D1비트의 값을 1로 설정해 주면 된다. 하지만 이때 나머지 비트값들은 그대로 유지해 주어야한다.  그렇지 않으면, D1비트값만 켜지고 나머지 줄들의 데이터는 모두 0이 되므로 꺼지게 되는 것이다.

따라서 GDDRAM의 현재 값들을 저장하기 위한 공간을 SRAM 영역에 만들어 두어야 한다.

이를 위하여 위의 코드처럼 8 * 128 바이트크기의 2차원 배열을 선언하였다.

clear_screen() 함수에서 배열을 모두 0으로 초기화하고, 초기화된 데이터를 GDDRAM에 써주어 전체화면을 모두 clear하는 동작을 수행하도록 하였다.

이제, OLED 12864 모듈의 전영역을 점 하나씩 출력하여 전체 영역에 대한 표시가 정확히 수행되는지 확인해 보도록 하겠다.

점하나를 그리기 위한 draw_dot() 함수를 만들었다.

3번 줄은 인자로 들어오는 row에 해당 되는 page 번호를 알아내는 코드이다.  page마다 8개의 row가 있으므로 8로 나누어주는 것이다.

4번 줄은 page와 column에 해당되는 데이터가 들어있는 메모리의 위치를 가져오는 것이다.

6~9번줄은 value에 따라 그 값이 1이면 해당 비트값을 set하고, 0이면 해당 비트값을 clear하는 코드이다.

11~13번줄은 해당 page와 column의 시작 위치를 지정해주고 그 위치에 데이터를 하나 써주도록 하였다.

위의 코드를 빌드하여 실행시켜 본다.

실행 시켜 보면 화면의 왼쪽 첫번째 줄에서 마지막 줄까지 차례로 점을 찍어서 전체 영역을 켜고, 그 다음에는 차례로 clear하는 동작을 볼 수 있다.

전 영역에 대해서 문제없이 점을 표시할 수 있음을 확인하였으면 임의의 위치에 랜덤한게 점을 표시해 보도록 하겠다.

약 1000개의 점을 랜덤한 위치에 출력한 후 화면을 clear하고 다시 점을 찍는것을 반복하는것을 볼 수 있다.


oled_spi.zip


'프로젝트 > OLED12864' 카테고리의 다른 글

OLED 12864 - I2C  (6) 2018.03.10
OLED 12864 - String(문자 출력)  (6) 2018.03.09
OLED 12864 - HORIZONTAL, VERTICAL Addressing Mode  (0) 2018.03.01
OLED 12864 - Page Addressing Mode  (0) 2018.03.01
OLED 12864 - SSD1306  (1) 2018.02.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함