2011년8월26일_ARM_CLCD타이밍최적화, CGRAM에 자신의 이름을 넣어 출력하기
요즘 이상하게 집중이 안됨 ㅠㅠ
참조(Reference) |
1: /*********************************************************
2:
3: 제 목: CLCD (문자LCD)자유롭게 다루기
4: 목 표: ① LCD관련 함수들의 딜레이값을 조정하여 최적화
5: ② CGRAM에 자기 이름을 넣어 출력하기
6:
7: 작 성 자: 김수만
8: 작성일자: 2011년 7월 13일...제어핀과 데이터버스 정의
9: 수정일자: 2011년 7월 14일...LCD명령정의
10: 2011년 8월 25일...LCD_Inst(), LCD_Data()
11: 2011년 8월 26일...최적화, CGRAM
12: LCD_String
13:
14: *********************************************************/
15:
16:
17: /*********************************************************
18: PIO (AT91SAM7S256)
19: *********************************************************/
20: #define PIOA_PER (*(volatile unsigned int *)0xFFFFF400)
21: #define PIOA_OER (*(volatile unsigned int *)0xFFFFF410)
22: #define PIOA_PPUDR (*(volatile unsigned int *)0xFFFFF460)
23: #define PIOA_CODR (*(volatile unsigned int *)0xFFFFF434)
24: #define PIOA_SODR (*(volatile unsigned int *)0xFFFFF430)
25:
26: /*********************************************************
27: 16 * 2line CLCD
28: *********************************************************/
29: //7월 13일 추가
30: #define CLCD_RS (1 << 8) //LCD레지스터 선택 (1 = DATA, 0 = INST)
31: #define CLCD_RW (1 << 9) //LCd읽기/쓰기 선택( 1 = READ, 0 = WRITE)
32: #define CLCD_EN (1 << 10) //LCD활성.
33: #define CLCD_BS (0xFF << 16) //데이터버스 I/O
34: //7월 14일 추가
35: #define CLCD_INST_CD 0x01 //Clear Display명령
36: #define CLCD_INST_RH 0x02 //Return Home명령
37: #define CLCD_INST_FS 0x38 //Function Set명령
38: #define CLCD_INST_EM 0x06 //Entry Mode Set명령
39: #define CLCD_INST_DO 0x0C //Display ON/OFF Control명령 커서OFF
40: #define CLCD_INST_CS 0x14 //Cursor Shift명령 - 커서를 right
41: #define CLCD_INST_DD 0x80 //DDRAM 0번지선택.
42: #define CLCD_INST_CG 0x40 //CGRAM 0번지선택.
43: #define CLCD_DELAY(Z) for(iCount = 0 ; (Z) > iCount ;++iCount) //시간지연
44: #define LED (1 << 0) //상태확인용 LED
45:
46: volatile static unsigned int iCount = 0; //딜레이용 카운트 변수, unsigned가 더 fast
47:
48:
49: void PORT_INIT(void); //PORT초기화
50: void LCD_INIT(void); //LCD초기화
51: void LCD_Inst(unsigned char); //LCD에 명령을 내리는 함수.
52: void LCD_Data(unsigned char); //LCD에 데이터를 보내는 함수.
53: void Set_Font(void); //사용자정의 문자를 CLCD의 CGRAM에 저장.
54: void LCD_Print(const char *); //LCD에 문자열을 출력하는 함수.
55: void LCD_Cursor(char, char); //LCD커서를 이동시키는 함수.
56:
57: int main(void)
58: {
59: PORT_INIT();
60: LCD_INIT();
61: Set_Font();
62:
63: //LCD_Inst(0x81); // line 0
64: LCD_Cursor(0, 1);
65: LCD_Data(0x00);
66: LCD_Data(0x01); // 기
67:
68: //LCD_Inst(0xC2); // line 1
69: LCD_Cursor(1, 2);
70: LCD_Data(0x02); // ㅁ
71:
72: //LCD_Inst(0x84); // line 0
73: LCD_Cursor(0, 4);
74: LCD_Data(0x03); // ㅅ
75:
76: //LCD_Inst(0xC4); // line 1
77: LCD_Cursor(1, 4);
78: LCD_Data(0x04); // ㅜ
79:
80: //LCD_Inst(0x86); // line 0
81: LCD_Cursor(0, 6);
82: LCD_Data(0x02);
83: LCD_Data(0x05); // 마
84:
85: //LCD_Inst(0xC7); // line 1
86: LCD_Cursor(1, 7);
87: LCD_Data(0x06); // ㄴ
88:
89: //LCD_Inst(0x89); // line 0
90: LCD_Cursor(0, 9);
91: LCD_Data(0x07); // ♡
92:
93: //LCD_Inst(0xCA); // line 1
94: LCD_Cursor(1, 10);
95: LCD_Print("Heart");
96:
97: while(1) //return되면 안됨. 돌아갈 곳이 없어. 집이 없어.
98: {
99: PIOA_SODR = LED;
100: CLCD_DELAY(1000000);
101: PIOA_CODR = LED;
102: CLCD_DELAY(1000000);
103: }
104: return 0;
105: }
106:
107: void PORT_INIT(void)
108: {
109: // Configure the pin in output
110: PIOA_OER = CLCD_BS | CLCD_RS | CLCD_RW | CLCD_EN | LED;
111: // Set the PIO controller in PIO mode instead of peripheral mode
112: PIOA_PER = CLCD_BS | CLCD_RS | CLCD_RW | CLCD_EN | LED;
113: // Disable pull-up
114: PIOA_PPUDR = CLCD_BS | CLCD_RS | CLCD_RW | CLCD_EN | LED;
115: PIOA_CODR = CLCD_BS; //데이터 버스 클리어.
116: PIOA_SODR = LED; //LED끄기
117:
118: return ;
119: }
120:
121: void LCD_INIT(void)
122: {
123: CLCD_DELAY(60000); //30ms이상 대기.
124: LCD_Inst(CLCD_INST_FS);
125: CLCD_DELAY(8200); //4.1ms이상 대기.
126: LCD_Inst(CLCD_INST_FS);
127: CLCD_DELAY(200); //100us이상 대기.
128:
129: LCD_Inst(CLCD_INST_FS);
130: LCD_Inst(CLCD_INST_FS);
131: LCD_Inst(CLCD_INST_EM);
132: LCD_Inst(CLCD_INST_CS);
133: LCD_Inst(CLCD_INST_DO);
134: LCD_Inst(CLCD_INST_CD);
135: CLCD_DELAY(3040); //1.52ms이상 대기.
136: LCD_Inst(CLCD_INST_DD); //첫행으로.
137: LCD_Inst(CLCD_INST_RH); //리턴홈.
138: CLCD_DELAY(3040); //1.52ms이상 대기.
139:
140: return ;
141: }
142:
143:
144:
145: // LCD에 명령을 내리는 함수
146: void LCD_Inst(unsigned char uiInst) //LCD에 명령을 내리는 함수.
147: {
148: PIOA_CODR = CLCD_RS; //CLCD instruction resgister 선택
149: PIOA_CODR = CLCD_RW; //write모드
150: CLCD_DELAY(1); //40ns정도딜레이필요.
151: PIOA_SODR = CLCD_EN; //CLCD 활성
152: PIOA_CODR = CLCD_BS; //databus 초기화 0x00
153: PIOA_SODR = (uiInst << 16); //데이터 버스에 명령 올림.
154: CLCD_DELAY(1); //100ns정도딜레이필요.
155: PIOA_CODR = CLCD_EN; //CLCD 비활성
156: CLCD_DELAY(80); //Data write to CG RAM or DD RAM에 필요한 시간. 41us
157:
158: return ;
159: }
160:
161: // LCD에 데이터를 보내는 함수.
162: void LCD_Data(unsigned char uiData) //LCD에 데이터를 보내는 함수.
163: {
164: PIOA_SODR = CLCD_RS; //CLCD data resgister 선택
165: PIOA_CODR = CLCD_RW; //write모드
166: CLCD_DELAY(1); //40ns정도딜레이필요.
167: PIOA_SODR = CLCD_EN; //CLCD 활성
168: PIOA_CODR = CLCD_BS; //databus 초기화 0x00
169: PIOA_SODR = (uiData << 16); //데이터 버스에 데이터 올림.
170: CLCD_DELAY(1); //100ns정도딜레이필요.
171: PIOA_CODR = CLCD_EN; //CLCD 비활성
172: CLCD_DELAY(80); //Data write to CG RAM or DD RAM에 필요한 시간. 41us
173:
174: return ;
175: }
176:
177: // 사용자정의 폰트를 CLCD CGRAM에 저장하는 함수.
178: void Set_Font()
179: {
180: unsigned int iLoop;
181: unsigned char font[] =
182: {
183: 0x1F, 0x01, 0x01, 0x02, 0x02, 0x04, 0x08, 0x00, // ㄱ
184: 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, // ㅣ
185: 0x00, 0x1E, 0x12, 0x12, 0x12, 0x1E, 0x00, 0x00, // ㅁ
186: 0x00, 0x04, 0x0A, 0x0A, 0x11, 0x11, 0x00, 0x00, // ㅅ
187: 0x1F, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, // ㅜ
188: 0x04, 0x04, 0x04, 0x07, 0x04, 0x04, 0x04, 0x00, // ㅏ
189: 0x00, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, // ㄴ
190: 0x00, 0x0A, 0x15, 0x11, 0x11, 0x0A, 0x04, 0x00 // ♡
191: };
192:
193: //CGRAM에 폰트 넣기.
194: LCD_Inst(0x40); //set CG RAM address
195: for(iLoop = 0 ; iLoop < sizeof(font) ; ++iLoop)
196: {
197: LCD_Data(font[iLoop]);
198: }
199:
200: return ;
201: }
202:
203: //CLCD 문자열 출력함수 LCD_Data가 필요.
204: void LCD_Print(const char *str)
205: {
206: int iLoop = 0;
207:
208: while('\0' != str[iLoop]) //NULL문자를 만나면 그만.
209: {
210: LCD_Data(str[iLoop]); //1Byte씩 출력.
211: ++iLoop;
212: }
213:
214: return ;
215: }
216:
217: //CLCD 커서이동함수, LCD_Inst필요.
218: void LCD_Cursor(char iRow, char iCol)
219: { // 행(0~1), 열(0~15)
220: char cPos;
221:
222: cPos = iRow * 0x40 + iCol; //어드레스 계산
223: cPos = cPos | 0x80; //DDRAM
224: LCD_Inst(cPos); //커서이동.
225:
226: return ;
227: }
228:
229:
230: