10주차 문자 LCD 의인터페이스회로및구동함수 Next-Generation Networks Lab.
5. 16x2 CLCD 모듈 (HY-1602H-803) 그림 11-18 19
핀설명표 11-11 번호 분류 핀이름 레벨 (V) 기능 1 V SS or GND 0 GND 전원 2 V Power DD or V CC +5 CLCD 구동전원 3 V 0 - CLCD 명암조절 4 제어신호 RS H/L HIGH: 데이터전송, LOW: 명령어전송 5 Control R/W H/L HIGH: 읽기, LOW: 쓰기 6 Signal EN H / H L Data Enable 명령입력시마다펄스전송 7 DB0 H/L 데이터버스 0 8 DB1 H/L 데이터버스1 9 DB2 H/L 데이터버스2 10 데이터신호 DB3 H/L 데이터버스3 Data Signal 11 DB4 H/L 데이터버스4 / 4 bit 제어시사용 12 DB5 H/L 데이터버스 5 / 4 bit 제어시사용 13 DB6 H/L 데이터버스6 / 4 bit 제어시사용 14 DB7 H/L 데이터버스7 / 4 bit 제어시사용 15 후면광원 A +5 후면광원애노드전원 16 Back Light K 0 후면광원캐소드전원 20
회로구성 21
sbi와 cbi 레지스터 REG0의 Bit 7,4,1을 Set 한후에다시 Bit 4,1을 Clear REG0 = 0x92; // BIT 7,4,1 Set REG0 &= 0xED; // BIT 4,1 Clear #define sbi(x,y) (x = (1<<y)) #define cbi(x,y) (x &= ~(1<<y)) REG0 = 0x01<<7; REG0 = 0x01<<4; REG0 = 0x01<<1; REG0 &= ~(0x01<<4); REG0 &= ~(0x01<<1); // BIT 7 Set // BIT 4 Set // BIT 1 Set // BIT 4 Clear // BIT 1 Clear sbi(reg0, 7); sbi(reg0, 4); sbi(reg0, 1); cbi(reg0, 4); cbi(reg0, 1); REG0 = (0x01<<7) (0x01<<4) (0x01<<1) REG0 &= ~((0x01<<4) & (0x01<<1)); // BIT 7,4,1 Set // BIT 4,1 Clear 22
함수 (function) (5장) Call by value Call by reference 함수구조 function name : 함수이름 argument : 함수로입력되는데이터형 return type : 함수가돌려주는데이터형 그림 5-6 23
float my_func3 ( int x, char y ) 그림 5-7 그림 5-9 그림 5-8 void my_func1 ( int x ) float my_func2 ( void ) 24
CLCD 헤더파일 헤더파일에포함된기능 CLCD 인터페이스를위한하드웨어설정 HD44780에서지원되는다양한기능을설정하기위한정의 CLCD 인터페이스를위한함수구현 CLCD 인터페이스를위한함수 void clcd_port_init(void); CPU 포트초기화함수 void clcd_init_8bit(void); CLCD 인터페이스초기화함수 void clcd_busy_check(void); CLCD의상태확인함수 void clcd_command(int8 cmd); 명령어출력함수 void clcd_data(int8 data); 데이터출력함수 void clcd_str(char *string); 문자열출력함수 void clcd_position(int8 col, INT8 row); CLCD 위치이동함수 void clcd_clear(void); CLCD 화면클리어함수 25
CLCD 헤더파일 (1) - 하드웨어설정 /* Header file for 8 bits Data Bus */ #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)) 26
CLCD 헤더파일 (2) 함수선언및효과설정 // Function Protocol 선언 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); #define CMD_CLEAR_DISPLAY #define CMD_RETURN_HOME #define CMD_ENTRY_MODE_SET_OPTION1 #define CMD_ENTRY_MODE_SET_OPTION2 #define CMD_ENTRY_MODE_SET_OPTION3 #define CMD_ENTRY_MODE_SET_OPTION4 0x01 // Clear All Display 0x02 // Cursor Position -> Return Home 0x04 // 커서좌측이동, 화면이동없음 0x05 // 커서좌측이동, 화면이동 0x06 // * 커서우측이동, 화면이동없음 0x07 // 커서우측이동, 화면이동 #define CMD_DISPLAY_OPTION1 0x08 // 화면 OFF, 커서 OFF, 커서점멸 OFF #define CMD_DISPLAY_OPTION2 DISPLAY 0x09 // 화면 OFF, 커서 OFF, 커서점멸 ON 27
헤더파일 (3) - 효과설정 #define CMD_DISPLAY_OPTION3 0x0A // 화면 OFF, 커서 ON, 커서점멸 OFF #define CMD_DISPLAY_OPTION4 0x0B // 화면 OFF, 커서 ON, 커서점멸ON #define CMD_DISPLAY_OPTION5 DISPLAY 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 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 OPTION8 0x3C 3C// 8 비트, 화면 2 행, 5x11 Font 28
그림 11-12 Function set Function set CLCD 초기화함수 void clcd_init_8bit(void) clcd_ command(cmd _ FUNCTION_ SET_ OPTION7); _delay_ms(5); clcd_command(cmd_fucntion_set_option7); _delay_ms(1); clcd_command(cmd_fucntion_set_option7); clcd_command(cmd_fucntion_set_option7); Function set clcd_command(cmd_display_option8); Function set Display on Display clear Entry mode set clcd_command(cmd_clear_display); command(cmd CLEAR DISPLAY); clcd_command(cmd_entry_mode_set_option3); 29
BF bit 읽기함수, 명령어쓰기함수, 데이터쓰기함수 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; BUSY cbi(control_bus, EN); //EN=0 busy_time++; while ((busy_flag &BUSYBIT) BUSY_BIT) && (busy_time<500)); DATA_BUS_DIRECTION=0xFF; DIRECTION=0xFF; 30 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, O EN); //EN=0
문자열쓰기함수, 포트초기화함수, Cursor 위치함수 // *string: 출력할문자열 void clcd_str(char *string) while(*string!= '\0') clcd_data(*string); string++; void clcd_str_delay(char *string) while(*string i!= '\0') clcd_data(*string); _delay_ms(300); string++; void clcd_port_init(void) void clcd_position(int8 col, INT8 row) CONTROL_BUS_DIRECTION = 0xF0; clcd_command(0x80 command(0x80 (col * 0x40 + row)); DATA_BUS_DIRECTION= 0xFF; CONTROL_BUS= 0x00; DATA_BUS= 0x00; void clcd_clear(void) clcd_command(cmd_clear_display); 31
DD-RAM 의주소및 Cursor 위치함수 ( 그림 11-14) 14) // row 0:15, column 0:1 // position: DD-RAM의주소 void clcd_position(int8 ld col, INT8 row) clcd_command(0x80 (col * 0x40 + row)); 32
Display position & DD-RAM 주소 of 16x2 모듈 ( 그림 11-14) 14) 33
예제 예제 11.1 ASCII 문자출력 CLCD 를포트 A 와포트 C 로연결한다. 포트 A: 데이터버스, 포트 C: 제어버스 CG-ROM에저장된데이터를활용하여 CLCD 화면에 Love 문자를출력한다. 예제 11.2 문자열출력 CLCD를포트 A와포트 C로연결한다. 포트 A: 데이터버스, 포트 C: 제어버스 문자열출력함수를활용하여 CLCD 화면에 Shinhan University 문자열을출력한다. 34
CLCD 모듈 (8 비트 ) Port C (PC5 ~ PC7) Port A (PA0 ~ PA7) CPU Board 35
예제 11-1 ASCII 문자출력 #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> #include "clcd_d8.h" int main (void) clcd_port_init( ); clcd_init_8bit( ); while(1) clcd_position(0,7); clcd_data(0x4c); clcd_data(0x6f); clcd_data(0x76); clcd_data(0x65); _delay_ms(2000); clcd_position(1,3); clcd_data( L ); lddt( L ) clcd_data( o ); clcd_data( v ); clcd_data( data( e ); e); _delay_ms(2000); clcd_clear( ); _delay_ms(2000); 36
예제 11-2 문자열출력 #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> #include "clcd_d8.h" int main (void) char data1[ ] =!! Hello!!"; char data2[ ] = Shinhan University"; clcd_port_init( ); clcd_init_8bit( ); return 0; while(1) clcd_position(0,0); clcd_str(data1); _delay_ms(500); clcd_position(1,0); clcd_str(data2); _delay_ms(500); clcd_clear( ); _delay_ms(2000); 37