📄 p18_sci.c
字号:
/*******************************************************************************
Copyright 2004 RAE Systems Inc.
File name: P18_SCI.c
Description: PIC18Fxx20 SCI function
Support MCU: PIC18F6720 & PIC18F8720
Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/39609b.pdf
Revision 1.00 - Oct 26, 2004
.
*******************************************************************************/
const INT8U cBaudRate[8]={BAUD_1200,BAUD_2400,BAUD_4800,BAUD_9600,BAUD_19200,BAUD_38400,BAUD_57600,BAUD_115200};
#include "..\include.h"
stQueue qSCI1;
stQueue qSCI2;
void InsertQueue(stQueue *pqSCI, unsigned char chIn )
{
if(pqSCI->b.QueueFull)
{
SET_ERROR(ERR_QueueOverFlow);
return;
}
pqSCI->uchBuff[pqSCI->iTail]=chIn;
pqSCI->iTail++;
if(pqSCI->iTail>=QUEUE_MAX)
pqSCI->iTail=0;
if(pqSCI->iTail==pqSCI->iHead)
pqSCI->b.QueueFull=1;
pqSCI->b.QueueEmpty=0;
}
unsigned char GetQueue( stQueue *pqSCI )
{
unsigned char buff;
buff=pqSCI->uchBuff[pqSCI->iHead];
pqSCI->iHead++;
if(pqSCI->iHead>=QUEUE_MAX)
pqSCI->iHead=0;
if(pqSCI->iTail==pqSCI->iHead)
pqSCI->b.QueueEmpty=1;
pqSCI->b.QueueFull=0;
return buff;
}
void InitQueue( stQueue *pqSCI )
{
unsigned char i;
for(i=0;i<QUEUE_MAX;i++)
{
pqSCI->uchBuff[i]=0;
}
pqSCI->iHead=0;
pqSCI->iTail=0;
pqSCI->b.QueueEmpty=1;
pqSCI->b.QueueFull=0;
CLEAR_ERROR(ERR_QueueOverFlow);
}
void P18_SCI1Init( unsigned char baud )
{
TRISC = ( TRISC | 0x80 ) & 0xBF; // set RC6(TX1) as output and RC7(RX1) as input
RCSTA1 = 0x90; // serial port 1 enabled and receiver enabled
TXSTA1 = 0x24; // transmit enabled
SPBRG1 = baud; // 19200bps
RCIP = 1; //receive set to high priority
TXIP = 0; //transmission set to low priority
SCI_Reset();
}
void SCI_Reset( void )
{
RCIE = 0;
TXIE = 0;
RCIE = 1;
}
void P18_SCI2Init( unsigned char baud )
{
RC2IE = 0;
TRISG = ( TRISG | 0x04 ) & 0xFD;
RG2=1;
RCSTA2 = 0x90;
TXSTA2 = 0x24;
SPBRG2 = baud;
RC2IE = 1;
}
void UART_SendC ( unsigned char u8_data )
{
int i;
for ( i=SCI_TIMEOUT; i; i-- )
{
if ( TRMT1 )
break;
}
TXREG1 = u8_data;
}
void UART_SendConstS ( const char *s )
{
const char *p=s;
while((*p)!='\0')
UART_SendC ( *p++ );
}
void UART_SendS ( unsigned char *s, unsigned char Len )
{
unsigned char i;
for (i=0;i<Len;i++)
UART_SendC ( *(s+i) );
}
void UART2_SendC ( unsigned char u8_data )
{
int i;
for ( i=SCI_TIMEOUT; i; i-- )
{
if ( TRMT2 )
break;
}
TXREG2 = u8_data;
}
void UART2_SendConstS ( const char *s )
{
const char *p=s;
while((*p)!='\0')
UART2_SendC ( *p++ );
}
void UART_SendHandle( void )
{
int i;
unsigned char chLow,chHigh;
if(g_EnableIR)
{
if((g_SCI.bFree)&&(!qSCI1.b.QueueEmpty)&&PSPMode)
{
for ( i=SCI_TIMEOUT; i; i-- )
{
if ( TRMT1 )
break;
}
chLow=GetQueue(&qSCI1);
if(!qSCI1.b.QueueEmpty)
{
chHigh=GetQueue(&qSCI1);
TXREG1=Infrared_Merge(chLow,chHigh);
}
}
}
else
{
if((!qSCI1.b.QueueEmpty)&&PSPMode)
{
for ( i=SCI_TIMEOUT; i; i-- )
{
if ( TRMT1 )
break;
}
TXREG1=GetQueue(&qSCI1);
}
}
if(!qSCI2.b.QueueEmpty)
{
for ( i=SCI_TIMEOUT; i; i-- )
{
if ( TRMT2 )
break;
}
TXREG2=GetQueue(&qSCI2);
}
}
unsigned char Infrared_Merge(unsigned char a, unsigned char b)
{
unsigned char i;
unsigned short tmp;
tmp = 0;
for(i = 0; i < 4; i++){
tmp >>= 1;
a >>= 1;
if((a % 2) == 1){
tmp |= 0x80;
}
a >>= 1;
}
for(i = 0; i < 4; i++){
tmp >>= 1;
b >>= 1;
if((b % 2) == 1){
tmp |= 0x80;
}
b >>= 1;
}
return (unsigned char)tmp;
}
void P18_SCI1InitEx( void )
{
unsigned char uchTemp;
uchTemp=Get24C04Byte(EEP_SCI1BAUD);
if(uchTemp>7)
P18_SCI1Init(BAUD_DEFAULT);
else
P18_SCI1Init(cBaudRate[uchTemp]);
}
void P18_SCI2InitEx( void )
{
unsigned char uchTemp;
uchTemp=Get24C04Byte(EEP_SCI2BAUD);
if(uchTemp>7)
P18_SCI2Init(BAUD_DEFAULT);
else
P18_SCI2Init(cBaudRate[uchTemp]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -