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

📄 serial.c

📁 一款收款机C源代码!因为是几年前的代码了
💻 C
📖 第 1 页 / 共 4 页
字号:
			Uart_Transfer(PORT4);
      }
   }
}

/******************************************************************************
* Describe:   UART 4 Receive ISR
* Input :  void
* Output:  void
* return:  void
******************************************************************************/
void Serial4R(void)
{
	byte ch;

   if (ri_u4c1)                  // receive complete
   {
      if ((u4rbh & 0x80) == 0)      // no error occur
      {
         ch = u4rbl;
			Uart_Receive(PORT4, ch);
      }
      else                    // error occur when receive, reset it
      {
         if (oer_u4rb == 1)         // overrun error, next valid data received
         {                    // NOTE: see specification page 144.
            if (((rs4_In + 1) & RSBUFLEN4) != rs4_Out)
            {
               rs4_Buff[rs4_In] = u4rbl;
               rs4_In++;
               rs4_In &= RSBUFLEN4;
            }
         }
         re_u4c1 = 0;            // disable receive
         re_u4c1 = 1;            // enable receive
      }
   }
}

/*
********************************************************************************
*	Function : Initialize the UART port working mode
*				  Initial the port working in UART mode,
* 	Input    :
*				port -- Uart port no.
*	Note: 	Baud rate 9600bps for default.
*	
********************************************************************************
*/
void Uart_Init_Sub(BYTE	port)
{
	switch(port)
	{
		case	PORT0:					/*uart port 0*/
			rs0_In = rs0_Out = 0;
			wr0_In = wr0_Out = 0;
//			/*used for the RS-485 in NE2-GR mainboard, need modify with new HW*/
//			RS485EN_DIR = 1;
//			RS485_RCV();
			/*set pin pull-up/direction register*/
		   pd6_2 = 0;              /* rxd0 p62 input*/
		   pu20  = 1;              /* p60 ~ p63 pull up?*/
		   /*set A/B/C register */
			ps0_3 = 1;              // TXD0 output
			/*MODE: set data format,set start bit and stop bit*/
			u0mr = 0x05;
			/* set baud rate: BRG's source and BRG's value*/
			u0c0 = 0x10;            // f1, CTS/RTS disable, TXEPT = 0;
			u0brg = BRG_96;            // 9600 bps, 10M
		   s0tic = 0x05;           // set serial IPL,enable interrupt
		   s0ric = 0x05;
		   u0c1 = 0x05;            // enable TX/RX
		   // uart0 transmit interrupt cause select bit
		   u0irs = 1;              // cause by TI = 1(transmit complete)
		   u0rrm = 0;              // uart0 continue receive mode
		   break;
		case	PORT1:					/*uart port 1*/
			rs1_In = rs1_Out = 0;
			wr1_In = wr1_Out = 0;
			/*set pin pull-up/direction register*/
		   pd6_6 = 0;              /* rxd1 p6 input*/
		   pu21  = 1;              /* p60 ~ p63 pull up?*/
		   /*set A/B/C register */
			ps0_7 = 1;              // TXD1 output
			/*MODE: set data format,set start bit and stop bit*/
//			u1mr = 0x05;
			/* set baud rate: BRG's source and BRG's value*/
			u1c0 = 0x10;            	// f1, CTS/RTS disable, TXEPT = 0;
			u1brg = BRG_96;            	// 9600 bps, 10M
		   s1tic = 0x05;           		// set serial IPL,enable interrupt
		   s1ric = 0x05;
		   u1c1 = 0x05;            		// enable TX/RX
		   /* uart1 transmit interrupt cause select bit*/
		   u1irs = 1;             	 	// cause by TI = 1(transmit complete)
		   u1rrm = 0;              		// uart1 continue receive mode
		   break;

		case	PORT2:					/*uart port 2*/
			rs2_In = rs2_Out = 0;
			wr2_In = wr2_Out = 0;
		
			ps1_0 = 1;					// set p7_0 TxD3
			ps1_1 = 1;					// set p7_1 RxD3
		
			// MODE: set data format,set start bit and stop bit
			u2mr = 0x05;
			// set baud rate: BRG's source and BRG's value
			u2c0 = 0x10;            // f1, CTS/RTS disable, TXEPT = 0;
			u2brg = BRG_96;			//BaudRate;
			s2tic = 0x05;           // set serial IPL,enable interrupt
			s2ric = 0x05;
			u2c1 = 0x05;            // enable TX/RX
			// uart3 transmit interrupt cause select bit
			u2irs = 1;              // 0 means cause by TI = 1(transmit buffer empty)
			u2rrm = 0;              // uart3 continue receive mode
			break;						
		case	PORT3:
			rs3_In = rs3_Out = 0;
			wr3_In = wr3_Out = 0;
		
			prc2 = 1;
			ps3_2 = 1;					// set p9_3 TxD3
		
			prc2 = 1;
			pd9_1 = 0;              // rxd3 p91 input
			prc2 = 1;
			ps3_1 = 0;					// set p9_3 I/O
			pu27 = 1;               // p90~p93 pull up
		
			// MODE: set data format,set start bit and stop bit
			u3mr = 0x05;
			// set baud rate: BRG's source and BRG's value
			u3c0 = 0x10;            // f1, CTS/RTS disable, TXEPT = 0;
			u3brg = BRG_96;			//BaudRate;
			s3tic = 0x05;           // set serial IPL,enable interrupt
			s3ric = 0x05;
			u3c1 = 0x05;            // enable TX/RX
			// uart3 transmit interrupt cause select bit
			u3irs = 1;              // 0 means cause by TI = 1(transmit buffer empty)
			u3rrm = 0;              // uart3 continue receive mode
			break;
		case	PORT4:
			rs4_In = rs4_Out = 0;	/*buffer clearing*/
			wr4_In = wr4_Out = 0;

		   prc2 = 1;
		   ps3_6 = 1;              // set as TXD4 output

		   prc2 = 1;
//		   pd9_7 = 0;              //rxd4 p97 input
		   pd9_7 = 1;              //for sample only
		   prc2 = 1;
		   ps3_7 = 0;              // set as RXD4 input(I/O)
		   pu27 = 1;               // p90~p93 pull up
		
		   // MODE: set data format,set start bit and stop bit
		   u4mr = 0x05;
		   // set baud rate: BRG's source and BRG's value
		   u4c0 = 0x10;            // f1, CTS/RTS disable, TXEPT = 0;
		   u4brg = BRG_96;         // 9600 bps
		   s4tic = 0x05;           // set serial IPL,enable interrupt
			s4ric = 0x05;
		   u4c1 = 0x05;            // enable TX/RX

		   // uart4 transmit interrupt cause select bit
		   u4irs = 1;              // cause by TI = 1(transmit completed)
		   u4rrm = 0;              // enable continued receive mode
			u4smr2 = 0;
			break;
	}
}



