본문 바로가기
Embedded System/ATmega128

C-LCD 8-bit Control and 4-bit Control

by xangmin 2020. 4. 4.
반응형

<CLCD Screen>

· CLCD란?

 LCD화면에 숫자,알파벳을 보여주는 모듈이다. 일반적으로 16*2사이즈 LCD를 많이 사용합니다.16은 가로16칸 2는 세로2칸을 의미한다.

 

 CLCD에 대한 기본설명은 간단히 하고 8bit control과 4bit control에 포커스를 두고 설명을 하려고 한다.

 

 우선은 통신에는 크게 두가지가 있다. 직렬 통신과 병렬 통신이다. 직렬 통신의 대표적인 예로 Usart 통신, I2C 통신, SPI 통신이 있다.  LCD는 MCU간 병렬통신방식을 따른다. 3-bit의 Control Bus와 8-bit의 Data Bus로 구성되어 있다. Data Bus를 4개로 Data를 주고 받는지, 8개로 주고 받는지에 따라 4-bit control 또는 8-bit control이 된다.

 

 CLCD의 Controller로는 HD44780 Driver를 사용하였다. CLCD를 사용하기 위해서는 제어방식(4-bit or 8-bit), Font(5x8 or 5x11), 행(1 or 2)에따라 초기화를 해야한다. Driver에서 지원하는 명령어에 따라 초기화를 설정하게 된다. 초기화하는 방법을 알아보기 위해 HD44780 Driver의 Datasheet를 참고한다. (명령어와 초기화 방법은 모두 Datasheet에 있다)

 

<HD44780의 명령어>

 

<8-bit Initializing by Instruction >

//8bit제어, 5x8 Font, 2행 에 따른 초기화 설정
void clcd_init_8bit(void)
{
	clcd_command(0x38); //Function Set
	_delay_ms(5);
	clcd_command(0x38); //Function Set
	_delay_ms(1);
	clcd_command(0x38); //Function Set
	clcd_command(0x38); //Function Set
	
	clcd_command(0x0F); //Display On
	clcd_command(0x01); //Display Clear
	clcd_command(0x06); //Entry mode set
}

 

<4-bit Initializing by Instruction >

//4bit제어, 5x8 Font, 2행 에 따른 초기화 설정
void clcd_init_4bit(void)
{
	clcd_command(0x28); //Function Set
	_delay_ms(5);
	clcd_command(0x28); //Function Set
	_delay_ms(1);
	clcd_command(0x28); //Function Set
	
	clcd_command(0x0C); //Display On
	clcd_command(0x01); //Display Clear
	clcd_command(0x06); //Entry mode set
}

 

최종적인 C-LCD Header File이다.

/*
Header file for 8 bits Data Bus
*/
typedef unsigned char  INT8;
typedef unsigned int   INT16;


#define EN PC7   // Enable bit of Control Bus
#define RW PC6   // Read/Write bit of Control Bus
#define RS PC5   // Reset bit of Control Bus

#define DATA_BUS                             PORTA // 8 bits of Data Bus
#define CONTROL_BUS                          PORTC // 3 bits of Control Bus
#define DATA_BUS_DIRECTION                   DDRA
#define CONTROL_BUS_DIRECTION                DDRC

#define DATA_BUS_BUSY                        PINA // Busy Check at Data Bus
#define BUSY_BIT                             0x80 // Busy Check Bit --> Bit 7

#define sbi(reg,bit)    reg |= (1<<(bit))	  // Set "bit"th bit of Register "reg"		
#define cbi(reg,bit)    reg &= ~(1<<(bit))


#define CMD_CLEAR_DISPLAY                    0x01 // Clear All Display
#define CMD_RETURN_HOME                      0x02 // Cursor Position -> Return Home

#define CMD_ENTRY_MODE_SET_OPTION1           0x04 //   커서 좌측 이동, 화면이동 없음
#define CMD_ENTRY_MODE_SET_OPTION2           0x05 //   커서 좌측 이동, 화면 이동
#define CMD_ENTRY_MODE_SET_OPTION3           0x06 // * 커서 우측 이동, 화면이동 없음 
#define CMD_ENTRY_MODE_SET_OPTION4           0x07 //   커서 우측 이동, 화면이동 

#define CMD_DISPLAY_OPTION1                  0x08 //   화면 OFF,  커서 OFF,  커서 점멸 OFF 
#define CMD_DISPLAY_OPTION2                  0x09 //   화면 OFF,  커서 OFF,  커서 점멸 ON
#define CMD_DISPLAY_OPTION3                  0x0A //   화면 OFF,  커서 ON ,  커서 점멸 OFF
#define CMD_DISPLAY_OPTION4                  0x0B //   화면 OFF,  커서 ON ,  커서 점멸 ON
#define CMD_DISPLAY_OPTION5                  0x0C //   화면 ON ,  커서 OFF,  커서 점멸 OFF
#define CMD_DISPLAY_OPTION6                  0x0D //   화면 ON ,  커서 OFF,  커서 점멸 ON
#define CMD_DISPLAY_OPTION7                  0x0E //   화면 ON ,  커서 ON ,  커서 점멸 OFF
#define CMD_DISPLAY_OPTION8                  0x0F // * 화면 ON ,  커서 ON ,  커서 점멸 ON

