티스토리 뷰
이번에는 LCD12864의 특정 위치에 하나의 점을 표시하는 방법에 대해서 알아보겠다.
바로 앞에서 설명한 LCD12864 드라이버 코드 - Graphic mode을 읽어 보면 그래픽 모드일때 원래는 32 X 256 개의 픽셀이 있지만 세로 방향으로 한 가운데를 잘라, 오른쪽 반을 왼쪽 반의 아래부분에 이어 붙인것이라고 보면 된다고 했다.
결국 64 X 128개의 픽셀이 있는것처럼 보이는 것이다.
이 중에서 특정 위치의 픽셀에 점을 찍어 보는 방법을 알아보도록 하겠다.
이미 앞의 글에서 draw_data() 함수를 구현해 보았기 때문에 위의 코드가 의미하는것을 쉽게 이해할 수 있을 것이다.
lcd_draw_dot() 함수의 첫번째 인자인 x는 가로축의 위치를 나타난다. 가로축은 16비트 값으로 이루어졌으므로 실제 GDRAM_ADDR에서는 16으로 나눈값이 들어가게 된다. 16으로 나누는 계산은 오른쪽으로 4번 쉬프트하는것과 동일하다.
코드에서 8번줄은 x의 위치가 16비트중에 몇번째 인지를 계산하는 것이다.
이 값이 구해졌으면 ST7920 칩의 data register에 써 주면 LCD에 점이 찍히게 된다.
setup() 함수를 위와 같이 만들어서 실제 LCD에서 어떻게 표시되는지 확인해 본다.
위의 영상에서 볼 수 있는것처럼 16픽셀 단위로 오른쪽에서 왼쪽으로 점이 하나씩 찍히는것을 알 수 있다. 그 이유는 다음과 같다.
위의 그림처럼 b15로 표시되어 있는 픽셀이 가장 왼쪽에 있고, b0 픽셀이 가장 오른쪽에 위치하고 있기 때문이다.
따라서 lcd_draw_dot() 함수를 다음과 같이 수정해 주어야 한다.
8번 줄에서 x의 값에 따라 15에서 빼주는 코드가 들어가 있는 것을 볼 수 있다.
이렇게 했을때 결과가 어떻게 되는지 다시 한번 확인해 본다.
이제 점 하나가 화면 왼쪽에서부터 오른쪽으로 차례로 이동하는것을 볼 수가 있다.
그러나, 위의 결과는 새로운 점 하나를 찍을 때, 이전에 있던 값들이 모두 지워져 버리는 결과가 나타난다. 이러한 것은 실제 프로젝트를 진행할 때 문제가 발생하게 된다.
이러한 문제를 해결하기 위해서 이전에 설정 되었던 정보를 모두 저장하고 있어야 한다. 이를 위하여 드라이버 코드에 lcd_buf[]라는 배열을 하나 만들어서 LCD에 표시되어 있는 점들을 모두 저장하도록 하면 될것 같다.
lcd_draw_dot() 코드에 세번째 인자를 추가하였다. 세번째 인자는 LCD 화면에 점을 표시할 것인지, 아니면 지울것인지 결정하는데 사용한다. 코드를 수정한 후 다시 실행해 보자.
setup() 함수도 같이 수정해 주어야 한다.
이렇게 수정한 결과는 다음과 같다.
새로 점을 찍을때마다 이전 값이 지워지지 않고 유지 되는 것을 확인할 수 있다.
그렇다면 점 하나만을 첨부터 끝까지 이동시켜 보는 코드를 만들어 볼 수도 있겠다.
위의 코드처럼 수정한 후 실행 시키면 LCD 화면에 하나의 점만이 왼쪽 상단에서 오른쪽 하단으로 연속해서 이동해 가는 것을 볼 수 있을 것이다.
이제 마지막으로 전체 LCD화면에서 임의의 위치에 점을 찍거나 지우는 코드를 만들어 보겠다.
'프로젝트 > LCD12864' 카테고리의 다른 글
LCD12864 - Draw Line (0) | 2016.07.28 |
---|---|
LCD12864 드라이버 코드 - Graphic mode (1) | 2016.07.24 |
LCD12864 드라이버 코드 - DDRAM의 이해 (1) | 2016.07.24 |
LCD12864 드라이버 코드 - Serial mode (0) | 2016.07.21 |
LCD12864 - UART SPI Master Mode (0) | 2016.07.20 |