티스토리 뷰

C언어

캐릭터 LCD 에 문자(열) 출력하기

시작이반입니다 2021. 8. 2. 04:00

캐릭터 LCD 에 문자(열) 출력하기

이번에는 캐릭터 LCD 를 제어하는 프로그램을 만들어 보겠습니다. 캐릭터 LCD 의 구성에 대해서는 "C 제어 강좌 11번 "캐릭터 LCD 의 구성과 명령"을 참조하세요. 베타 키트에서는 LCD 의 제어단자가 포트 0 의 하위 세 비트에 연결되어 있습니다. P0.0 - RS (레지스터 선택) P0.1 - R/W (읽고 쓰기 선택) P0.2 - E (인에이블 신호) 또한 LCD 의 데이터 버스가 포트 1 에 연결되어 있습니다. P1.0 - DB0 ... P1.7 - DB7 [참고] 비지 플래그를 체크하지 않고 시간 지연 방식을 사용하여 LCD 를 제어하도록 하겠습니다. 비지 플래그를 사용하는 방식은 후반부에 기술합니다. LCD 구동 프로그램을 만들때는 첫째 비지 플래그를 체크하는 함수 또는 시간 지연함수(delay())를 만들고 둘째 명령 라이트 함수(lcd_command())를 만들고 세째 데이터 라이트 함수(lcd_putc())를 만들면 기본적인 함수는 완성된 것입니다. 추가로 데이터 라이트 함수를 이용하여 문자열 출력 함수(lcd_puts())를 만들면 편리해 집니다. [참고] 캐릭터 LCD 의 구성과 명령은 C제어 강좌 11 번 "[[초급]] 캐릭터 LCD의 구성과 명령" 을 참고 하세요. #include sbit rs = P0^0; sbit rw = P0^1; sbit en = P0^2; #define clear() lcd_command(0x1) /* Clear display LCD */ #define origin() lcd_command(0x2) /* Set to origin LCD */ #define row1() lcd_command(0x80) /* Begin at Line 1 */ #define row2() lcd_command(0xC0) /* Begin at Line 2 */ /*************************************************** * Prototype(s) * ***************************************************/ void delay(int k); void enable(void); void lcd_command(char command); void lcd_putc(char ascii); void lcd_puts(char *str); void lcd_init(void); /*************************************************** * LCD Sources * ***************************************************/ void delay(int k) { while(k--); } void enable(void) { en = 1; delay(1); en = 0; } void lcd_command(char command) { P1 = command; rs = 0; rw = 0; enable(); delay(400); } void lcd_putc(char ascii) { P1 = ascii; rs = 1; rw = 0; enable(); delay(8); } void lcd_puts(char* str) { while(*str) lcd_putc(*str++); } void lcd_init() { lcd_command(0x30); lcd_command(0x38); lcd_command(0x06); lcd_command(0x0c); lcd_command(0x01); } void main(void) { char str1[] = "Hello LCD"; char str2[] = "< Line 2: OK >"; int k; delay(10000); lcd_init(); do { row1(); lcd_puts(str1); row2(); lcd_puts(str2); for(k=0; k<100; k++) delay(2000); clear(); for(k=0; k<50; k++) delay(2000); } while (1); } 위 프로그램을 컴파일 한후 EngineISP 로 라이트 하면 라이트가 끝나고 확인(Verify) 과정에서 라이트 에러 메시지가 나옵니다. 이 때 (라이트는 성공률이 99.9% 이므로) 확인 버튼을 누르면 정상적으로 동작을 합니다. Verify 과정에서 에러는 ISP 핀과 LCD 의 데이터 핀이 중첩되어 있어서 발생되는 것입니다. [참고] EngineISPB2 는 라이트와 베리파이가 분리되어 있어서 그냥 라이트 하면 됩니다. [참고] CG-ROM 문자 패턴은 강좌용 자료실 4 번 에 있습니다. 위 소스를 lcd.h 와 lcd.c 그리고 main.c 로 분리해서 작성합니다. 컴파일 할 때는 main.c 와 lcd.c 파일을 포함해서 컴파일하면 됩니다. // lcd.h 파일 #ifndef _LCD_H #define _LCD_H sbit rs = P0^0; sbit rw = P0^1; sbit en = P0^2; #define clear() lcd_command(0x1) /* Clear display LCD */ #define origin() lcd_command(0x2) /* Set to origin LCD */ #define row1() lcd_command(0x80) /* Begin at Line 1 */ #define row2() lcd_command(0xC0) /* Begin at Line 2 */ /*************************************************** * Prototype(s) * ***************************************************/ void delay(int k); void enable(void); void lcd_command(char command); void lcd_putc(char ascii); void lcd_puts(char *str); void lcd_init(void); #endif // lcd.c 파일 #include #include "lcd.h" /*************************************************** * Sources * ***************************************************/ void delay(int k) { while(k--); } void enable(void) { en = 1; delay(1); en = 0; } void lcd_command(char command) { P1 = command; rs = 0; rw = 0; enable(); delay(400); } void lcd_putc(char ascii) { P1 = ascii; rs = 1; rw = 0; enable(); delay(8); } void lcd_puts(char* str) { while(*str) lcd_putc(*str++); } void lcd_init() { lcd_command(0x30); lcd_command(0x38); lcd_command(0x06); lcd_command(0x0c); lcd_command(0x01); } // main.c 파일 #include #include "lcd.h" void main(void) { char str1[] = "Hello LCD"; char str2[] = "< Line 2: OK >"; int k; delay(10000); lcd_init(); do { row1(); lcd_puts(str1); row2(); lcd_puts(str2); for(k=0; k<100; k++) delay(2000); clear(); for(k=0; k<50; k++) delay(2000); } while (1); }

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
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
글 보관함