티스토리 뷰

예전에 설명하였던 LCD1602나 LCD12864의 경우 글자를 출력하기 위한 기능이 디스플레이 내부에 들어 있었지만, SSD1306은 그런 기능이 없기 때문에 글자를 표현하기 위해서 직접 점들을 조합하여야 한다.

이번 프로젝트에서는 5x7 픽셀의 점들을 이용하여 ASCII code를 출력하는 방법에 대해서 설명하겠다.

예를 들어 대문자 'A'를 출력하기 위한 표시는 위의 그림과 같다.  가로로 5칸, 세로로 7칸의 조합으로 표시하며, 좌,우,상,하 글자와 구분하기 위하여 아래로 한칸, 오른쪽에 한줄의 공백을 두어야 한다.

SSD1306 datasheet 문서를 보면 Page내에서 위쪽에 있는 점이 D0에 해당되고 가장 아래쪽에 있는 점이 D7에 해당된다.

그러므로, 'A'의 첫번째 행을 이진수로 표현하면 '0 1 1 1 1 1 1 0'이 된다. 두번째 행은 '0 0 0 1 0 0 0 1'이 된다.  이것을 헥사값으로 표현하면 0x7e, 0x11, 0x11, 0x11, 0x7e가 된다.  즉 한글자를 표현하기 위하여 5바이트가 필요하게 되는것이다.

표현가능한 ASCII code는 space에 해당되는 0x20 ~ 0x7F까지 모두 96개의 글자이다.  이 글자들을 모두 2차원 배열로 만들면 다음과 같다.

이 데이터들은 읽기 동작만 수행할 것이므로 ROM안에 저장되도록 PROGMEM이라는 키워드를 사용하였음을 주의하여야 한다.

특정 문자에 해당되는 폰트데이터를 추출하기 위하여 다음과 같은 API를 만들어 둔다.

get_ch_data() 함수의 첫번째 인자에 해당되는 글자의 위치에서 pgm_read_byte()를 이용하여 1바이트값을 읽어 buffer가 가리키는 위치에 차례로 복사해준다.

그럼, 이제 한줄에 16글자를 화면에 표시해 보도록 하겠다.

위의 그림과 같이 ASCII code에 해당하는 문자들이 제대로 출력되는것을 확인하였다.

다음으로는 printf()를 이용한 문자열 출력 방법을 구현해 보도록 하겠다.

32~36에 있는 코드는 UART를 통한 문자열 출력에서 사용하였던 코드이다.  이번에는 UART 대신에 OLED 에 문자를 출력하기 위하여 TX 함수를 oled_tx()를 사용하였다.

15번 줄에서 출력하고자하는 글자에 해당되는 폰트 데이터를 읽어서 gddram버퍼에 기록해 둔다.

17~19번 줄에서는 문자가 출력되어야 하는 위치를 정해준다음 한 글자를 출력한다.

21~26번 줄은 하나의 문자를 출력한 후 다음 문자의 위치를 위하여 column을 증가 시킨후 이 값이 21보다 크면 column을 0으로 만든다. 이렇게 하는 이유는 한 줄에 표시할 수 있는 최대 글자수가 21문자 이기 때문이다.  혹시 줄바꿈이 필요한 경우 page 값을 하나 증가 시키고, 이값이 최대 page값보다 큰지 확인하여 범위를 벗어나면 첫번째 줄로 이동시키기 위하여 0의 값으로 설정해 준다.

만약 줄바꿈을 위하여 입력으로 들어온 문자가 '\n'이면 마지막으로 출력된 문자의 위치에서 끝까지 영역을 clear하기 위하여 5번 줄과 같은 동작을 수행한다.

줄바꿈 동작을 처리한 후 gddram버퍼를 0으로 초기화 한다.

동작을 확인하기 위하여 위의 코드를 이용한다.  -10부터 시작되는 값을 한 줄씩 출력하는 것이다.

첫번째 줄에서부터 문자열을 출력한 후 다음 줄에 새로운 문자열을 차례로 출력되는 것을 볼 수 있다.

마지막까지 출력이 되면 새로운 문자열은 다시 제일 위쪽줄부터 출력이 된다.

아쉬운대로 이정도로 printf()를 이용하여 원하는 문자열을 출력할 수 있었지만, 새로운 문자열을 가장 아래쪽에 출력하고 이전에 출력되었던 문자들은 차례로 위쪽줄로 이동하면 좀더 자연스러운 출력이 될것같다.

이번에는 '\n'이 들어오기 전까지는 계속 gddram 버퍼에 폰트데이터를 기록한다음 '\n'이 들어왔을때 OLED 전영역을 업데이트 하도록 하였다.

하나의 문자열이 21보다 큰 경우 다음줄에 걸쳐서 표시되도록 하였다.  프로그램이 시작되면 가장 아래쪽 줄에서부터 출력이 시작된다.  다음 문자열이 들어오면 첫번째 문자열은 위로 스크롤되도록 하였다.

항상 새로운 줄이 가장 아래쪽에서 표시되는 것을 확인할 수 있다.

임베디드 시스템에서 OLED를 사용하는 경우는 위의 예에서처럼 스크롤 되는 경우는 잘 없고 특정 위치에 특정 데이터만 쓰여지도록하는 경우가 더 많을것 같다.

따라서 이번에는 특정 위치에 데이터가 쓰여지도록 하겠다.

oled_msg() 함수를 만들어 원하는 줄과 행에서부터 문자열을 출력하도록 하였다.




oled_spi_printf.zip

oled_spi_position.zip


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

OLED 12864 - I2C  (6) 2018.03.10
OLED 12864 - Draw Dot  (0) 2018.03.03
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
글 보관함