Atmega32로 LCM4004A 다루기(5편) - 4bit 8bit 소스 합치기
이글의 전부 또는 일부, 사진, 소스프로그램 등은 저작자의 동의 없이는 상업적인 사용을 금지합니다. 또한, 비상업적인 목적이라하더라도 출처를 밝히지 않고 게시하는 것은 금지합니다.
(본 글은 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로 구현하여 추가로 첨부하겠습니다.


