ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [AVR] 사용자 정의 문자 선언을 통해 간단한 그림 출력
    AVR study 2013. 1. 30. 19:20
    반응형

    CGRAM의 주소값을 설정하고 사용자 정의 문자열을 선언해서 간단한 생선 그림을 만들어봤습니다.

     

    Fish.C

     

     

     

    //----------------------------------------------------------------------------------------LCD 옵션 설정문
    #define CMD_CREAR_DISPLAY     0x01 //1. Clear Display
    #define CMD_RETURN_HOME      0x02 //2. Return Home
    //3. Entry Mode Set
    #define CMD_ENTRY_MODE_SET_OPTION1   0x04 // cursor [left], Display shift[none]
    #define CMD_ENTRY_MODE_SET_OPTION2   0x05 // cursor [left], Display shift[]
    #define CMD_ENTRY_MODE_SET_OPTION3   0x06 // cursor [right], Display shift[none]
    #define CMD_ENTRY_MODE_SET_OPTION4   0x07 // cursor [right], Display shift[]
    //4. Display On/Off
    #define CMD_DISPLAY_OPTION1     0x08 // Display [Off], Cursor [Off], Cursor Blink [Off]
    #define CMD_DISPLAY_OPTION2     0x09 // Display [Off], Cursor [Off], Cursor Blink [On]
    #define CMD_DISPLAY_OPTION3     0x0A // Display [Off], Cursor [On], Cursor Blink [Off]
    #define CMD_DISPLAY_OPTION4     0x0B // Display [Off], Cursor [On], Cursor Blink [On]
    #define CMD_DISPLAY_OPTION5     0x0C // Display [On], Cursor [Off], Cursor Blink [Off]
    #define CMD_DISPLAY_OPTION6     0x0D // Display [On], Cursor [Off], Cursor Blink [On]
    #define CMD_DISPLAY_OPTION7     0x0E // Display [On], Cursor [On], Cursor Blink [Off]
    #define CMD_DISPLAY_OPTION8     0x0F // Display [On], Cursor [On], Cursor Blink [On]
    //5. Cursor or Display Shift
    #define CMD_CURSOR_DISPLAY_SHIFT_OPTION1 0x10 // [Cursor] Select, Cursor Shift [Left]
    #define CMD_CURSOR_DISPLAY_SHIFT_OPTION2 0x14 // [Cursor] Select, Cursor Shift [Right]
    #define CMD_CURSOR_DISPLAY_SHIFT_OPTION3 0x18 // [Display] Select, Display Shift [Left]
    #define CMD_CURSOR_DISPLAY_SHIFT_OPTION4 0x1C // [Display] Select, Display Shift [Right]
    //6. Function Set
    #define CMD_FUNCTION_SET_OPTION1   0x20 // [4]bit mode, [1] line, [5x8] Font
    #define CMD_FUNCTION_SET_OPTION2   0x24 // [4]bit mode, [1] line, [5x11] Font
    #define CMD_FUNCTION_SET_OPTION3   0x28 // [4]bit mode, [2] line, [5x8] Font
    #define CMD_FUNCTION_SET_OPTION4   0x2C // [4]bit mode, [2] line, [5x11] Font
    #define CMD_FUNCTION_SET_OPTION5   0x30 // [8]bit mode, [1] line, [5x8] Font
    #define CMD_FUNCTION_SET_OPTION6   0x3C // [8]bit mode, [1] line, [5x11] Font
    #define CMD_FUNCTION_SET_OPTION7   0x34 // [8]bit mode, [2] line, [5x8] Font
    #define CMD_FUNCTION_SET_OPTION8   0x38 // [8]bit mode, [2] line, [5x11] Font
    //----------------------------------------------------------------------------------------헤더파일 선언
    #include<avr/io.h>
    #include<util/delay.h>
    //----------------------------------------------------------------------------------------설정 bit 선언
    #define RS 0
    #define RW 1
    #define E 2
    #define DATA PORTA

     

    unsigned char a[]="Fish^^";
    unsigned char b[]="";
     
    void LCD_INS (unsigned char com) // LCD Instruction 함수
    {
        PORTC&=~(1<<RS); // RS bit을 0으로 마스킹
        PORTC&=~(1<<RW); // RW bit을 0으로 마스킹
        PORTC|=(1<<E); // E bit을 0으로 마스킹
        _delay_ms(50);
        DATA=com;
        _delay_ms(50);
        PORTC&=~(1<<E); // E bit을 1으로 마스킹
     
    }
     
    void LCD_WRITE_DATA (unsigned char com) // LCD DATA 쓰기 함수
    {
        PORTC|=(1<<RS); // RS bit을 1으로 마스킹
        PORTC&=~(1<<RW); // RW bit을 0으로 마스킹
        PORTC|=(1<<E); // E bit을 1으로 마스킹
        _delay_ms(30);
        DATA=com;
        _delay_ms(30);
        PORTC&=~(1<<E); // E bit을 0으로 마스킹
    }  

    void LCD_PST(unsigned char col, unsigned char row) // 문자열 디스플레이 행, 열 지정 함수
    {
        LCD_INS(0x80|(row+col*0x40));
    }

    void str(unsigned char* com) // 문자열 함수
    {
     while(*com!=0)
     {
      LCD_WRITE_DATA(*com);
      com++;
     }
    }

    void init_buffer(void) // LCD 버퍼 초기화 함수
    {
     
     PORTC|=(1<<RS);
     PORTC|=(1<<RW);
     PORTC|=(1<<E);
     _delay_ms(10);
     while(DATA!=0)
     {
      LCD_WRITE_DATA(0);
      _delay_ms(10);
     }
    }

    int main()
    {
     volatile unsigned char cnt = 0;
    // ---------------------------------------------------------------------------> 물고기 모양 문자 정의
     unsigned char fish[] = {
     0x00, 0X00, 0X00, 0X01, 0X03, 0X07, 0X0F, 0X0F,  //머리 위앞  0x00
     0x07, 0X0F, 0X1F, 0X1F, 0X1B, 0X1F, 0X1F, 0X1F,  //머리 위뒤  0x01
     0x07, 0X0F, 0X07, 0X03, 0X01, 0X00, 0X00, 0X00,  //머리 아래앞 0x02
     0x1F, 0X1F, 0X1F, 0X1F, 0X1F, 0X0F, 0X03, 0X00,  //머리 아래뒤 0x03
     0x00, 0X00, 0X00, 0X04, 0X04, 0X04, 0X0E, 0X1F,  //가시1 위  0x04
     0x0E, 0X04, 0X04, 0X04, 0X00, 0X00, 0X00, 0X00,  //가시1 아래 0x05
     0x00, 0X00, 0X00, 0X01, 0X03, 0X07, 0X0F, 0X1F,  //꼬리 위  0x06
     0x0F, 0X07, 0X03, 0X01, 0X00, 0X00, 0X00, 0X00}; //꼬리 아래  0x07

    // --------------------------------------------------------------------> LCD 사용 전 초기화 단계

        DDRA=0xff; // PORTA 출력 설정
        DDRC=0xff; // PORTC 출력 설정

        PORTA=0x00; // PORTA 값 초기화
        PORTB=0x00; // PORTC 값 초기화

        LCD_INS(CMD_CREAR_DISPLAY); // Clear Display
        _delay_ms(2);

     LCD_INS(CMD_RETURN_HOME); // Return Home
        _delay_ms(2);

        LCD_INS(CMD_FUNCTION_SET_OPTION8); // [8]bit mode, [2] line, [5x8] Font
        _delay_ms(2);

        LCD_INS(CMD_DISPLAY_OPTION5); // Display [On], Cursor [Off], Cursor Blink [Off]
        _delay_ms(2);

        LCD_INS(CMD_CURSOR_DISPLAY_SHIFT_OPTION2); // [Cursor] Select, Cursor Shift [Right]
        _delay_ms(2);

        LCD_INS(CMD_ENTRY_MODE_SET_OPTION3); // cursor [right], Display shift[none] (커서 오른쪽증가, shift Off)
        _delay_ms(2);
    // ----------------------------------------------------------------> CGRAM 쓰기
     LCD_INS(0x40); // CGRAM 쓰기 모드 설정
     for(cnt=0; cnt<64; cnt++){ // 0x00 ~ 0x07 까지 8개의 배열로 이루어진 8개의 문자에 쓰기
      LCD_WRITE_DATA(fish[cnt]); // 8 x 8 개 이므로 64번 반복문 수행. CGRAM에 사용자 정의 문자가 기록됨
        }
     //LCD_INS(0x01);

    // ----------------------------------------------------------------> 그림 문자 출력
     LCD_INS(0x80);  // DD RAM Address (첫 라인 4번위치)
     LCD_WRITE_DATA(0x00);
     LCD_WRITE_DATA(0x01);
     LCD_WRITE_DATA(0x04);
     LCD_WRITE_DATA(0x04);
     LCD_WRITE_DATA(0x04);
     LCD_WRITE_DATA(0x04);
     LCD_WRITE_DATA(0x04);
     LCD_WRITE_DATA(0x04);
     LCD_WRITE_DATA(0x06);

     LCD_INS(0xC0); // DD RAM Address (두번째 라인 4번위치)
     LCD_WRITE_DATA(0x02);
     LCD_WRITE_DATA(0x03);
     LCD_WRITE_DATA(0x05);
     LCD_WRITE_DATA(0x05);
     LCD_WRITE_DATA(0x05);
     LCD_WRITE_DATA(0x05);
     LCD_WRITE_DATA(0x05);
     LCD_WRITE_DATA(0x05);
     LCD_WRITE_DATA(0x07);

     LCD_INS(0x8A); // DD RAM Address
        str(a); // 문자열 출력
        

    }

    반응형
Designed by Tistory.