이번글에서는 두점을 잇는 선을 그리는 방법을 구현해 보도록 하겠다.인터넷에 찾아보면 다양한 선 그리는 알고리듬을 찾아 볼 수 있는데, 비교적 널리 알려진 Bresenham의 알고리듬을 적용하여 선을 그려보도록 하겠다. void lcd_draw_line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t color) { int dx = abs(x1-x0), sx = x0 -dx) { err -= dy; x0 += sx; } if (e2 < dy) { err += dx; y0 += sy; } } } 위의 코드에 대해서는 인터넷에 잘 설명되어 있으므로 굳이 여기에서는 따로 설명하지는 않겠다. 단지, 이 코드를 이용하여 간단한 예제 프로그램을 만들어서 제대로 선이..
이번에는 LCD12864의 특정 위치에 하나의 점을 표시하는 방법에 대해서 알아보겠다. 바로 앞에서 설명한 LCD12864 드라이버 코드 - Graphic mode을 읽어 보면 그래픽 모드일때 원래는 32 X 256 개의 픽셀이 있지만 세로 방향으로 한 가운데를 잘라, 오른쪽 반을 왼쪽 반의 아래부분에 이어 붙인것이라고 보면 된다고 했다. 결국 64 X 128개의 픽셀이 있는것처럼 보이는 것이다.이 중에서 특정 위치의 픽셀에 점을 찍어 보는 방법을 알아보도록 하겠다. void lcd_draw_dot(uint8_t x, uint8_t y) { uint16_t data; send_cmd(GDRAM_ADDR | (y & 0x1F)); send_cmd(GDRAM_ADDR | (y & 0x20 ? 8 : 0) |..
LCD12864 프로젝트의 첫번째 글에서 이미 얘기했듯이 LCD12864는 이름과 같이 가로 128개의 점과 세로 64개의 점으로 표시 가능한 그래픽 모드로 동작 시킬수 있다. 이번 글에서는 어떻게 그래픽모드로 동작 시켜 원하는 곳에 점을 표시할 수 있는지 설명하도록 하겠다. 먼저, 그래픽 모드로 설정하기 위한 코드를 만들어 보겠다. void lcd_set_graphic_mode(void) { send_cmd(CMD_CLR); _delay_ms(10); send_cmd(CMD_FUNC | EXTEND_INST | GRAPHIC_ON); send_cmd(CMD_HOME); } lcd_set_graphic_mode()는 텍스트 모드에서 그래픽 모드로 전환 할 수 있다. 위의 표에서 보는바와 같이 functi..
앞의 글에서 설명한 초기화 과정을 거쳐 LCD화면에 16x16 크기의 커서가 깜빡이는 것을 확인하였으면 다음 단계로 글자를 출력하는 기능을 구현해 보도록 하겠다. 글자를 출력하는 코드는 이미 LCD1602에서 설명한 방법과 동일하므로 별도의 설명은 필요 없을것이다. void lcd_putc(char ch) { send_data(ch); } void lcd_puts(const char *str) { while (*str) send_data(*str++); } 이제, 특정 위치에 원하는 글자를 출력하기 위하여 DDRAM 주소를 설정하는 방법을 알아보자.ST7920 문서에 다음과 같은 설명이 나온다.위의 설명에 따르면 첫번째 줄에 글자를 출력하기 위해서는 DDRAM의 주소값을 0x80 ~ 0x8F 사이의 값을..
위의 그림이 serial mode에서의 타이밍을 자세히 보여주고 있다. 일반적으로 SPI통신은 CS신호가 low일때 유효한 통신이 이루어 지지만 ST7920은 CS가 high일때 통신이 이루어 진다. 참고로 회로도를 보면 알겠지만 CS 신호를 VDD에 연결시켜 놓았기 때문에 항상 통신이 이루어지고 있다고 보면된다. 그림에서 SID 신호를 보면 3바이트 길이로 통신이 되는 것을 볼 수 있다.첫번째 바이트는 sync를 맞추기 위해서 5비트의 1이 연속되어져야하고, 6번째 비트값으로 read/write 동작을 알려준다. LCD12864프로젝트는 항상 write 동작만 수행되므로 항상 0의 값을 가지도록 주의하여야 한다.7번째 비트는 ST7920 내부의 command register와 data register를..
AVR의 UART를 SPI 마스트 모드로 설정하여 LCD를 제어하는 방법에 대해서 먼저 설명하도록 하겠다. "Using the Master SPI Mode of the USART"라는 문서에서 다음과 같은 그림을 볼 수 있다. 왼쪽이 SPI master 모드로 동작하는 AVR이고 오른쪽이 SPI slave모드로 동작되는 AVR이다. 두개의 AVR을 하나는 SPI 마스트로, 다른 하나를 SPI 슬레이브로 연결하는 방법을 설명하는 그림이다.왼쪽 AVR을 보면 TXD핀이 MOSI처럼 동작하고 RXD가 MISO로, XCK가 SCK처럼 동작되는 것을 볼 수 있다. AVR 데이터쉬트에서 USART챕터에 보면 Asynchronous mode일때와 Synchronous Master mode로 동작할 경우의 baud r..
LCD12864 프로젝트는 가로 128개, 세로 64개의 점으로 구성되는 단색 LCD를 이용하여 원하는 글자나 그래픽을 구현해보는 것이다.LCD1602는 글자위주의 표시를 주로 구현하였고 사용자 패턴을 이용하여 약간의 그래픽 기능을 구현해 보았다면, LCD12864는 문자 표시보다는 그래픽 위주의 출력을 대상으로 프로젝트를 진행해 보려고 한다. LCD12864에 사용되는 드라이버 칩은 ST7920을 사용한다.사용되는 LCD모듈은 다음과 같은 모양을 하고 있다.위의 그림을 보면 알겠지만 외부로 나오는 핀은 모두 20개가 제공된다.각 핀들의 설명은 다음과 같다. 이 제품은 LCD1602과 동일하게 8비트 혹은 4비트 병렬모드로도 동작이 가능할 뿐만 아니라, 15번 PSB핀을 0으로 만들면 SPI를 이용한 직..