#define CMD_CURSOR_DISPLAY_SHIFT_OPTION1     0x10 //   커서 선택,   커서 좌측 이동
#define CMD_CURSOR_DISPLAY_SHIFT_OPTION2     0x14 //   커서 선택,   커서 우측 이동
#define CMD_CURSOR_DISPLAY_SHIFT_OPTION3     0x18 //   화면 선택,   커서 좌측 이동
#define CMD_CURSOR_DISPLAY_SHIFT_OPTION4     0x1C //   화면 선택,   커서 우측 이동

#define CMD_FUNCTION_SET_OPTION1              0x20 //   4비트,   화면1행,    5x8  Font
#define CMD_FUNCTION_SET_OPTION2              0x24 // * 4비트,   화면1행,    5x11 Font
#define CMD_FUNCTION_SET_OPTION3              0x28 // * 4비트,   화면2행,    5x8  Font
#define CMD_FUNCTION_SET_OPTION4              0x2C //   4비트,   화면2행,    5x11 Font
#define CMD_FUNCTION_SET_OPTION5              0x30 //   8비트,   화면1행,    5x8  Font
#define CMD_FUNCTION_SET_OPTION6              0x34 // * 8비트,   화면1행,    5x11 Font
#define CMD_FUNCTION_SET_OPTION7              0x38 // * 8비트,   화면2행,    5x8  Font
#define CMD_FUNCTION_SET_OPTION8              0x3C //   8비트,   화면2행,    5x11 Font


void clcd_port_init(void);
void clcd_init_8bit(void);
void clcd_busy_check(void);
void clcd_command(INT8 cmd);
void clcd_data(INT8 data);
void clcd_str(char *string);
void clcd_position(INT8 col, INT8 row);
void clcd_clear(void);


void clcd_init_8bit(void)
{
	clcd_command(CMD_FUNCTION_SET_OPTION7);
	_delay_ms(5);
	clcd_command(CMD_FUNCTION_SET_OPTION7);
	_delay_ms(1);
	clcd_command(CMD_FUNCTION_SET_OPTION7);
	clcd_command(CMD_FUNCTION_SET_OPTION7);
	
	clcd_command(CMD_DISPLAY_OPTION8);
	clcd_command(CMD_CLEAR_DISPLAY);
	clcd_command(CMD_ENTRY_MODE_SET_OPTION3);
}

void clcd_port_init(void) 
{
	CONTROL_BUS_DIRECTION =   0xF0;
	DATA_BUS_DIRECTION=       0x00;
	CONTROL_BUS=              0x00;
	DATA_BUS=                 0x00;
}

void clcd_busy_check(void) 
{
	INT8 busy_flag=0;
	INT16 busy_time=0;
	
	DATA_BUS_DIRECTION = 0x00;

	do 
	{
		cbi(CONTROL_BUS, RS); //RS=0
		sbi(CONTROL_BUS, RW); //RW=1
		sbi(CONTROL_BUS, EN); //EN=1
		_delay_us(10);
		busy_flag=DATA_BUS_BUSY;
		cbi(CONTROL_BUS, EN); //EN=0
		busy_time++;
	} while((busy_flag & BUSY_BIT) && (busy_time<500));

	DATA_BUS_DIRECTION=0xFF;   
}

void clcd_command(INT8 cmd)
{
	clcd_busy_check();

	cbi(CONTROL_BUS, RS); //RS=0
	cbi(CONTROL_BUS, RW); //RW=0
	sbi(CONTROL_BUS, EN); //EN=1
	DATA_BUS=cmd;
	_delay_us(10);
	cbi(CONTROL_BUS, EN); //EN=0
}

void clcd_data(INT8 cmd)
{
	clcd_busy_check();

	sbi(CONTROL_BUS, RS); //RS=1
	cbi(CONTROL_BUS, RW); //RW=0
	sbi(CONTROL_BUS, EN); //EN=1
	DATA_BUS=cmd;
	_delay_us(10);
	cbi(CONTROL_BUS, EN); //EN=0
}

void clcd_str(char *string)
{
	while(*string != '\0')
	{
		clcd_data(*string);
		string++;
	}
}

void clcd_str_delay(char *string)
{
	while(*string != '\0')
	{
		clcd_data(*string);
		string++;
		_delay_ms(200);
	}
}

void clcd_position(INT8 col, INT8 row)
{
	clcd_command(0x80|(col*0x40+row));
}

void clcd_clear(void)
{
	clcd_command(0x01);
}
반응형

'Embedded System > ATmega128' 카테고리의 다른 글

Balancing Robot  (0) 2020.04.04
NEO-7M (GPS module)  (1) 2020.03.28
HC06 Bluetooth Module (Master / Slave 연동하기)  (0) 2020.03.28
HC06 (Bluetooth Module) Mobile 연동하기  (0) 2020.03.27
HC-SR04 Module (초음파 센서 모듈)  (3) 2020.03.27

댓글