이글의 전부 또는 일부, 사진, 소스프로그램 등은 저작자의 동의 없이는 상업적인 사용을 금지합니다. 또한, 비상업적인 목적이라하더라도 출처를 밝히지 않고 게시하는 것은 금지합니다.

 

 


(본 글은 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
블로그 이미지

엠쿠스

Microprocessor(STM32, AVR)로 무엇인가를 만들어 보고자 학습 중입니다.

,