2017년 128강좌 > [BK-AVR128] 회로분석 - LCD

TODAY273 TOTAL604,902
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 2017년 128강좌 | [BK-AVR128] 회로분석 - LCD

페이지 정보

작성자 키트 작성일2017-09-12 14:37 조회1,223회 댓글2건

본문

 

3660040649_GUCEmsKV_25EC25A0259C25EB25AA25A9_25EC2597258625EC259D258C.png3Ftype3Dw740

왼쪽의 GLCD와 오른쪽의 CLCD는 포트 할당이 동일합니다.
E 신호만 각각 다른 포트에 할당했다면 GLCD와 CLCD를 동시에 구동 할 수 있는데
묶여져 있으니 한번에 하나밖에 구동하지 못합니다.
//
3660040649_cDJKPx7z_25EC25A0259C25EB25AA25A9_25EC2597258625EC259D258C.png3Ftype3Dw740
포트A는 LED와 FND 회로에서도 사용하고 있습니다.
GPIO 포트지만 마치 데이터 버스인양 공통으로 쓰고 있습니다.
//
일반적인 GLCD에는 안보이는 핀이 있습니다.
PSB 핀이 무엇인지 데이터시트를 찾아봐야겠습니다.
폴더 안에는 데이터시트 대신 그림파일이 몇개 있는데 그 중에서 몇개만 첨부합니다.
3660040649_98K3hi6c_12864__4__5.png3Ftype3Dw740

CLCD 백라이트는 4.1V 120mA로 일반적인 사양입니다.

3660040649_KnROt6zG_12864__6__7.png3Ftype3Dw740
CLCD 백라이트 핀은 5V로 적혀 있습니다.
4.1V가 아니라는 말은 내부에 저항이든 다이오드든간에 전압을 4.1V로 낮춰주는 부품이 내장되어 있어야 한다는 의미겠죠
만약에 LCD 내부에 저항을 낮춰줄 부품이 없는 경우라면 5V를 직접 연결해서는 안되겠습니다.
(120mA보다 훨씬 많은 전류가 흐르게되고 백라이트 LED 수명이 단축됩니다.)

3660040649_GkCb1jAQ_12864__8__9.png3Ftype3Dw740
GLCD 핀명칭에서 PSB는 패러렐/시리얼 모드를 선택하는 핀입니다.
점퍼 J15가 패러렐 모드로 꼽혀 있는 상태입니다.
3660040649_7AerLtkn_12864252C1__2.png3Ftype3Dw740
모델명이 여기에 적혀있군요
데이터시트 검색하러 잠시 다녀옵니다.
폴더안에는 ST7920 PDF 파일이 중문 버전으로 들어있습니다.
GLCD의 콘트롤러 인가봅니다.
영문 버전을 찾아야겠죠
둘 다 아주 빠르게 열리지는 않지만 잘 열리는 것으로 받아서 보세요

