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

📄 h8_sci.c

📁 050117 CD 修正分 iTRON hosroot
💻 C
字号:
#include "h8_3048.h"
#include "h8_sci.h"


/* ------------------------------ */
/*             SCI                */
/* ------------------------------ */

/* 巊梡億乕僩偺掕媊 */
#ifdef __USE_SCI0
#define SMR     SMR0
#define BRR     BRR0
#define SCR     SCR0
#define TDR     TDR0
#define SSR     SSR0
#define RDR     RDR0
#else
#define SMR     SMR1
#define BRR     BRR1
#define SCR     SCR1
#define TDR     TDR1
#define SSR     SSR1
#define RDR     RDR1
#endif


#define SCIBUFSIZ 128			/* 僶僢僼傽僒僀僘 */

static unsigned char sci_rx_buff[SCIBUFSIZ];	/* 庴怣儕儞僌僶僢僼傽 */
static unsigned char sci_rx_stptr;				/* 庴怣僶僢僼傽愭摢 */
static unsigned char sci_rx_enptr;				/* 庴怣僶僢僼傽枛旜 */
static unsigned char sci_tx_buff[SCIBUFSIZ];	/* 憲怣儕儞僌僶僢僼傽 */
static unsigned char sci_tx_stptr;				/* 憲怣僶僢僼傽愭摢 */
static unsigned char sci_tx_enptr;				/* 憲怣僶僢僼傽枛旜 */


/* SCI弶婜壔 */
void SCI_Init(unsigned char rate)
{
	int i;
	
	/* 儕儞僌僶僢僼傽弶婜壔 */
	sci_rx_stptr = sci_rx_enptr = 0;
	sci_tx_stptr = sci_tx_enptr = 0;
	
	/* SCI弶婜壔 */
	SCR = 0x00;
	SMR = 0x00;
	BRR = rate;
	for ( i = 0; i < 280; i++ )
		;
	SCR = 0x70;
}


/* 僄儔乕庴怣 妱傝崬傒僴儞僪儔 */
void SCI_ERR_Intr(void)
{
	SSR &= 0xcf;
}


/* 僨乕僞庴怣 妱傝崬傒僴儞僪儔 */
void SCI_RX_Intr(void)
{
	unsigned char c;
	unsigned char nxptr;
	
	/* 1暥帤庴怣 */
	SSR &= 0xbf;
	c = RDR;
	
	/* FIFO偵1暥帤擖傟傞 */
	nxptr = sci_rx_enptr + 1;
	if(nxptr >= SCIBUFSIZ) nxptr = 0;
	if(sci_rx_stptr != nxptr) {
		sci_rx_buff[sci_rx_enptr] = c;
		sci_rx_enptr = nxptr;
	} else {
		/* 僶僢僼傽偑枮攖 */
		/* 杮棃側傜偙偙偵僄儔乕張棟 */
		/* 偲傝偁偊偢庢傝偙傏偡偙偲偵偡傞 */
	}
}


/* 憲怣妱傝崬傒 */
void SCI_TX_Intr(void)
{
	unsigned char nxptr;
	
	if ( sci_tx_stptr == sci_tx_enptr ) {
		/* 憲怣僶僢僼傽偑嬻側傜妱傝崬傒傪嬛巭偟偰儕僞乕儞 */
		SCR &= 0x7f;
		return;
	}
	
	/* 憲怣僶僢僼傽偐傜1暥帤庢傝弌偟偰憲怣 */
	TDR  = sci_tx_buff[sci_tx_stptr];
	SSR &= 0x7f;
	
	/* 億僀儞僞峏怴 */
	nxptr = sci_tx_stptr + 1;
	if (nxptr >= SCIBUFSIZ)  nxptr = 0;
	sci_tx_stptr = nxptr;
	
	if ( sci_tx_stptr == sci_tx_enptr ) {
		/* 僶僢僼傽偑嬻側傜師偺妱傝崬傒傪巭傔傞 */
		SCR &= 0x7f;
		return;
	}
}


/* 侾暥帤弌椡 */
void SCI_Putc(char data)
{
	unsigned char nxptr;
	
	__di();
	
	if ( (sci_tx_stptr == sci_tx_enptr) && (SSR & 0x80) ) {
		/* 僶僢僼傽偑嬻偱憲怣壜擻側傜偡偖弌椡 */
		TDR = data;
		SSR &= 0x7f;
		SCR &= 0x7f;
		__ei();
		return;
	}
	
	nxptr = sci_tx_enptr + 1;
	if( nxptr >= SCIBUFSIZ ) nxptr = 0;
	while ( (volatile)sci_tx_stptr == nxptr ) {
		/* 僶僢僼傽偑堦攖側傜嬻偔偺傪懸偮 */
		__ei();
		__di();
	}
	
	/* 憲怣僶僢僼傽偵1暥帤擖傟傞 */
	sci_tx_buff[sci_tx_enptr] = data;
	sci_tx_enptr = nxptr;
	
	/* 妱傝崬傒傪嫋壜 */
	SCR |= 0x80;
	
	__ei();
}


/* 暥帤楍弌椡 */
void SCI_Puts(const char *str)
{
	while ( *str )
		SCI_Putc(*str++);
}


/* 侾暥帤擖椡 */
int  SCI_Getc(void)
{
	unsigned char c;
	unsigned char nxptr;

	if (sci_rx_stptr == sci_rx_enptr)
		return -1;	/* 庴怣僶僢僼傽偑嬻 */

	/* FIFO偐傜1暥帤庢傝弌偡 */
	c = sci_rx_buff[sci_rx_stptr];

	/* 億僀儞僞峏怴 */
	nxptr = sci_rx_stptr + 1;
	if (nxptr >= SCIBUFSIZ)
		nxptr = 0;
	
	sci_rx_stptr = nxptr;
	
	return c;
}


/* 暥帤楍擖椡 */
void SCI_Gets(char *buf)
{
	int c;
	
	for ( ; ; ) {
		c = SCI_Getc();
		if ( c != -1 ) {
			*buf++ = c;
			if ( c == '\r' ) {
				*buf = '\0';
				return;
			}
		}
	}
}

⌨️ 快捷键说明

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