⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 car_printf2.c

📁 瑞萨智能车大赛源码。High-performance Embedded Workshop
💻 C
字号:
/****************************************************************************/
/* 儅僀僐儞僇乕梡printf,scanf巊梡僾儘僌儔儉 Ver2                            */
/*          2006.04 Renesas Technology Micom Car Rally Executive Committee  */
/****************************************************************************/

/*======================================*/
/* 僀儞僋儖乕僪                         */
/*======================================*/
#include    <no_float.h>                /* stdio偺娙棯壔 嵟弶偵抲偔*/
/*
printf,scanf暥偱float傗double宆傪巊傢側偗傟偽丄stdio.h傪僀儞僋儖乕僪偡傞慜偵
no_float.h傪僀儞僋儖乕僪偡傞偙偲偵傛傝丄MOT僼傽僀儖僒僀僘傪彫偝偔偡傞偙偲偑
弌棃傑偡丅傕偟丄double宆傪巊梡偡傞偺偱偁傟偽丄僀儞僋儖乕僪偟側偄偱偔偩偝偄丅
no_float.h偼儖僱僒僗摑崌奐敪娐嫬偱偺傒巊梡弌棃傑偡丅
*/
#include    <stdio.h>
#include    <machine.h>
#include    "h8_3048.h"

/*======================================*/
/* 僔儞儃儖掕媊                         */
/*======================================*/
#define         CHECK_PRINTFSCANF 1     /* printf,scanf巊梡偡傞側傜1*/
#define         SEND_BUFF_SIZE  64      /* 憲怣僶僢僼傽僒僀僘       */
#define         RECV_BUFF_SIZE  32      /* 庴怣僶僢僼傽僒僀僘       */

/*======================================*/
/* 僌儘乕僶儖曄悢偺愰尵                 */
/*======================================*/
#if CHECK_PRINTFSCANF
/* 憲怣僶僢僼傽 */
char            send_buff[SEND_BUFF_SIZE];
char            *send_w = send_buff;
char            *send_r = send_buff;
unsigned int    send_count = 0;

/* 庴怣僶僢僼傽 */
char            recv_buff[RECV_BUFF_SIZE];
char            *recv_w = recv_buff;
char            *recv_r = recv_buff;

/* printf丄scanf傪巊偆堊偺曄悢愝掕 */
unsigned char   sml_buf[4];
FILE _iob[] = { { &sml_buf[2],0,&sml_buf[0],3,_IOREAD          ,0,0 },
                { &sml_buf[3],0,&sml_buf[3],1,_IOWRITE|_IOUNBUF,0,1 } };

volatile int    _errno;

#endif

#if CHECK_PRINTFSCANF
/************************************************************************/
/* SCI1偺弶婜壔                                                         */
/* 堷悢丂 儃乕儗乕僩儗僕僗僞愝掕抣                                      */
/* 栠傝抣 側偟                                                          */
/************************************************************************/
void init_sci1( int smr, int brr )
{
    int i;

    SCI1_SCR = 0x00;
    SCI1_SMR = smr;
    SCI1_BRR = brr;
    for( i=0; i<10000; i++ );
    SCI1_SCR = 0x30;                    /* 憲庴怣嫋壜                   */
    SCI1_SSR &= 0x80;                   /* 僄儔乕僼儔僌僋儕傾           */
}

/************************************************************************/
/* 僨乕僞庴怣                                                           */
/* 堷悢丂 暥帤楍奿擺傾僪儗僗                                            */
/* 栠傝抣 -1:庴怣僄儔乕 0:庴怣側偟 1:庴怣偁傝 暥帤偼*buf偵奿擺          */
/************************************************************************/
int get_data( char *buf )
{
    if( SCI1_SSR & 0x38 ) {
        /* 庴怣僄儔乕 */
        SCI1_SSR &= 0xc7;
        return -1;
    } else if( SCI1_SSR & 0x40 ) {
        /* 庴怣桳傝 */
        *buf = SCI1_RDR;
        SCI1_SSR &= 0xbf;
        return 1;
    }
    /* 庴怣側偟 */
    return 0;
}

/************************************************************************/
/* 憲怣僶僢僼傽偵曐懚                                                   */
/* 堷悢丂 奿擺暥帤                                                      */
/* 栠傝抣 側偟                                                          */
/* 儊儌   僶僢僼傽偑僼儖偺応崌丄嬻偔傑偱懸偪傑偡                        */
/************************************************************************/
void setSendBuff(char c)
{
    /* 僶僢僼傽偑嬻偔傑偱懸偮 */
    while( SEND_BUFF_SIZE == send_count );

    *send_w++ = c;
    if( send_w >= send_buff+SEND_BUFF_SIZE ) send_w = send_buff;
    send_count++;

    /* 憲怣妱傝崬傒嫋壜 */
    SCI1_SCR |= 0x80;
}