/******************************************************************************
* Describe:   UART 0/1 & Serial 4 initial routine
*        see 80specification page 143. see hardware page 426./425
* Input :  void
* Output:  void
* return:  void
******************************************************************************/
void InitialSerial(void)
{
	Uart_Init_Sub(PORT0);
	Uart_Init_Sub(PORT1);
	Uart_Init_Sub(PORT2);
	Uart_Init_Sub(PORT3);
	Uart_Init_Sub(PORT4);

	Uart_SetPort(PORT0, NULL, NULL, NULL, NULL);
	Uart_SetPort(PORT1, NULL, NULL, NULL, NULL);
	Uart_SetPort(PORT2, NULL, NULL, NULL, NULL);
	Uart_SetPort(PORT3, NULL, NULL, NULL, NULL);
	Uart_SetPort(PORT4, NULL, NULL, NULL, NULL);
}


/******************************************************************************
* 	Describe:   store the receive data to buffer
*	Input	: 
*					port -- port index ( 0 -- for port 0 : 1 -- for port 1 )
*  out   :     none
*	Note	: 		For WD2-KR, we need convert the port.
* 说明: 这里没有关闭中断是因为它在中断里面调用的语句
******************************************************************************/
void	Uart_Data_Store(BYTE	port, byte ch)
{
	switch(port)
	{
		case	PORT0:
			if (((rs0_In + 1) & RSBUFLEN0) != rs0_Out)
			{
				rs0_Buff[rs0_In] = ch;
				rs0_In++;
				rs0_In &= RSBUFLEN0;
			}
			else
			{
//				rs0_Buff[rs0_In] = ch;		/*Discard the latest received data*/
			}
			break;

		case	PORT1:
			if (((rs1_In + 1) & RSBUFLEN1) != rs1_Out)
			{
				rs1_Buff[rs1_In] = ch;
				rs1_In++;
				rs1_In &= RSBUFLEN1;
			}
			else
			{
//				rs1_Buff[rs1_In] = ch;		/*Discard the latest received data*/
			}
			break;

		case	PORT2:
			if (((rs2_In + 1) & RSBUFLEN2) != rs2_Out)
			{
				rs2_Buff[rs2_In] = ch;
				rs2_In++;
				rs2_In &= RSBUFLEN2;
			}
			else
			{
//				rs2_Buff[rs2_In] = ch;		/*Discard the latest received data*/
			}
			break;

		case	PORT3:									/*it is the actual port 3 of MCU*/
			if (((rs3_In + 1) & RSBUFLEN3) != rs3_Out)
			{
				rs3_Buff[rs3_In] = ch;
				rs3_In++;
				rs3_In &= RSBUFLEN3;
			}
			else
			{
//				rs3_Buff[rs3_In] = ch;		/*Discard the latest received data*/
			}
			break;

		case	PORT4:
			if (((rs4_In + 1) & RSBUFLEN4) != rs4_Out)
			{
				rs4_Buff[rs4_In] = ch;
				rs4_In++;
				rs4_In &= RSBUFLEN4;
			}
			else
			{
//				rs4_Buff[rs4_In] = ch;		/*Discard the latest received data*/
			}
			break;

		default:			
			break;
	}
}

