91 lines
2 KiB
C
91 lines
2 KiB
C
//----------------------------------------------------------------------------
|
|
//Written by Dmitry S. Obukhov, 1996
|
|
// dso@usa.net
|
|
//----------------------------------------------------------------------------
|
|
//This module implements serial interrupt handler and IO routinwes using
|
|
//two 256 byte cyclic buffers. Bit variables can be used as flags for
|
|
//real-time kernel tasks
|
|
//Last modified 6 Apr 97
|
|
//----------------------------------------------------------------------------
|
|
|
|
//This module contains definition of I8051 registers
|
|
#include "8052.h"
|
|
|
|
|
|
static unsigned char xdata stx_index_in, srx_index_in, stx_index_out, srx_index_out;
|
|
static unsigned char xdata stx_buffer[0x100];
|
|
static unsigned char xdata srx_buffer[0x100];
|
|
|
|
static bit work_flag_byte_arrived;
|
|
static bit work_flag_buffer_transfered;
|
|
static bit tx_serial_buffer_empty;
|
|
static bit rx_serial_buffer_empty;
|
|
|
|
|
|
void serial_init(void)
|
|
{
|
|
SCON = 0x50;
|
|
T2CON = 0x34;
|
|
PS = 1;
|
|
T2CON = 0x34;
|
|
RCAP2H = 0xFF;
|
|
RCAP2L = 0xDA;
|
|
|
|
RI = 0;
|
|
TI = 0;
|
|
|
|
stx_index_in = srx_index_in = stx_index_out = srx_index_out = 0;
|
|
rx_serial_buffer_empty = tx_serial_buffer_empty = 1;
|
|
work_flag_buffer_transfered = 0;
|
|
work_flag_byte_arrived = 0;
|
|
ES=1;
|
|
}
|
|
|
|
void serial_interrupt_handler(void) interrupt 4 using 1
|
|
{
|
|
ES=0;
|
|
if ( TI )
|
|
{
|
|
TI = 0;
|
|
if (stx_index_out == stx_index_in )
|
|
{
|
|
tx_serial_buffer_empty = 1;
|
|
work_flag_buffer_transfered = 1;
|
|
}
|
|
else SBUF = stx_buffer[stx_index_out++];
|
|
}
|
|
if ( RI )
|
|
{
|
|
RI = 0;
|
|
srx_buffer[srx_index_in++]=SBUF;
|
|
work_flag_byte_arrived = 1;
|
|
rx_serial_buffer_empty = 0;
|
|
}
|
|
ES=1;
|
|
}
|
|
|
|
//Next two functions are interface
|
|
|
|
void serial_putc(unsigned char c)
|
|
{
|
|
stx_buffer[stx_index_in++]=c;
|
|
ES=0;
|
|
if ( tx_serial_buffer_empty )
|
|
{
|
|
tx_serial_buffer_empty = 0;
|
|
TI=1;
|
|
}
|
|
ES=1;
|
|
}
|
|
|
|
unsigned char serial_getc(void)
|
|
{
|
|
unsigned char tmp = srx_buffer[srx_index_out++];
|
|
ES=0;
|
|
if ( srx_index_out == srx_index_in) rx_serial_buffer_empty = 1;
|
|
ES=1;
|
|
return tmp;
|
|
}
|
|
|
|
//END OF MODULE
|