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

📄 sio.c

📁 BasicCAN 驱动程序
💻 C
字号:

#include<ds80c320.h>

#include <string.h>
#include "sio.h"

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
#define TBUF_SIZE	256		/* DO NOT CHANGE */
#define RBUF_SIZE	256		/* DO NOT CHANGE */

#define OSC             11059200L        /* Oscillator Frequency */

static xdata unsigned char tbuf [TBUF_SIZE];
static xdata unsigned char rbuf [RBUF_SIZE];
static xdata unsigned char tbuf1 [TBUF_SIZE];
static xdata unsigned char rbuf1 [RBUF_SIZE];
//unsigned char xdata  t_in = 0;
static xdata unsigned char t_in = 0;
static xdata unsigned char t_out = 0;
static xdata unsigned char t_disabled = 0;

static xdata unsigned char r_in = 0;
static xdata unsigned char r_out = 0;

static xdata unsigned char t_in1 = 0;
static xdata unsigned char t_out1 = 0;
static xdata unsigned char t_disabled1 = 0;

static xdata unsigned char r_in1 = 0;
static xdata unsigned char r_out1 = 0;
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
static void com_isr (void) interrupt 4 using 2
{
/*------------------------------------------------
Received data interrupt.
------------------------------------------------*/
EA=0;
if (RI != 0)
  {
  RI = 0;

  if ((r_in + 1) != r_out)
    rbuf [r_in++] = SBUF;
  }

/*------------------------------------------------
Transmitted data interrupt.
------------------------------------------------*/
if (TI != 0)
  {
  TI = 0;

  if (t_in != t_out)
    SBUF = tbuf [t_out++];
  else
    t_disabled = 1;
  }

EA=1;
}

static void com_isr1 (void) interrupt 7 using 1
{
/*------------------------------------------------
Received data interrupt.
------------------------------------------------*/
EA=0;
if (RI_1 != 0)
  {
  RI_1 = 0;

  if ((r_in1 + 1) != r_out1)
    rbuf1 [r_in1++] = SBUF1;
  }

/*------------------------------------------------
Transmitted data interrupt.
------------------------------------------------*/
if (TI_1 != 0)
  {
  TI_1 = 0;

  if (t_in1 != t_out1)
    SBUF1 = tbuf1 [t_out1++];
  else
    t_disabled1 = 1;
  }

EA=1;
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void com_initialize (void)
{
/*------------------------------------------------
Setup TIMER1 to generate the proper baud rate.
------------------------------------------------*/
com_baudrate (19200);

/*------------------------------------------------
Clear com buffer indexes.
------------------------------------------------*/
EA = 0;                         /* Disable Interrupts */

t_in = 0;
t_out = 0;
t_disabled = 1;

r_in = 0;
r_out = 0;

t_in1 = 0;
t_out1 = 0;
t_disabled1 = 1;

r_in1 = 0;
r_out1 = 0;

/*------------------------------------------------
Setup serial port registers.
------------------------------------------------*/
SM0 = 0; SM1 = 1;		/* serial port MODE 1 */
SM2 = 0;
//SM0_1 = 0; SM1_1 = 1;		/* serial port MODE 1 */
//SM2_1 = 0;
REN = 1;			/* enable serial receiver */
//REN_1=1;
TI = 0;				/* clear transmit interrupt */
RI = 0;				/* clear receiver interrupt */

TI_1 = 0;				/* clear transmit interrupt */
RI_1 = 0;				/* clear receiver interrupt */
ES = 1;				/* enable serial interrupts */
PS = 0;				/* set serial interrupts to low priority */
//ES1 = 1;				/* enable serial interrupts */
//PS1 = 1;				/* set serial interrupts to low priority */
EA = 1;                         /* Enable Interrupts */
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void com_baudrate (
  unsigned baudrate)
{
EA = 0;                             /* Disable Interrupts */

/*------------------------------------------------
Clear transmit interrupt and buffer.
------------------------------------------------*/
TI = 0;				    /* clear transmit interrupt */
t_in = 0;			    /* empty transmit buffer */
t_out = 0;
t_disabled = 1;			    /* disable transmitter */

TI_1 = 0;				    /* clear transmit interrupt */
t_in1 = 0;			    /* empty transmit buffer */
t_out1 = 0;
t_disabled1 = 1;			    /* disable transmitter */
/*------------------------------------------------
Set timer 1 up as a baud rate generator.
------------------------------------------------*/
TR1 = 0;			    /* stop timer 1 */
ET1 = 0;			    /* disable timer 1 interrupt */

PCON |= 0x80;			    /* 0x80=SMOD: set serial baudrate doubler */

TMOD &= ~0xF0;			    /* clear timer 1 mode bits */
TMOD |= 0x20;			    /* put timer 1 into MODE 2 */

TH1 = (unsigned char) (256 - (OSC / (16L * 12L * baudrate)));

TR1 = 1;			    /* start timer 1 */

EA = 1;                             /* Enable Interrupts */
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
char com_putchar (
  unsigned char c)
{
/*------------------------------------------------
If the buffer is full, return an error value.
------------------------------------------------*/
if ((TBUF_SIZE - com_tbuflen ()) <= 2)
  return (-1);

/*------------------------------------------------
Add the data to the transmit buffer.  If the
transmit interrupt is disabled, then enable it.
------------------------------------------------*/
EA = 0;                         /* Disable Interrupts */

tbuf [t_in++] = c;

if (t_disabled)			/* if transmitter is disabled */
  {
  t_disabled = 0;
  TI = 1;			/* enable it */
  }

EA = 1;                         /* Enable Interrupts */

return (0);
}

char com_putchar1 (
  unsigned char c)
{
/*------------------------------------------------
If the buffer is full, return an error value.
------------------------------------------------*/
if ((TBUF_SIZE - com_tbuflen1 ()) <= 2)
  return (-1);

/*------------------------------------------------
Add the data to the transmit buffer.  If the
transmit interrupt is disabled, then enable it.
------------------------------------------------*/
EA = 0;                         /* Disable Interrupts */

tbuf1 [t_in1++] = c;

if (t_disabled1)			/* if transmitter is disabled */
  {
  t_disabled1 = 0;
  TI_1 = 1;			/* enable it */
  }

EA = 1;                         /* Enable Interrupts */

return (0);
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
char com_getchar (void)
{
char c;

if (com_rbuflen () == 0)
  return (-1);

EA = 0;                      
c = rbuf [r_out++];
EA = 1;                         

return (c);
}   

char com_getchar1 (void)
{
char c;

if (com_rbuflen1 () == 0)
  return (-1);

EA = 0;                      
c = rbuf1 [r_out1++];
EA = 1;                         

return (c);
}   
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
unsigned char com_rbuflen (void)
{
return (r_in - r_out);
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
unsigned char com_tbuflen (void)
{
return (t_in - t_out);
}

unsigned char com_rbuflen1 (void)
{
return (r_in1 - r_out1);
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
unsigned char com_tbuflen1 (void)
{
return (t_in1 - t_out1);
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/

⌨️ 快捷键说明

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