LCD.c / LCD.h / main.c |
LCD.c #include "LCD.h" void Lcd_Init() { RCC_APB2_ENR = (1<<8); // RCC_APB2_ENR // IOPGEN (Port G에 클럭 공급) GPIOG_CRH = 0x33333333; GPIOG_CRL = 0x33333333; GPIOG_ODR = 0xffff; GPIOG_BRR = LCD_RS | LCD_RW | LCD_EN | LCD_BS; LCD_cmd_write(LCD_FUNC); // DL 8bit High, N 2line High, F 5*7 dot High LCD_cmd_write(LCD_ENTRY); // 커서는 오른쪽 쉬프트, 화면은 고정 LCD_cmd_write(LCD_CURSOR); // S/C 커서 보이게, R/L 커서를 오른쪽으로 LCD_cmd_write(LCD_DISPLAY); // D 화면 ON, C 커서 OFF, B 커서자리블링크 커서 OFF LCD_cmd_write(LCD_CLEAR); // 화면지우기 LCD_cmd_write(LCD_HOME); // 커서를 제일 앞으로 return ; } void LCD_cmd_write(unsigned char ucdata) // instruction data input { volatile unsigned int iCnt; GPIOG_BRR = LCD_EN; // 1을 넣어주면 LCD_EN 이 0v clear out 으로 된다. GPIOG_BRR = LCD_RS; // 1을 넣어주면 LCD_RS 가 Low 가 된다. GPIOG_BRR = LCD_RW; // 1을 넣어주면 LCD_RW 가 Low 가 된다. for(iCnt=0;iCnt<LCD_delay-LCD_delay1;++iCnt); // RS, RW 가 Low로 가기전까지, 15ns // EN 이 High 되는 순간 전까지 딜레이 GPIOG_BSRR = LCD_EN; // EN을 High for(iCnt=0;iCnt<LCD_delay-LCD_delay2;++iCnt); // EN이 올라가고 나서 DB가 변화를 가진다, 160ns GPIOG_BRR = LCD_BS; // DB에 쓰레기값을 비워준다. GPIOG_BSRR = (ucdata<<3); // Data Bus 핀을 지정 for(iCnt=0;iCnt<LCD_delay-LCD_delay3;++iCnt); // DB에서 Input 되기전 까지 EN 을 유지, 60ns GPIOG_BRR = LCD_EN; // EN 을 다시 Low 시켜준다. for(iCnt=0;iCnt<LCD_delay-LCD_delay4;++iCnt); // EN 을 제외한 나머지 RS,RW,DB는 유지, 35ns return ; } void LCD_data_write(unsigned char ucdata) // data input { volatile unsigned int iCnt; GPIOG_BRR = LCD_EN; // 1을 넣어주면 LCD_EN 이 0v clear out 으로 된다. GPIOG_BSRR = LCD_RS; // 1을 넣어주면 LCD_RS 가 High 가 된다. GPIOG_BRR = LCD_RW; // 1을 넣어주면 LCD_RW 가 Low 가 된다. for(iCnt=0;iCnt<LCD_delay-LCD_delay1;++iCnt); // RS, RW 가 Low로 가기전까지, // EN 이 High 되는 순간 전까지 딜레이 GPIOG_BSRR = LCD_EN; // EN을 High for(iCnt=0;iCnt<LCD_delay-LCD_delay2;++iCnt); // EN이 올라가고 나서 DB가 변화를 가진다. GPIOG_BRR = LCD_BS; // DB에 쓰레기값을 비워준다. GPIOG_BSRR = (ucdata<<3); // 0x10101010, DB에 입력을 해줌! for(iCnt=0;iCnt<LCD_delay-LCD_delay3;++iCnt); // DB에서 Input 되기전 까지 EN 을 유지 GPIOG_BRR = LCD_EN; // EN 을 다시 Low 시켜준다. for(iCnt=0;iCnt<LCD_delay-LCD_delay4;++iCnt); // EN 을 제외한 나머지 RS,RW,DB는 유지 return ; } void LCD_string(void *vp) { while(1) { if( *((unsigned char *)vp) == 0 ) { break; } LCD_data_write(*((unsigned char *)vp)); vp = ((unsigned char *)vp) + 1; } } void LCD_number(unsigned int i_line, unsigned short us_Num) // short 로 하는 이유는 { // One 8-channel 10-bit Analog-to-Digital Converter, unsigned char uc_string[] = "00000"; // Four Channels Multiplexed with Digital I/Os // ADC컨버터는 10bit 를 쓰기 때문임. uc_string[0] = '0'+(us_Num/10000); uc_string[1] = '0'+((us_Num%10000)/1000); uc_string[2] = '0'+((us_Num%1000)/100); uc_string[3] = '0'+((us_Num%100)/10); uc_string[4] = '0'+(us_Num%10); if( 1 == i_line ) // 화면지우기 { LCD_cmd_write(0x80); LCD_string("TEMP : "); } else // 커서를 제일 앞으로 { LCD_cmd_write(0xC0); LCD_string("LIGHT: "); } LCD_string(uc_string); } LCD.h #ifndef _LCD_H_ #define _LCD_H_
|
---- 참고 자료 ---
-----------------
---- 소스 ----
-------------
---컴파일러-------
Keil uVersion4 사용
------------------
'Cortex-M3' 카테고리의 다른 글
2013.10.16 _ ARM _ Boot Code 분석 ( 어셈블리 ) (0) | 2013.10.17 |
---|---|
2013.10.16_컴파일 및 프로그램 로드 방법 by 유진 (0) | 2013.10.16 |
20131008_ Cortex-M3 컴파일 및 다운로드 to 디바이스 (0) | 2013.10.08 |