안녕하세요 L입니다.
오늘은
마무리하지
못했던
캐릭터 LCD 작동을
시켜
보았습니다 !!
캐릭터LCD 수업은
한번더
남았군요 !!
그럼 ARM 다음시간에
계속 ...
★ 캐릭터 LCD
ㆍ아래 스팩을
참고하여
세팅한다.
◈ arm.h 헤더파일 |
#define LCD_RS (1<<29) #define LCD_RW (1<<30) #define LCD_EN (1<<31) #define LCD_BS 0x00FF0000 #define LCD_ALL (LCD_RS | LCD_RW | LCD_EN | LCD_BS) #define RETURN_Home 0x02 /* LCD 데이터 버스 메크로 */ #define LCD_DB(x) ((x)<<(16)) |
◈ Lcd.h 헤더파일 |
#ifndef __LCD_H__ #define __LCD_H__ #include "arm.h" #define Function_set 0x38 // Function set #define Entry_Mode 0x06 // Entry Mode #define Cursor_Dis 0x1c // Cursor or display shift #define Display_on_off 0x0c // Display on/off #define Clear_Dis 0x01 // Clear
void LCD_Init(void); void init_LCD(void); void LCD_CLEAR(void); void LCD_return(void); void LCD_inst(unsigned char); void LCD_data(unsigned char);
#endif // __LCD_H__ |
◈ lcd.c 파일 |
#include "arm.h" #include "lcd.h"
#define EMB_delay(x) for(dly = 0; (x) > dly;dly++) void init_LCD(void) { PMC_PCER = 1 << PIOA; PIO_OWER = LCD_ALL; // I/O 기능 선택 PIO_PER = LCD_ALL; // pin 활성화 PIO_OER = LCD_ALL; // IO 출력 기능 활성화 LCD_Init();
return ; }
/* LCD CLEAR 기능 함수 */ void LCD_CLEAR(void) { volatile unsigned int dly; PIO_CODR = LCD_ALL; // LCD_ALL 을 Low 로 변환 한다. PIO_SODR = LCD_EN; // LCD_EN(E)만 Hight 엣지상태로 만든다. EMB_delay(100000); PIO_SODR = LCD_DB(0x01); // Function set DL = 1(8bit), n = 1(towline) f=0 (5x7dot) EMB_delay(100000); // t_AS : 40 ns min 정도의 시간을 번다. PIO_CODR = LCD_EN; // LCD_ALL 을 Low 로 변환 한다. EMB_delay(100000);
return ; }
void LCD_Init(void) { LCD_inst(Function_set); LCD_inst(Entry_Mode); LCD_inst(Cursor_Dis); LCD_inst(Display_on_off); LCD_inst(Clear_Dis); LCD_inst(RETURN_Home);
return; }
/* 그냥 참고용 */ void LCD_Init_temp(void) { volatile unsigned int dly; /* Function set */ PIO_CODR = LCD_ALL; // LCD_ALL 을 Low 로 변환 한다. PIO_SODR = LCD_EN; // LCD_EN(E)만 Hight 엣지상태로 만든다. EMB_delay(100000); PIO_SODR = LCD_DB(0x38); EMB_delay(100000); // t_AS : 40 ns min 정도의 시간을 번다. PIO_CODR = LCD_EN; // LCD_ALL 을 Low 로 변환 한다. EMB_delay(100000); /* Entry set */ PIO_CODR = LCD_ALL; // LCD_ALL 을 Low 로 변환 한다. PIO_SODR = LCD_EN; // LCD_EN(E)만 Hight 엣지상태로 만든다. EMB_delay(100000); PIO_SODR = LCD_DB(0x06); // Entry mode :: ID = Increment EMB_delay(100000); // t_AS : 40 ns min 정도의 시간을 번다. PIO_CODR = LCD_EN; // LCD_ALL 을 Low 로 변환 한다. EMB_delay(100000);
/* Cursor or display shift */ PIO_CODR = LCD_ALL; // LCD_ALL 을 Low 로 변환 한다. PIO_SODR = LCD_EN; // LCD_EN(E)만 Hight 엣지상태로 만든다. EMB_delay(100000); PIO_SODR = LCD_DB(0x1C); // Cursor :: S/C = 1(Display shift) R/L = 1(right move) EMB_delay(100000); // t_AS : 40 ns min 정도의 시간을 번다. PIO_CODR = LCD_EN; // LCD_ALL 을 Low 로 변환 한다. EMB_delay(100000);
/* Display on/off */ PIO_CODR = LCD_ALL; // LCD_ALL 을 Low 로 변환 한다. PIO_SODR = LCD_EN; // LCD_EN(E)만 Hight 엣지상태로 만든다. EMB_delay(100000); PIO_SODR = LCD_DB(0x0C); // Display :: D = 1 EMB_delay(100000); // t_AS : 40 ns min 정도의 시간을 번다. PIO_CODR = LCD_EN; // LCD_ALL 을 Low 로 변환 한다. EMB_delay(100000);
/* Clear */ LCD_CLEAR();
PIO_CODR = LCD_ALL; // LCD_ALL 을 Low 로 변환 한다. PIO_SODR = LCD_RS; // 글자전송 PIO_SODR = LCD_EN; // LCD_EN(E)만 Hight 엣지상태로 만든다. EMB_delay(100000); PIO_SODR = LCD_DB('A'); // Display :: D = 1 EMB_delay(100000); // t_AS : 40 ns min 정도의 시간을 번다. PIO_CODR = LCD_EN; // LCD_ALL 을 Low 로 변환 한다. EMB_delay(100000);
return ; }
void LCD_return(void) { volatile unsigned int dly; PIO_CODR = LCD_ALL; PIO_SODR = LCD_EN; EMB_delay(100000); PIO_SODR = LCD_DB(0x02); EMB_delay(100000); PIO_CODR = LCD_EN;
EMB_delay(100000); return ; }
void LCD_inst(unsigned char UC_inst) { volatile unsigned int dly; PIO_CODR = LCD_ALL; // LCD_ALL 을 Low 로 변환 한다. PIO_SODR = LCD_EN; // LCD_EN(E)만 Hight 엣지상태로 만든다. EMB_delay(100000); PIO_SODR = LCD_DB(UC_inst); EMB_delay(100000); // t_AS : 40 ns min 정도의 시간을 번다. PIO_CODR = LCD_EN; // LCD_ALL 을 Low 로 변환 한다. EMB_delay(100000);
return ; }
void LCD_data(unsigned char UC_data) { volatile unsigned int dly; PIO_CODR = LCD_ALL; // LCD_ALL 을 Low 로 변환 한다. PIO_SODR = LCD_RS; // 글자전송 PIO_SODR = LCD_EN; // LCD_EN(E)만 Hight 엣지상태로 만든다. EMB_delay(100000); PIO_SODR = LCD_DB(UC_data); EMB_delay(100000); // t_AS : 40 ns min 정도의 시간을 번다. PIO_CODR = LCD_EN; // LCD_ALL 을 Low 로 변환 한다. EMB_delay(100000);
return ; } |
◈ main 함수 |
#include "arm.h" #include "led.h" #include "aic.h" #include "ultra.h" #include "lcd.h"
void Init(void);
int main() {
Init(); while(1); return 0; }
void Init(void) { init_LCD(); LCD_data('G'); LCD_data('o'); LCD_data('o'); LCD_data('d'); LCD_data('-'); LCD_data('B'); LCD_data('o'); LCD_data('y');
return ; } |
< 실행
결과 >
※ 캐릭터LCD 3번 pin 은 ARM의
그라운에
연결
◈ 스트링 함수 |
void LCD_String(void *vp) { while(0 != (*((unsigned char *)vp)) ) { LCD_data( (*((unsigned char *)vp)) ); vp = ((unsigned char *)vp) +1; }
return ; } |
◈ main 함수 |
#include "arm.h" #include "led.h" #include "aic.h" #include "ultra.h" #include "lcd.h"
void Init(void);
int main() {
Init(); while(1); return 0; }
void Init(void) { init_LCD();
LCD_String("test");
return ; } |
ㆍ위와
같이
스트링함수로
만들어
사용가능하다.
ㆍ딜레이
값을
줄이면 LCD 창의
출력
속도를
빠르게
할
수
있다.
궁금하신
점은
댓글로
남겨
주세요 !!
오늘도
좋은
하루
되세요