2011년8월26일_ARM_CLCD타이밍최적화, CGRAM에 자신의 이름을 넣어 출력하기

 


요즘 이상하게 집중이 안됨 ㅠㅠ



참조(Reference)




DSCN4013DSCN4014




DSCN4010




   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: