728x90

LCD 액정 디스플레이

- 대부분 디스플레이에 사용

- FND 같은 단순한 형태부터

- 실제 가까운 OLED까지

 

 

문자 LCD

- Liquid Crystal Display 약자

- Character Type LCD와 Graphic Type LCD로 구분

- 최대 가로로 쓰이는 문자수와 세로로 표시되는 줄 수로 규격이 정해짐

 -> 16 x 2(16글자 2줄), 20 x 4 (20글자 4줄), 40 x 2 등 다양한 종류

- LCD와 컨트롤러가 결합된 모듈형태

- 대부분 Hitachi의 HD44780 컨트롤러 내장 -> DH44780의 데이터시트를 보면서 해야함

 

문자 LCD

 

C-LCD 핀 구성

- MCU가 통해 신호를 보내야함

- MCU 측 PB0~7 까지 8개 핀, PG0~2 3개 -> 11개 핀 할당

- LCD Driver에선 RS, RW, E와 DB0~7핀이 받음

MCU - LCD 
컨트롤트롤러와 LCD

 

 C_LCD 핀의 기능 

- CN-LCD는 LCD 모듈

 

LCD 핀의 기능

- 1,2  그라운드와 전원

- 3 가변저항

- 15, 16은 백라이트 전원과 그라운드 연결 

- 4 : PG0 핀으로 high를 보내면 데이터 레지스터 선택, low를 보내면 명령레지스터 선택

LCD 회로도

 

 

 

DDRAM Display Data RAM

- 최대 80*8bit 기억 용량 (최대 80글자 기억)

-  DDRAM의 1행 0x00 ~ 0x27 addr(40문자) : 0x80 + (0x00 ~ 0x27)

- DDRAM의 2행 0x40 ~ 0x67 addr(40문자) : 0x80 + (0x40 ~ 0x67)

- DDRAM의 address 동작 상태 (실제 메모리 공간 : 0x80~0xA7, 0xC0 ~ 0xE7)

-> 0x80하는 이유는 뒤에 서술

 

CG ROM(Character Generator ROM)

- 문자 생성 ROM

- 가로 16 x 세로 12개의 address code를 가짐

- 192개의 숫자, 문자 패턴을 가짐

 

CG RAM(character generator ram)

- 문자 생성 ram

- 사용자가 프로그램으로 문자 패턴을 만들 경우 사용하는 ram

- 0x00 ~ 0x3f 번지 저장

- 8개의 사용자 공간 활용 가능

- 전원 off 시 data는 삭제됨

-> 잘 사용하지 않으나 문자 생성 필요시 사용

 

 

레지스터 선택 신호

- 명령어/데이터 쓰기 작업만 집중 : CGROM에 있는 192개의 숫자, 문자 패턴을 씀

- Instruction Register IR : Text LCD 모듈 환경 설정

- Data Register DR : 모듈에 글자를 표시하기 위한 데이터 값이 들어가는 레지스터

- IR에 명령어 세팅 -> DR에 표시하는 값 write

- rs=0, rw=0 명령어 쓰기 -> Instruction Register에 제어 데이터 쓰기

- rs=1, rw=0 데이터 쓰기-> LCD에 표시할 문자를 Data Register에 쓰기

 

 

 

문자 LCD 명령 테이블

- I/D, S/C, R/L은 명령 옵션 아래의 명령 옵션 참고

 

문자 LCD 명령 옵션

 

8비트 LCD 초기화

 

8비트 데이터 버스를 사용하는 LCD 초기화 방법

//LCD 초기화
void init_LCD()
{
	_delay_ms(15);
    
    /*
    0x38의 의미 -> 문자 LCD 명령 테이블 참고
    0x38 == 0011 10xx
    Function set 명령을 의미
    DL 옵션이 1, N 옵션 1, F옵션 0 / 인터페이스(DL), 라인(N), 폰트(F)
    => 문자 LCD 명령 옵션 참고
    DL =1 -> 8비트 데이터 버스 사용 data line
    N = 1 -> 두줄 사용 number line
    F = 0 -> 5x8 dot 사이즈 글자 font / F=1 인경우 5 x 10 dot size 글자 사용 -> 0011 11xx을 write하면됨
    
    */
    LCD_cmd_write(0x38); 
    
    _delay_ms(5);
    LCD_cmd_write(0x38);
    _delay_ms(100);
    LCD_cmd_write(0x38);
    
    LCD_cmd_write(0x08); //표시 off
    LCD_cmd_write(0x01); // 화면 지우기
    LCD_cmd_write(0x06); // 엔트리 모드 셋
    LCD_cmd_write(0x0C); //표시 on
    
}

 

쓰기 동작 타이밍도

- 데이터 시트 마지막에 있음

- 유효한 명령/데이터로 하기 위해서 E을 high에서 low로 중간에 떨어뜨려야 함

 

문자 LCD 표시 예제

//LCD 8비트 인터페이스 초기화 함수
void LCD_init()
{
	DDRB = 0xFF;
	DDRG = 0xFF;
	_delay_ms(20);
	LCD_command(0x38);
	LCD_command(0x08);
	LCD_command(0x01);
	_delay_ms(1);
	LCD_command(0x06);
	LCD_command(0x0E);

}

//LCD 명령 처리 함수
void LCD_command(unsigned char cmd)
{
	//0000 0100
	PORTG = 0x04; //E=1, RW=0, RS=0 -> 명령 레지스터에 명령쓰기
	PORTB = cmd;  // 명령 전달
	_delay_us(1);
	PORTG = 0x00; //E=0, RW=0, RS=0
	// enable을 high에서 low로 떨어져야 valid data   -동작 타이밍도 참고
	_delay_us(1); //명령 쓰기
	
}
// LCD 데이터 처리 함수
void LCD_data(unsigned char data)
{
	PORTG = 0x05;//E=1, RW=0, RS=1  LCD에 표시할 문자를 데이터레지스터에 쓰기
	PORTB = data;//데이터 값 전달
	_delay_us(1);
	PORTG = 0x01;//E=0, RW=0, RS=1 LCD 데이터 처리신호 high->low
	_delay_us(1);
}

// 문자열 처리 함수
void LCD_string(unsigned char cmd, unsigned char *str)
{
	//문자열 출력 위치 명령 전달
	LCD_command(cmd);
	// 문자열 마지막 null에서 루프 종료
	while (*str != '\0')
	{
		LCD_data(*str);
		str++;
	}
}

// ***********************************************************
// Main program
//
int main(void) {

	LCD_init();
	
	unsigned char str1[] ="LCD display";
	unsigned char str2[] = "  Example ";
	while (1)
	{
		LCD_string(0x80, str1);// 첫째줄 0x80부터 시작
		LCD_string(0xC0, str2);// 둘째줄 0xC0부터 시
		_delay_ms(100);
	}
	return 1;
}

LCD VMLAB 프로젝트 코드

 ;                     rs  rw  E   -------------8bit interface----
 Xdisp	LCD(16 2 250K) PG0 PG1 PG2 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
 ;X(이름)disp(모듈)
 ;16 x 2 , 250K 크리스탈 동작

300x250

+ Recent posts