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

📄 int_uart.c

📁 UART realization for at89c5131 with FIFO and interrupts.
💻 C
字号:
#include "int_uart.h"
#include "Atmel/at89c5131.h"
#include "lcd.h"
BYTE TLength = 0;
BYTE RLength = 0;




static xdata BYTE UART_RFIFO[MaxLength];
static xdata BYTE UART_TFIFO[MaxLength];


static pdata BYTE R_Tail;
static pdata BYTE R_Head;
static pdata BYTE T_Tail;
static pdata BYTE T_Head;



static bit uart;

//--------------------------------------------------------------------
void InterruptUART(void) interrupt 4 using 2
{  
 //  int i;
   register BYTE temp;
   
   if (TI)                                        
     {  
	   	TI = 0;				                       
        if (TLength != 0 )                       
          { SBUF = UART_TFIFO[T_Tail];          
            if (++T_Tail == MaxLength)          
              { T_Tail = 0; }                    
            TLength--;
          }
        else
          {
            uart = 0;
          }
     }
   else 
     {      
      RI = 0;
	  
      temp = SBUF;                                     
      if (!(RLength == MaxLength))                   
        { UART_RFIFO[R_Head] = temp;                
          if (++R_Head == MaxLength)                  
            { R_Head = 0; }                          
          RLength++;
        }  
     }
}		

//--------------------------------------------------------------------
bit uart_putchar(const BYTE Value)
{
 					                         /* Disable Interrupt                         */
  EA = 0;
  if (TLength == MaxLength)                  /* Is UART0 Tx FIFO full                     */
	{ 
		EA = 1;                       /* Enable Interrupt                          */
      return 0; }                         /* Return FALSE                              */

  UART_TFIFO[T_Head] = Value;               /* Put a byte to UART0 Tx FIFO               */
  TLength++;
  if (++T_Head == MaxLength)                 /* Is T_Head0 point to UART0 Tx FIFO tail    */
    { T_Head = 0; }                          /* Set T_Head0 point to UART0 Tx FIFO head   */
  EA = 1;                           /* Enable Interrupt                          */
  return 1;
}
//--------------------------------------------------------------------
bit uart_getchar(BYTE *Value)
{
  	EA = 0;                      /* Disable Interrupt                       */
    if (RLength == 0 )                         /* Is UART0 Rx FIFO empty                  */
      {
	   EA = 1;                       /* Enable Interrupt                        */
        return 0;
	 }                         /* Return FALSE                            */
    *Value = UART_RFIFO[R_Tail];              /* Get a Byte from UART0 Rx FIFO           */
    if (++R_Tail == MaxLength)                 /* Is R_Tail0 point to UART0 Rx FIFO tail  */
      { R_Tail = 0; }                          /* Set R_Tail0 point to UART0 Rx FIFO head */
    RLength--;                                 /*                                         */
    EA = 1;                           /* Enable Interrupt                        */
    return 1;
}
//--------------------------------------------------------------------
void InitUART(void)
{
   	R_Head = 0;
   	R_Tail = 0;
   	T_Head = 0;
   	T_Tail = 0;
   	RLength = 0;
   	TLength = 0;
	ES = 1; /* Enable UART 0 Interrupt */
}

//--------------------------------------------------------------------
void ResetUART(void)
{
	ES = 0;
   	R_Head = 0;
   	R_Tail = 0;
   	T_Head = 0;
   	T_Tail = 0;
   	RLength = 0;
   	TLength = 0;
	ES = 1; /* Enable UART 0 Interrupt */
}
//--------------------------------------------------------------------
void DriveUART(void)
{
	ES = 1;
	EA = 1;
	uart = 1;
	TI = 1;
}  

⌨️ 快捷键说明

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