/************************************************************************/
/* 憲怣妱傝崬傒                                                         */
/* 堷悢丂 側偟                                                          */
/* 栠傝抣 側偟                                                          */
/************************************************************************/
#pragma interrupt (intTXI1)
void intTXI1( void )
{
    /* 憲怣僨乕僞傪儗僕僗僞偵僙僢僩 */
    SCI1_TDR = *send_r++;
    if( send_r >= send_buff+SEND_BUFF_SIZE ) send_r = send_buff;

    /* 憲怣奐巒 */
    SCI1_SSR &= 0x7f;

    /* 偙傟偑嵟屻偺僨乕僞側傜師埲崀偺妱傝崬傒嬛巭 */
    send_count--;
    if( !send_count ) SCI1_SCR &= 0x7f;
}

/************************************************************************/
/* printf偱屇傃弌偝傟傞娭悢                                             */
/* 儐乕僓乕偐傜偼屇傃弌偣傑偣傫                                         */
/************************************************************************/
char *sbrk(size_t size)
{
    return (char *)-1;
}

/************************************************************************/
/* printf偱屇傃弌偝傟傞娭悢                                             */
/* 儐乕僓乕偐傜偼屇傃弌偣傑偣傫                                         */
/************************************************************************/
int write(int fileno,char *buf,unsigned int cnt)
{
    int i;
    static int (*func)(const char *,...) = printf;

    if( !cnt ) return 0;

    if( *buf == '\n' )  {
        setSendBuff( '\r' );
    } else if( *buf == '\b' ) {
        setSendBuff( '\b' );
        setSendBuff( ' ' );
    }
    setSendBuff( *buf );
    return cnt;
}

/************************************************************************/
/* scanf偱屇傃弌偝傟傞娭悢                                              */
/* 儐乕僓乕偐傜偼屇傃弌偣傑偣傫                                         */
/************************************************************************/
int read(int fileno,char *buf,unsigned int cnt)
{
    static int (*func)(const char *,...) = scanf;

    if( !cnt ) return 0;

    if( recv_r == recv_w ) {
        do {
            /* 庴怣懸偪 */
            while( !(SCI1_SSR & 0x40) )
            SCI1_SSR &= 0xc0;
            *buf = SCI1_RDR;
            SCI1_SSR &= 0xbf;

            switch( *buf ) {
                case '\b':  /* 僶僢僋僗儁乕僗 */
                    /* 壗傕僶僢僼傽偵側偄側傜BS偼柍岠 */
                    if( recv_r == recv_w ) continue;
                    /* 偁傞側傜堦偮栠傞 */
                    recv_w--;
                    break;
                case '\r':  /* Enter僉乕 */
                    *recv_w++ = *buf = '\n';
                    *recv_w++ = '\r';
                    break;
                default:
                    if( recv_w >= recv_buff+RECV_BUFF_SIZE-2 ) continue;
                    *recv_w++ = *buf;
                    break;
            }
            /* 僄僐乕僶僢僋 擖椡偝傟偨暥帤傪曉偡 */
            write( fileno, buf, cnt );
        } while( *buf != '\n' );
    }
    *buf = *recv_r++;
    if( recv_r == recv_w ) recv_r = recv_w = recv_buff;

    return 1;
}

/************************************************************************/
/* 侾暥帤庴怣                                                           */
/* 堷悢丂 庴怣暥帤奿擺傾僪儗僗                                          */
/* 栠傝抣 -1:庴怣僄儔乕 0:庴怣側偟 1:庴怣偁傝                           */
/************************************************************************/
int get_sci( char *s )
{
    int i;

    if( SCI1_SSR & 0x38 ) {
        /* 庴怣僄儔乕 */
        SCI1_SSR &= 0xc7;
        return -1;
    } else if( SCI1_SSR & 0x40 ) {
        /* 庴怣桳傝 */
        *s = SCI1_RDR;
        SCI1_SSR &= 0xbf;
        return 1;
    }
    /* 庴怣側偟 */
    return 0;
}

#endif

/************************************************************************/
/* 俼俙俵僄儕傾偺弶婜壔                                                 */
/* 堷悢丂 側偟                                                          */
/* 栠傝抣 側偟                                                          */
/************************************************************************/
void INITSCT( void )
{
    int *s, *e, *r;

    r = __sectop("R");                  /* R僙僋僔儑儞(RAM)偺嵟弶   */
    s = __sectop("D");                  /* D僙僋僔儑儞(ROM)偺嵟弶   */
    e = __secend("D");                  /* D僙僋僔儑儞(ROM)偺嵟屻   */
    while(s < e) {
        *r++ = *s++;                    /* R 仼 D 僐僺乕            */
    }

    s = __sectop("B");                  /* B僙僋僔儑儞(RAM)偺嵟弶   */
    e = __secend("B");                  /* B僙僋僔儑儞(RAM)偺嵟屻   */
    while(s < e) {
        *s++ = 0x00;                    /* B 仼 0x00                */
    }
}

/************************************************************************/
/* end of file                                                          */
/************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -