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

📄 p18_sci.c

📁 PIC18系列单片机
💻 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 + -