📄 sio.c
字号:
/**
* sio.c
* 俫俉俴俙俶儃乕僪 捠怣娭悢
* Copyright (c)2002 Junichi Tomaru
*/
#include "h8hst.h"
#include <stdarg.h>
static char st;
/**
* SIO 弶婜壔
*/
void sioinit( char ch, char speed, char prm )
{
switch( ch ){ /* TE,RE,RIE,TIE,TEIE,MPIE傪嬛巭偡傞 */
case 0: SCI0_SCR = 0;
_case 1: SCI1_SCR = 0;
_default: break;
}
switch( ch ){ /* 僋儘僢僋僙儗僋僩(冇) */
case 0: SCI0_SMR = 0;
_case 1: SCI1_SMR = 0;
_default: break;
}
switch( ch ){ /* 捠怣僷儔儊乕僞丄暘廃 */
case 0: SCI0_SMR |= prm;
_case 1: SCI1_SMR |= prm;
_default: break;
}
switch( ch ){ /* 儃乕儗僀僩乮價僢僩儗乕僩乯 */
case 0: SCI0_BRR = speed;
_case 1: SCI1_BRR = speed;
_default: break;
}
waitms( 1 );
rx0hp = rx0tp = rx0ct = rx0err = 0; /* 僶僢僼傽億僀儞僞摍僋儕傾 */
tx0hp = tx0tp = tx0ct = 0;
rx1hp = rx1tp = rx1ct = rx1err = 0;
tx1hp = tx1tp = tx1ct = 0;
switch( ch ){ /* 憲怣I嬛巭,庴怣I嫋壜,憲怣嫋壜,庴怣嫋壜 */
case 0: SCI0_SCR = 0x70;
_case 1: SCI1_SCR = 0x70;
_default: break;
}
}
/**
* 俠俫侽庴怣僄儔乕妱傝崬傒
*/
#pragma interrupt
void scirx0err( void )
{
st = SCI0_SSR; /* 僗僥乕僞僗撉傓 */
rx0err |= st; /* 慜偺僄儔乕偼徚偝側偄 */
st &= 0xc7; /* 僄儔乕偺僋儕傾(OE,FE,PE) */
SCI0_SSR = st;
}
/**
* 俠俫侽庴怣妱傝崬傒
*/
#pragma interrupt
void scirx0( void )
{
rx0buf[rx0tp] = SCI0_RDR; /* 庴怣 */
rx0tp++;
rx0tp &= 0xff;
rx0ct++;
rx0ct &= 0xff;
SCI0_SSR &= 0x87; /* RDRF僋儕傾 */
}
/**
* 俠俫侽憲怣僨乕僞儗僕僗僞僄儞僾僥傿妱傝崬傒
*/
#pragma interrupt
void scitx0empty( void )
{
if( tx0ct != 0 ){ /* 憲傞暥帤偑偁傞 */
tx0ct--;
SCI0_TDR = tx0buf[tx0hp]; /* 憲怣 */
tx0hp++;
tx0hp &= 0xff;
SCI0_SSR &= 0x7f; /* TDRE僋儕傾 */
}
else{
SCI0_SCR &= 0x7f; /* 憲怣I嬛巭 */
}
}
/**
* 俠俫侾庴怣僄儔乕妱傝崬傒
*/
#pragma interrupt
void scirx1err( void )
{
st = SCI1_SSR; /* 僗僥乕僞僗撉傓 */
rx1err |= st; /* 慜偺僄儔乕偼徚偝側偄 */
st &= 0xc7; /* 僄儔乕偺僋儕傾(OE,FE,PE) */
SCI1_SSR = st;
}
/**
* 俠俫侾庴怣妱傝崬傒
*/
#pragma interrupt
void scirx1( void )
{
rx1buf[rx1tp] = SCI1_RDR; /* 庴怣 */
rx1tp++;
rx1tp &= 0xff;
rx1ct++;
rx1ct &= 0xff;
SCI1_SSR &= 0x87; /* RDRF僋儕傾 */
}
/**
* 俠俫侾憲怣僨乕僞儗僕僗僞僄儞僾僥傿妱傝崬傒
*/
#pragma interrupt
void scitx1empty( void )
{
if( tx1ct != 0 ){ /* 憲傞暥帤偑偁傞 */
tx1ct--;
SCI1_TDR = tx1buf[tx1hp]; /* 憲怣 */
tx1hp++;
tx1hp &= 0xff;
SCI1_SSR &= 0x7f; /* TDRE僋儕傾 */
}
else{
SCI1_SCR &= 0x7f; /* 憲怣I嬛巭 */
}
}
/**
* 庴怣悢僠僃僢僋
* return 庴怣偟偨暥帤悢
*/
byte getrxcount( char ch )
{
byte ret;
_di( );
if( ch == 0 ){
ret = rx0ct;
}
else{
ret = rx1ct;
}
_ei( );
return ret;
}
/**
* 憲怣悢僠僃僢僋
* return 憲怣僶僢僼傽撪偺暥帤悢
*/
byte gettxcount( char ch )
{
byte ret;
_di( );
if( ch == 0 ){
ret = tx0ct;
}
else{
ret = tx1ct;
}
_ei( );
return ret;
}
/**
* 庴怣僄儔乕撉傒弌偟
*/
char chkrxerr( char ch )
{
char ret;
if( ch == 0 ){
ret = rx0err;
}
else{
ret = rx1err;
}
return ret;
}
/**
* 堦暥帤庴怣乮僶僢僼傽偐傜撉傒弌偡乯
*/
char getsio1( char ch )
{
char c;
_di( );
if( ch == 0 ){
c = rx0buf[rx0hp];
rx0hp++;
rx0hp &= 0xff;
rx0ct--;
}
else{
c = rx1buf[rx1hp];
rx1hp++;
rx1hp &= 0xff;
rx1ct--;
}
_ei( );
return c;
}
/**
* 堦暥帤憲怣乮憲怣僶僢僼傽偵僙僢僩偲妱傝崬傒嫋壜乯
*/
bool setsio1( char ch, char dat )
{
bool ret;
_di( );
if( ch == 0 ){
if( tx0ct < 255 ){ /* 憲怣偱偒傞 */
tx0buf[tx0tp] = dat;
tx0tp++;
tx0tp &= 0xff;
tx0ct++;
tx0ct &= 0xff;
SCI0_SCR |= 0x80; /* 憲怣I嫋壜 */
ret = TRUE;
}
else{
ret = FALSE;
}
}
else{
if( tx1ct < 255 ){ /* 憲怣偱偒傞 */
tx1buf[tx1tp] = dat;
tx1tp++;
tx1tp &= 0xff;
tx1ct++;
tx1ct &= 0xff;
SCI1_SCR |= 0x80; /* 憲怣I嫋壜 */
ret = TRUE;
}
else{
ret = FALSE;
}
}
_ei( );
return ret;
}
/**
* 堦暥帤憲怣(懸偮)
*/
bool setsio1w( char ch, char dat )
{
bool ret;
if( ch == 0 ){
while( tx0ct >= 254 ){
}
}
else{
while( tx1ct >= 254 ){
}
}
return setsio1( ch, dat );
}
/**
* 億乕僩僋儕傾
*/
void sioclear( char ch )
{
while( getrxcount( ch ) != 0 ){ /* 庴怣偁偭偨 */
getsio1( ch );
}
}
/**
* 暥帤楍弌椡
*/
void setsiostr( char ch, char *str )
{
byte i;
for( i = 0; *( str + i ) != '\0'; i++ ){
setsio1w( ch, *( str + i ));
}
}
/**
* 暥帤楍弌椡(僼僅乕儅僢僩偮偒)
*/
void setsiostrf( char ch, char *fmt, ... )
{
va_list argptr;
byte i;
char buf[64];
va_start( argptr, fmt );
vsprintf( buf, fmt, argptr );
for( i = 0; buf[i] != '\0'; i++ ){
setsio1w( ch, buf[i] );
}
}
/**
* 俽俬俷暥帤楍擖椡
* buf: 僶僢僼傽
* ct: 僶僢僼傽梕検
* dl: 僨儕儈僞乮 嬫愗傝暥帤 乯
*/
char getsiostr( char ch, char *buf, int ct, char dl )
{
byte i;
char ret;
word wt;
byte c;
ct--;
wt = getcount1ms( );
for( i = 0; i < ct; ){
if( getrxcount( ch ) != 0 ){ /* 庴怣偁偭偨 */
c = getsio1( ch );
*( buf + i ) = (char)c;
i++;
if( c == dl ){ /* 僨儕儈僞 */
*( buf + i ) = '\0';
if( chkrxerr( ch ) ){ /* 捠怣僄儔乕偁偭偨 */
ret = 0;
}
else{ /* 僨乕僞桳岟 */
ret = 1;
}
break;
}
}
else if( getcount1ms( ) - wt > 3000U ){
ret = 0;
break;
}
else{
}
}
return ret;
}
/* end of sio.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -