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의 데이터시트를 보면서 해야함
C-LCD 핀 구성
- MCU가 통해 신호를 보내야함
- MCU 측 PB0~7 까지 8개 핀, PG0~2 3개 -> 11개 핀 할당
- LCD Driver에선 RS, RW, E와 DB0~7핀이 받음
C_LCD 핀의 기능
- CN-LCD는 LCD 모듈
- 1,2 그라운드와 전원
- 3 가변저항
- 15, 16은 백라이트 전원과 그라운드 연결
- 4 : PG0 핀으로 high를 보내면 데이터 레지스터 선택, low를 보내면 명령레지스터 선택
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 초기화
//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 크리스탈 동작
'로봇 > 전기전자&메카' 카테고리의 다른 글
마이크로프로세서 메카트로닉스 제어 - 10 인터럽트 이해 (0) | 2020.05.13 |
---|---|
마이크로프로세서 메카트로닉스 제어 - 9 LCD 제어 2 (0) | 2020.05.13 |
마이크로프로세서 메카트로닉스 제어 - 7 FND (0) | 2020.05.13 |
마이크로프로세서 메카트로닉스 제어 - 6 스위치 입력 (0) | 2020.05.12 |
마이크로프로세서 메카트로닉스 제어 - 5 릴레이 제어 이론과 실습 (0) | 2020.05.12 |