HW 기초

[AVR] printf 구현하기 : 예제

. . . 2009. 12. 26. 02:48
반응형

출처 : 이전에 짰던 소스

기초적인 캐릭터 단위 함수구현

  • winavr 기준 / ATmega128
void putchar_(u08 device,u08 data)
{
    if(data != '\n')
    {
        if(device == 0)
        {
            uart0_send(data);
        }
        else
        {
            uart1_send(data);
        }
    }
    else if(data == '\n')
    {
        if(device == 0)
        {
            uart0_send(0x0d);
            uart0_send(0x0a);
        }
        else
        {
            uart1_send(0x0d);
            uart1_send(0x0a);
        }
        // if new line
    }
}

기초적인 캐릭터 스트링 함수구현

  • winavr 기준 / ATmega128
void puts_(u08 device,u08* str)
{
    while(*str)
    {
        if(*str == '\n')
        {
            if(device == 0)
            {
                putchar_(0,0x0d);
                putchar_(0,0x0a);
            }
            else
            {
                putchar_(1,0x0d);
                putchar_(1,0x0a);
            }
            str++;
        }
        else
        {
            if(device == 0)
            {
                putchar_(0,*str);
            }
            else
            {
                putchar_(1,*str);
            }
        str++;
        }
    }
}

기타 Printf 함수구현

  • cwinavr 기준 / ATmega128
void puthex_(u08 device,u32 value)
{
    u08 i;
    u08 c;
    u08 buffer[9];
    u08* buf;

    buf=buffer;

    *buf++='\0';

    c=0;

    do
    {
        i=value%16;
        if(i<10)
        {
            *buf++ = i + '0';
        }else if(i>=10)
        {
            *buf++ = (i-10) + 'A';
        }
        c++;
    }while((value/=16)>0);

    if(c==1)
    {
      *buf++ = '0';
    }

    *buf--;

    while(*buf != '\0')
    {
        if(device == 0)
        {
            putchar_(0,*buf--);
        }
        else
        {
            putchar_(1,*buf--);
        }
    }
}
 void putdec_(u08 device,u32 value)
{
    PRIVATE u08 i;
    PRIVATE u08 c;
    PRIVATE u08 buffer[9];
    PRIVATE u08* buf;

    buf=buffer;

    *buf++='\0';

    c=0;

    do
    {
        i=value%10;
        *buf++ = i + '0';
        c++;
    }while((value/=10)>0);

    *buf--;

    while(*buf != '\0')
    {
        if(device == 0)
        {
            putchar_(0,*buf--);
        }
        else
        {
            putchar_(1,*buf--);
        }
    }
}

반응형