티스토리 뷰

프로젝트/LCD12864

LCD12864 - Draw dot

Just4Fun 2016. 7. 26. 21:58

이번에는 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_dot.zip


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함