📄 car_printf2.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 + -