Microprocessor/ARM7 ARM 자료 ( 캐릭터 LCD 출력 ) [20120820]
  • 728x90
    반응형

       

       

     

    안녕하세요 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 창의 출력 속도를 빠르게 있다.

       

       

     

     

     

     

     

     

    궁금하신 점은 댓글로 남겨 주세요 !!

     

    오늘도 좋은 하루 되세요 

     

     

     

     

     

     

     

       

       

       

       

    728x90
    반응형
상단으로