티스토리 뷰
앞의 글에서 설명한 초기화 과정을 거쳐 LCD화면에 16x16 크기의 커서가 깜빡이는 것을 확인하였으면 다음 단계로 글자를 출력하는 기능을 구현해 보도록 하겠다.
글자를 출력하는 코드는 이미 LCD1602에서 설명한 방법과 동일하므로 별도의 설명은 필요 없을것이다.
이제, 특정 위치에 원하는 글자를 출력하기 위하여 DDRAM 주소를 설정하는 방법을 알아보자.
ST7920 문서에 다음과 같은 설명이 나온다.
위의 설명에 따르면 첫번째 줄에 글자를 출력하기 위해서는 DDRAM의 주소값을 0x80 ~ 0x8F 사이의 값을 설정하여야 하고, 두번째 줄에 글자를 출력하기 위해서는 0x90 ~ 0x9F 사이의 주소값을 설정하여야 된다. 세번째줄이나 네번째 줄에 대한 주소값도 나와 있으나, DDRAM 설명의 마지막 줄을 보면 어차피 동시에 LCD화면에 출력 가능한 것은 두줄밖에 할 수 없다는 것을 알 수 있다. 따라서 세번째 줄과 네번째 줄에 대한 출력은 고려하지 않아도 된다.
첫번째와 두번째 줄의 주소 값을 보면 최상위 비트가 1로 되어 있는데, 이 값은 이미 DDRAM에 대한 주소를 instruction register에 쓰고자 한다는 것을 알 수 있으므로 실질 적인 주소는 다음과 같다고 볼 수 있다.
첫번째 줄에 대한 DDRAM 주소는 0x00 ~ 0x0F가 되고, 두번째 줄에 대한 DDRAM 주소는 0x10 ~ 0x1F가 된다.
결론적으로 특정 위치에서 글자를 출력하고자 하기 위한 코드는 다음과 같이 만들 수 있을 것이다.
그럼, 이제 위의 코드를 이용하여 LCD화면에 글자를 원하는 위치에 출력해 보도록 하자.
위의 코드는 첫번째 줄에 대문자를 하나씩 출력하고, 두번째 줄에는 소문자를 할 글자씩 출력하는 것이다. 실제로 어떤 결과가 나오는지 확인해 보면 다음과 같다.
그림을 잘 보면 대문자가 첫번째와 세번째 줄에 나오는 것을 볼 수 있고, 소문자는 두번째와 네번째 줄에 표시되는 것을 볼 수 있다.
그럼 다음과 같은 코드는 어떻게 출력되는지 확인해 보자.
위의 코드를 실행하면 다음과 같은 결과 화면을 볼 수 있다.
언듯 생각하기에는 첫번째, 두번째 줄에 대문자가 연속해서 출력되고, 세번째와 네번째 줄에 소문자가 출력되어야 할것 같은데 한줄 건너서 연속한 글자들이 출력되는것을 볼 수 있다.
그럼, 왜 이런 결과가 나오는지 분석해야 할 것 같다.
ST7920 문서의 제일 앞페이지에 나오는 Main Features에 다음과 같은 항목이 나온다.
16비트 크기의 글자를 출력할 수 있는 RAM이 있는데 64개의 글자까지 표시 가능하다. 최대 16글자 x 4줄에 해당되는 크기이지만, 실제 LCD 화면에 출력가능한 글자는 16글자 X 2줄이다.
위의 설명을 잘 분석해보면, 결국 하나의 글자는 16비트 크기를 가지고, 2줄만 표시되며, 한줄에 16글자까지 표시할 수 있다는 뜻이 된다.
그리고, 다음 내용도 문서에 잘 설명되어 있다.
위의 설명을 보면 크게 세종류의 폰트가 지원되는것을 알 수 있다.
HCGROM은 DDRAM에 쓰여지는 데이터가 0x02 ~ 0x7F 사이일때 8x16 dot 크기의 문자가 표시된다. 즉, 다음과 같은 글자가 표시된다.
앞의 코드로 구현된 결과물과 같이 비교해 보기 바란다. 0x40 ~ 0x7F까지의 결과가 바로 위의 코드 표와 같음을 알 수 있다.
CGRAM은 프로그래머가 직접 만든 패턴을 표시하기 위하여 사용한다. 이에 대한 설명은 이미 LCD1602 드라이버 코드 - CGRAM에서 설명하였다. 단지 차이점이라면 LCD1602의 경우 8글자까지 만들수 있었으나, LCD12864의 경우에는 4개의 글자만 프로그래머가 만들수 있다. 만들어진 문자를 출력하려면, DDRAM에 쓰여지는 데이터가 0x0000, 0x0002, 0x0004, 0x0006이어야 한다.
마지막으로 16x16 dot 크기의 문자를 출력할 수 있는 CGROM이 있다. 이 영역의 데이터는 주로 한자를 출력할 때 사용할 수 있다. 그러나 CGROM 안에 한자만 있는것은 아니고 여러가지 특수문자도 많이 들어 있으므로 필요한 경우 적절히 사용할 수 있다.
마지막으로 다음과 같은 내용도 문서에 들어있다.
이 그림이 앞에서 설명한 모든것들을 요약한 것이라고 볼 수 있다.
제일 윗줄은 DDRAM 주소를 의미한다. 각 주소에는 16비트 데이터 값을 쓸 수 있다.
데이터값이 0x02 ~ 0x7F일 경우 8x16 dot 글자로 표시되고, 그 이외에는 16x16 dot 크기의 글자를 표현할 수 있다.
그러나 위의 설명은 단지 DDRAM에 관한 설명이고, 실제 LCD에 표시되는 방법은 이와는 다르다.
실제 LCD에 표시되는 내용은 다음과 같이 설명할 수 있다.
즉, 16x16 크기의 글자를 두줄로 표현 가능하며 한 줄에 16글자를 표시할 수 있다.
그러나, 문제는 실제 LCD 화면은 4줄로 표현할 수 있으며, 한 줄에 8글자까지 표시할 수 있다. 그래서 이렇게 표시하기 위해서 위의 그림을 세로방향으로 가운데 반 잘라서 오른쪽 부분을 왼쪽반의 아래에 붙인것처럼 동작되도록 만들었다.
즉, 첫번째 줄의 주소는 0x80 ~ 0x87까지이고, 두번째 줄은 0x90 ~ 0x97, 세번째 줄은 0x88 ~ 0x8F, 네번째 줄은 0x98 ~ 0x9F까지의 주소를 가지는 것을 알 수 있다.
그렇다면 이제 위의 테이블을 참조하여 lcd_pos() 함수를 수정해 보도록 하자.
lcd_pos()의 첫번째 인자 row는 표시되는 줄에 대한 값으로 0,1,2,3이 들어올 수 있고, 두번째 인자인 col은 몇번째 칸인지 알려주는 값이다. 이 값은 0 ~ 7까지의 값을 가질수 있다.
우선 홀수줄인지 짝수 줄인지에 따라 0x10 값을 더해 줄지 말지를 결정한다. 그리고 2보다 작은 줄인지 큰줄인지에 따라 0x08값을 더해줄지 말지를 결정한다.
이를 고려하면 위의 코드가 만들어 진다.
이제 위의 코드를 이용하여 글자가 LCD화면에 어떻게 출력되는지 확인해 보기로 하자.
첫번째 줄에는 대문자를 표시하고, 두번째 줄에는 소문자를, 세번째 줄에는 숫자를, 그리고, 마지막 줄에서는 '!'부터 시작되는 기호문자를 출력해보는 코드이다. lcd_pos() 함수가 문제 없이 구현되었다면 다음과 같은 화면을 볼수 있을것이다.
한 줄에 여덟글자가 제대로 출력되는것을 확인할 수 있다.
다음 코드를 실행시키면 한자를 비롯하여 여러가지 특수 문자가 출력되는것을 볼 수 있다.
'프로젝트 > LCD12864' 카테고리의 다른 글
LCD12864 - Draw dot (0) | 2016.07.26 |
---|---|
LCD12864 드라이버 코드 - Graphic mode (1) | 2016.07.24 |
LCD12864 드라이버 코드 - Serial mode (0) | 2016.07.21 |
LCD12864 - UART SPI Master Mode (0) | 2016.07.20 |
LCD12864 - 회로 구성 (0) | 2016.07.19 |