반응형
· 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에 있다)
//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
}
//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 |
댓글