[Thắc mắc] mọi người giúp e hiểu đoạn code này vơi

Thảo luận trong 'Thắc Mắc - Góp Ý'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

  1. anchieu

    anchieu Học sinh phổ thông

    Tham gia ngày:
    12/5/17
    Bài viết:
    1
    Đã được thích:
    0
    Điểm thành tích:
    1
    Giới tính:
    Nữ
    v
    Mã:
    void USART_OUT(USART_TypeDef* USARTx, char *Data,...){
        const char *s;
        int d;
        char buf[16];
        va_list ap;
        va_start(ap, Data);
    
        while(*Data!=0){                                         //
            if(*Data==0x5c){                                     //'\'
                switch (*++Data){
                    case 'r':                                     //
                        USART_SendData(USARTx, 0x0d);   
    
                        Data++;
                        break;
                    case 'n':                                     //
                        USART_SendData(USARTx, 0x0a); 
                        Data++;
                        break;
                 
                    default:
                        Data++;
                       break;
                }
             
               
            }
            else if(*Data=='%'){                                     //
                switch (*++Data){             
                    case 's':                                         //
                        s = va_arg(ap, const char *);
                        for ( ; *s; s++) {
                            USART_SendData(USARTx,*s);
                            while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
                        }
                        Data++;
                        break;
                    case 'd':                                         //
                        d = va_arg(ap, int);
                        itoa(d, buf, 10);
                        for (s = buf; *s; s++) {
                            USART_SendData(USARTx,*s);
                            while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
                        }
                        Data++;
                        break;
                    default:
                        Data++;
                       break;
                }       
            }
            else USART_SendData(USARTx, *Data++);
            while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
        }
    }
    
    //------------------------------------------------------------------------//
    char *itoa(int value, char *string, int radix)
    {
        int     i, d;
        int     flag = 0;
        char    *ptr = string;
    
        /* This implementation only works for decimal numbers. */
        if (radix != 10)
        {
            *ptr = 0;
            return string;
        }
    
        if (!value)
        {
            *ptr++ = 0x30;
            *ptr = 0;
            return string;
        }
    
        /* if this is a negative value insert the minus sign. */
        if (value < 0)
        {
            *ptr++ = '-';
    
            /* Make the value positive. */
            value *= -1;
        }
    
        for (i = 10000; i > 0; i /= 10)
        {
            d = value / i;
    
            if (d || flag)
            {
                *ptr++ = (char)(d + 0x30);
                value -= (d * i);
                flag = 1;
            }
        }
    
        /* Null terminate the string. */
        *ptr = 0;
    
        return string;
    
    } /* NCL_Itoa */
     
    Last edited by a moderator: 31/5/17

Chia sẻ trang này