GLCD를 저 것을 사용하지 않으면 회로를 일부 변경해야겠습니다.
변경하게 되면 LCD 예제를 만들 때 추가로 설명 해드리겠습니다.
//
옛날에 처음 공부 할 때는 CLCD나 GLCD 구동에서 BUSY 체크를 꼭 했었습니다.
그래야만 되는 줄 알았었죠
요즘은 BUSY 체크를 하지 않고 딜레이를 주고서 구동합니다.
BUSY 체크를 하지 않을 때의 단점은 제어 시간이 아무래도 조금 더 걸린다는 점입니다.
BUSY 체크를 하지 않을 때의 장점은 출력만 하면 되므로 코드가 좀 더 단순해지고 
3.3V 로직으로 5V LCD를 구동 할 수 있다는 점입니다.
또 한 가지 장점이 더 있는데 BUSY 체크 하기 위해서 포트를 입력으로 변경하지 않아도 된다는 점입니다.
양쪽에서 데이터버스를 공유하면서 시간차를 가지고 출력을 번갈아서 제어하게 되면
제어를 제대로 하지 못하면 (양쪽다 출력으로 설정되어 있는 경우) 고장 위험이 있습니다.
한쪽은 출력, 상대방은 입력인 경우가 훨씬 안전합니다.
시리얼 통신 경우에도
UART, SPI는 데이터버스의 방향이 결정되어 있어서 구동이 비교적 쉬운데
I2C(TWI)는 한 개의 버스를 시간차를 두고서 입출력을 번갈아 제어하기 때문에 상대적으로 훨씬 까다롭습니다.
이 때문에 초보자 때에 고장 많이 냅니다.
//

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include 
#include 
//
#define U08 unsigned char
#define U16 unsigned int
//
#define  LCD_PORT    PORTA
#define  LCD_C_WR    PORTB=(PORTB&0x1F)|0x80
#define  LCD_D_WR    PORTB=(PORTB&0x1F)|0xA0
//
#define  LCD_EN_1    PORTB|=0x80
#define  LCD_EN_0    PORTB&=~0x80
//
//#define  LCD_RW_1    PORTB|=0x40
//#define  LCD_RW_0    PORTB&=~0x40
//
//#define  LCD_RS_1    PORTB|=0x20
//#define  LCD_RS_0    PORTB&=~0x20
//
U08 fnd[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; //애노드
//
void Out_Seg(U08 seg,U08 com){ 
  PORTC=0xFF;     PORTF|=2;PORTF&=~2; // segment off
  PORTA=1<// common out;   portf|=4;portf&=~4; <>
  PORTC=fnd[seg]; PORTF|=2;PORTF&=~2; // segment out
}
//
void Out_led(U08 d){ PORTA=~d; PORTF|=8;PORTF&=~8; }
//
void LCD_DATA(U08 d){ LCD_PORT=d; LCD_D_WR; delay_us(1); LCD_EN_0; delay_us(50); }
void LCD_CMD (U08 c){ LCD_PORT=c; LCD_C_WR; delay_us(1); LCD_EN_0; delay_ms( 3); }
void LCD_POS(U08 c,U08 r){ LCD_CMD(0x80|(c+r*0x40)); }
void LCD_CLR(void){ LCD_CMD(1); }
void LCD_STR (U08  *s){ while(*s)LCD_DATA(*s++); }
void LCD_STRf(FU08 *s){ while(*s)LCD_DATA(*s++); }
//
void LCD_INIT(void){
    delay_ms(50);
    LCD_CMD(0x38); LCD_CMD(0x38); LCD_CMD(0x38);
    LCD_CMD(0x0E); LCD_CMD(0x06); LCD_CLR();
}
//
void main(void){
  DDRA=0xFF;     //FND_COMMON & LED
  DDRC=0xFF;     //FND_SEGMENT
  DDRF=0x0E;     //573_sel
  DDRB=0xE0;     //LCD control
  Out_led(0);    //off
  Out_Seg(16,0); //off
  LCD_INIT();
  while(1){
    Out_led(0x01); Out_Seg(1,0); LCD_POS(0,0); LCD_STRf("1"); delay_ms(500);
    Out_led(0x00); Out_Seg(0,0); LCD_POS(0,0); LCD_STRf("0"); delay_ms(500);
  }
}
간단한 CLCD 문장을 추가했습니다.
CLCD 백라이트가 4.2V인 경우 회로 조정(저항 or 다이오드 추가)이 필요합니다.

CLCD 및 GLCD 예제에서 좀 더 구체적인 설명을 해드리겠습니다. 

댓글 2

조회수 1,223

전자의고수가되고싶다님의 댓글

전자의고수가되고싶다작성일

질문있습니다.
그렇다면 혹시 일반적인 CLCD 회로에서
'쓰기'를 구성하려면 RS=0, R/W=0, E=1이 되어야 하는데
 RS가 high로 갈 때 PORT A와 PORT B의 값은 각각 0xfc , 0x04가 되는 거고
R/W가 Low로 갈 때 PORT A와 PORT B의 값은 각각  0xfc , 0x04가 되는 거고
E=1이 될 때도 다 마찬가지 인가요??

master님의 댓글

master댓글의 댓글작성일

CLCD 데이터시트에 타이밍 차트가 나와있습니다.
https://www.basic4mcu.com/bbs/board.php?bo_table=gesiyo10&wr_id=12
강좌글을 참고하셔도 됩니다.

2017년 128강좌HOME > 2017년 128강좌 목록

2017년 128강좌 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 593
공지 사이트 이용 안내댓글[8] master 17-10-29 7619
31 [BK-AVR128] WS2812B 키트 17-09-12 674
30 [BK-AVR128] LCD 시간표시 키트 17-09-12 808
29 [BK-AVR128] KEY 매트릭스 추가 키트 17-09-12 627
28 [BK-AVR128] DS1302(RTC) read & write 키트 17-09-12 799
27 [BK-AVR128] LED & FND 타이머2 인터럽트로 구동 키트 17-09-12 646
26 [OpenM128] NRF24L01 RF Board (B) 키트 17-09-12 533
25 [OpenM128] FAT45DBXX DataFlash Board 키트 17-09-12 477
24 [OpenM128] FT245 USB FIFO Board (mini) 키트 17-09-12 479
23 [OpenM128] PCF8563 RTC Board 키트 17-09-12 491
22 [OpenM128] PL2303 USB UART Board (mini) 키트 17-09-12 641
21 [OpenM128] AD Keypad 키트 17-09-12 541
20 [OpenM128] 2.2inch 320x240 Touch LCD (A) 키트 17-09-12 848
19 [OpenM128] Hardware design 이미지 키트 17-09-12 593
게시물 검색

2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2017
모바일버전으로보기