/*
	不发送数据,仅仅把它给删除:
*/
void	Uart_Send_Null(byte port)
{
	switch (port) {
		case	PORT0:
				wr0_Out++;
				wr0_Out &= WRBUFLEN0;
				break;

		case	PORT1:
				wr1_Out++;
				wr1_Out &= WRBUFLEN1;
				break;

		case	PORT2:
				wr2_Out++;
				wr2_Out &= WRBUFLEN2;
				break;

		case	PORT3:
				wr3_Out++;
				wr3_Out &= WRBUFLEN3;
				break;

		case	PORT4:
				wr4_Out++;
				wr4_Out &= WRBUFLEN4;
				break;
	}
}

/*******************************************************************************
* Send data to send register according to the send buffer
*******************************************************************************/
void	Uart_Send_Data(byte port)
{
	switch(port)
	{
		case	PORT0:								/*port 0 sending*/
			u0tb = wr0_Buff[wr0_Out];
			wr0_Out++;
			wr0_Out &= WRBUFLEN0;
			uart0_Sending = 1;
			break;

		case	PORT1:								/*port 1 sending*/
			u1tb = wr1_Buff[wr1_Out];
			wr1_Out++;
			wr1_Out &= WRBUFLEN1;
			uart1_Sending = 1;
			break;

		case	PORT2:								/*port 2 sending*/
			u2tb = wr2_Buff[wr2_Out];
			wr2_Out++;
			wr2_Out &= WRBUFLEN2;
			uart2_Sending = 1;
			break;

		case	PORT3:								/*port 3 sending*/
			u3tb = wr3_Buff[wr3_Out];        /*In MCU*/
			wr3_Out++;
			wr3_Out &= WRBUFLEN3;
			uart3_Sending = 1;
			break;

		case	PORT4:								/*port 4 sending*/
			u4tb = wr4_Buff[wr4_Out];
			wr4_Out++;
			wr4_Out &= WRBUFLEN4;
			uart4_Sending = 1;
			break;

		default:
			break;
	}
}

