관리 메뉴

안까먹을라고 쓰는 블로그

c언어에서 printf 함수를 사용한 서식지정 출력 본문

Embedded/Atmega128

c언어에서 printf 함수를 사용한 서식지정 출력

YawnsDuzin 2012. 9. 1. 20:31

 

반응형

WinAvr 에서 printf() 함수를 사용하는 절차 및 방법

 

1. 사용자 프로그램의 서두에서 헤더파일 stdio.h를 인클루드한다. printf() 함수에 관련된 모든 사항은 이 헤더파일에 정의되어있다.

 

2. 1문자를 출력하는 저수준 스트림 함수에서 사용할 주변장치를 초기화한다. 이는 보통 별도의 사용자 정의 함수로 만들어 사용하는 것이 좋다. 1문자를 출력하는 저수준 스트림 함수에는 출력장치를 초기화하는 기능을 포함하지 않으므로 이를 별도로 미리 초기화해 놓아야 한다.

 

3. 1문자를 출력하는 저수준 스트림 함수를 만든다. 이 함수의 이름은 사용자가 임의로 정할 수 있다. 이 함수에는 모든 ASCII문자를 출력할 수 있어야 한다.

 

4. fdevopen() 함수를 사용하여 출력장치에 1문자를 출력하는 저수준 스트림 출력함수를 하나의 파일처럼 연다. 그러나, 만약 나중에 이를 닫으려면 fdevopen() 함수를 열 때 되돌려지는 파일 포인터가 필요하므로 이를 저장해 두어야 한다.

fdevopen() 함수는 또한 scanf() 함수를 사용하여 % 서식지정 입력에 필요한 저수준 스트림 입력함수를 여는데도 사용할 수 있으나 여기서는 다루지 않기로 한다.

 

5. printf()함수를 사용한다. 여기서는 일반적인 ANSI C표준의 모든 %서식 지정이 사용될 수 있다.

 

 

※ 이렇게 printf()함수를 사용한 사용자 프로그램을 컴파일할 때는 별도의 라이브러리 파일 libprintf_min.a / libprintf_flt.a 를 링크시켜 주어야 한다.

libprintf_min.a  =>  정수처리 루틴만 포함    < -Wl, -u,vfprintf -lprintf_min  >

libprintf_flt.a  =>  부동소수점 처리 루틴까지 포함  <  WI, -u,vfprintf -lprintf_flt  -lm  >

 

 

 

- printf() 함수를 사용한 텍스트형 LCD 모듈의 수치데이터 출력

 

#include <avr/io.h>
#include <stdio.h>
#include "c:\AvrEdit\JJ128c\JJ128.h"

 

int LCD_putchar(char c)                  /* print a character to LCD */
{
  if((c < 0x20) | (c > 0x7E))                   // check from 0x20 to 0x7E  // ASCII 코드값 CHECK
    return 0;

  LCD_data(c);
  return 0;
}

 

int main(void)
{ unsigned char i, j;
  double x;

  MCU_initialize();                             // initialize MCU
  Delay_ms(50);                                 // wait for system stabilization
  LCD_initialize();                             // initialize text LCD module

  LCD_string(0x80,"LCD by printf() ");          // display title
  LCD_string(0xC0,"  0/0 = 0.000   ");
  Beep();

 

  fdevopen(LCD_putchar,0,0);                    // stdout and stderr device open

 

  while(1)
    { for(j=1; j<=9; j++)                       // divisor(from 1 to 9)
        for(i=1; i<=9; i++)                     // dividend(from 1 to 9)
          { x = (float)i/(float)j;
            LCD_command(0xC2);                  // display number by printf()
            printf("%1d/%1d = %5.3f",i,j,x);
            Delay_ms(1000);
          }
      Beep();
    }
}

 

 

반응형

'Embedded > Atmega128' 카테고리의 다른 글

128 인터럽트 uart통신소스  (0) 2012.09.01
LED 출력  (0) 2012.09.01
KEY 입력 기술  (0) 2012.09.01
Text-Lcd 모듈 프로그래밍  (0) 2012.09.01
AVR Atmega128 정복[책 소개 및 관련자료]  (0) 2012.09.01
Comments