티스토리 뷰

위의 그림이 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를 선택하기 위해서 사용한다.  이 값이 1이면 data register를 선택하는 것이고, 0일 경우 command register를 선택하게 된다.

Sync 바이트 다음에는 실제 데이터의 상위 4비트 값과 0으로만 된 4비트값을 내보낸다.  마지막 세번째 바이트는 데이터의 하위 4비트 값과 0으로된 4비트를 합쳐서 내보낸다.


위의 타이밍도와 설명을 참고하여 코드로 구현하면 다음과 같이 된다.


st7920_send() 함수가 위의 타이밍도에 나와있는 그림을 코드로 만들어 놓은 것이다.  st7920_tx()라는 함수를 사용하여 차례로 한바이트씩 세바이트를 내 보내는것을 볼 수 있다.

그러나, 코드의 첫번째줄을 보면 st7920_tx는 함수가 아니고 변수처럼 선언되어 있는것을 볼 수 있다. 그 이유는 drv_tx가 함수형 포인터형으로 선언되어 있기 때문이다.

drv_tx는 헤더파일에 다음과 같이 정의되어 있다.

typedef void (*drv_tx)(uint8_t data);

drv_tx라는 형은 input argument로 uint8_t변수 하나를 받아야 하고, 리턴값은 없는 함수의 주소를 저장하도록 선언할 때 사용하게 된다.

lcd_init() 함수가 불리워질때 인자로 들어오는 함수의 주소를 st7920_tx라는 함수 포인터 변수에 복사하도록 되어있다.  코드의 22번째 줄을 참고하기 바란다.

결국 st7920_tx()는 lcd_init() 함수가 불리워 질때 들어오는 함수를 이용하여 데이터를 내 보내는 것이다.  뒤에 나오는 코드를 보면 알겠지만 이 프로젝트에서는 st7920_tx가 uart_tx함수를 가리키도록 되어 있기 때문에 결과적으로는 uart_tx() 함수를 이용하여 데이터를 전달하게 되는 것이다.


그렇다면, 바로 uart_tx() 함수를 이용하면 되는데 왜 이렇게 여러단계를 거쳐 어렵게 코드를 만들었는지 궁금할것이다.

그 이유는 lcd 드라이버 코드를 완전히 독립적으로 만들기 위해서이다.  지금은 UART를 SPI 마스터 모드로 설정하여 통신을 하지만, 만약 진짜 SPI 통신을 이용하여 데이터를 내보려면 드라이버 코드를 수정해 주어야 한다.

하지만 함수형 포인터 변수를 사용하게되면 드라이버 코드가 더이상 변경될 필요가 없게 된다.  만일 UART가 아닌 SPI통신을 이용하여 AVR과 LCD가 연결되어 있다면 lcd_init() 함수를 부를때 spi_tx() 함수의 주소를 넘겨주면 되기 때문이다.


lcd_init() 함수에 있는 초기화 절차는 LCD1602 초기화 과정을 참고하면 쉽게 이해할 수 있을것이다.



setup() 함수에서 lcd_init()을 부를때 uart_tx() 함수의 주소를 넘겨주는 것을 볼 수 있다.

이제 코드를 완성해서 보드에서 실행하면 다음과 같이 동작되는 것을 볼 수 있다.



lcd12864.c

st7920.c

st7920.h



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

LCD12864 - Draw dot  (0) 2016.07.26
LCD12864 드라이버 코드 - Graphic mode  (1) 2016.07.24
LCD12864 드라이버 코드 - DDRAM의 이해  (1) 2016.07.24
LCD12864 - UART SPI Master Mode  (0) 2016.07.20
LCD12864 - 회로 구성  (0) 2016.07.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함