/*****************************************************
*	Check and store the scanner input data.
*  If the data is the end flag, then set the flag
*====================================================*/
void	Uart_Scan_Data_Store(byte port, byte ch)
{
	switch(port)
	{
		case	PORT0:
			if (((rs0_In + 1) & RSBUFLEN0) != rs0_Out)
			{
				rs0_Buff[rs0_In] = ch;
				rs0_In++;
				rs0_In &= RSBUFLEN0;
			}
			else
			{
//				rs0_Buff[rs0_In] = ch;		/*Discard the latest received data*/
			}
			break;

		case	PORT1:
			if (((rs1_In + 1) & RSBUFLEN1) != rs1_Out)
			{
				rs1_Buff[rs1_In] = ch;
				rs1_In++;
				rs1_In &= RSBUFLEN1;
			}
			else
			{
//				rs1_Buff[rs1_In] = ch;		/*Discard the latest received data*/
			}
			break;

		case	PORT2:
			if (((rs2_In + 1) & RSBUFLEN2) != rs2_Out)
			{
				rs2_Buff[rs2_In] = ch;
				rs2_In++;
				rs2_In &= RSBUFLEN2;
			}
			else
			{
//				rs2_Buff[rs2_In] = ch;		/*Discard the latest received data*/
			}
			break;

		case	PORT3:									/*it is the actual port 3 of MCU*/
			if (((rs3_In + 1) & RSBUFLEN3) != rs3_Out)
			{
				rs3_Buff[rs3_In] = ch;
				rs3_In++;
				rs3_In &= RSBUFLEN3;
			}
			else
			{
//				rs3_Buff[rs3_In] = ch;		/*Discard the latest received data*/
			}
			break;

		case	PORT4:
			if (((rs4_In + 1) & RSBUFLEN4) != rs4_Out)
			{
				rs4_Buff[rs4_In] = ch;
				rs4_In++;
				rs4_In &= RSBUFLEN4;
			}
			else
			{
//				rs4_Buff[rs4_In] = ch;		/*Discard the latest received data*/
			}
			break;

		default:			
			break;
	}

	return;
	
//	if (!BarRecFlag)
//	{
//		CodeBuf[BarCnt] = ch;
//		if((CodeBuf[BarCnt] == ETX) || (CodeBuf[BarCnt] == CR))
//		{
//			BarRecFlag = 1;
//			bellcnt = 0xfe;
//		}
//		else if(CodeBuf[BarCnt] == LF)
//		{
//			return;
//		}
//		BarCnt++;
//		BarCnt &= BARBUFLEN;
//	}
}

/*
 *****************************************************************
 * Store the Electronic scale data to receive buffer
 * 
 * Note : For WD2-KR, we will not use the electronic scale, so this
 *        function is not using
 ****************************************************************/
void	Uart_Scale_Data_Store(BYTE	port, BYTE	ch)
{
	port ++;
	ch ++;				/* To avoid the compilter warnning*/
}

/******************************************************************************
* Describe: UART 0 baudrate Set, if value is not stand baudrate, retrun NG.
* Input :   baud --- BRG_96 ~ BRG_576, (BRG_1152 is reserved)
* Output:   void
* return:   void
******************************************************************************/
byte Uart_SetBaudRate(byte port, word baud)
{
	baud = GetBaud(ser_port[port].baud_idx);
	if ((baud == BRG_576) || (baud == BRG_384) || (baud == BRG_192) || 
		(baud == BRG_96) || (baud == BRG_1152) || (baud == BRG_48))
	{
		if(port == PORT0)
		{
			PORT0_re = 0;
			PORT0_te = 0;
			PORT0_brg = baud;
			PORT0_re = 1;
			PORT0_te = 1;
			return OK;
		}
		else if(port == PORT1)
		{
			PORT1_re = 0;
			PORT1_te = 0;
			PORT1_brg = baud;
			PORT1_re = 1;
			PORT1_te = 1;
			return OK;
		}
		else if(port == PORT2)
		{
			PORT2_re = 0;
			PORT2_te = 0;
			PORT2_brg = baud;
			PORT2_re = 1;
			PORT2_te = 1;
			return OK;
		}
		else if(port == PORT3)
		{
			PORT3_re = 0;
			PORT3_te = 0;
			PORT3_brg = baud;
			PORT3_re = 1;
			PORT3_te = 1;

⌨️ 快捷键说明

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