이글의 전부 또는 일부, 사진, 소스프로그램 등은 저작자의 동의 없이는 상업적인 사용을 금지합니다. 또한, 비상업적인 목적이라하더라도 출처를 밝히지 않고 게시하는 것은 금지합니다.
(본 글은 2017.10.17.에 필자의 다른 티스토리 http://avrlab.tistory.com에 적었던 것을 옮겨왔습니다.)
LCD를 8비트로 제어하는 방법과 4비트로 제어하는 방법은 명령과 데이터를 입출력하는 함수만 다릅니다. 구체적으로는 LCD_WRITE_COMMAD, LCD_WRITE_DATA, LCD_READ_DATA, LCD_READ_BF_ADDRESS 함수의 내용이 다르고, 4비트로 제어하는 경우에는 8비트로 명령을 보내는 LCD_WRITE_COMMAND_8BIT 함수가 추가로 필요했습니다.
AVR 어셈블러의 #define 기능을 이용해서 앞의 글에서 다룬 LCM4004A_8Bit.asm과 LCM4004A_4Bit.asm을 하나의 파일로 합칠 수 있습니다.
#define문은 매크로를 정의하는 전처리기 명령어입니다. 다음과 같이 선언하면 LCM_4BIT 매크로가 정의됩니다.
#define LCM_4BIT #ifdef LCM_4BIT (A) #else (B) #endif
위와 같이하면 컴파일할 때에 (A) 부분만 포함됩니다.
만일 LCM_4BIT 매크로를 정의하는 첫 행이 없다면 (A) 부분은 컴파일되지 않고 (B) 부분만 컴파일됩니다. #ifndef는 #ifdef와 반대입니다.
4비트로 제어하는 함수와 8비트로 제어하는 함수를 합친 소스 파일들을 첨부합니다.
#ifndef LCM_4BIT (B) #else (A) #endif
위와 같이하면 LCM_4BIT 매크로가 정의되지 않은 경우에는 (B) 부분만 컴파일하고, LCM_4BIT 매크로가 정의된 경우에는 (A) 부분만 컴파일합니다.
따라서 (A) 부분에는 4비트로 제어하는 함수들을 넣고, (B) 부분에는 8비트로 제어하는 함수들을 넣습니다. 이와 같이 한 후에 프로그램의 윗 부분에서 LCM_4BIT 매크로를 정의하면 4비트로 제어하는 함수들만 프로그램에 포함되고, LCM_4BIT 매크로를 정의하지 않으면 8비트로 제어하는 함수들만 프로그램에 포함됩니다.
다음은 위와 같이 변경한 소스 프로그램입니다.
LCM4004A.asm 첫 부분에 #define LCM_4BIT를 정의한 내용을 주석으로 처리했습니다.
이 상태로 컴파일하면 LCD를 8비트로 제어합니다. #define LCM_4BIT 앞에 주석 처리한 //를 제거하면 LCD를 4비트로 제어할 수 있습니다.
일단은 5편을 여기서 마치기로 하고, 차후에 LCM4004A를 제어하는 루틴들을 C++의 class로 구현하여 추가로 첨부하겠습니다.
LCM4004A.asmLCM4004A_ExM32.asmDelay_16mHz.asm
'AVR > CLCD' 카테고리의 다른 글
Atmega32로 LCM4004A 다루기(4편)-LCD구동 4비트 (0) | 2018.11.09 |
---|---|
Atmega32로 LCM4004A 다루기(3편)-LCD구동 8비트 2/2 (0) | 2018.11.09 |
Atmega32로 LCM4004A 다루기(2편)-LCD구동 8비트 1/2 (0) | 2018.11.09 |
Atmega32로 LCM4004A 다루기(1편)-준비 (0) | 2018.11.09 |
LCM4004A CLCD 다루기 (0) | 2018.11.09 |