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

📄 rs232.c

📁 一个LCD TV的源程序, 用的是realtek的IC
💻 C
字号:
/********************************************************************

      COPYRIGHT  (C)  Himax Technologies, Inc.

      File name     : rs232.c

      Description   : Implement rs232 relative function

      Author        : Taylor

      Create date   : 2004.10.04

      Modifications :

*********************************************************************/

#define _RS232_C


/********************** Include Section *****************************/

#include "rs232.h"
#include "main.h"

/**************** Function Implement Section ************************/

/* ================================================================
    Name    : Init_UART
    Purpose : Initial UART
    Passed  : None
    Notes   : None
   ================================================================ */

void Init_UART(void)
{
	SCON = 0x41;                                            /* set SCON to mode 1 8/N/1 disable REN */
	TMOD |= 0x20;                                           /* set T1 to 8 bits auto reload */
	TL1 = TH1 = TH_RELOAD;
	/* init UART RX buf */
    UART_Rx.Buf 	= UART_Rx_BUF;
    UART_Rx.Head 	= 0;
	UART_Rx.Tail 	= 0;
    UART_Rx.Count   = 0;
    /* init UART TX buf */
    UART_Tx.Buf 	= UART_Tx_BUF;
    UART_Tx.Head 	= 0;
	UART_Tx.Tail 	= 0;
    UART_Tx.Count   = 0;
    /* run it */
    TR1 			= 1;
    /* Enable Receive */
    REN             = 1;
    /* Serial port enable Timer 1 */
    ES			    = 1;
}


/* ================================================================
    Name    : Puts_UART
    Purpose : Output One String
    Passed  : None
    Notes   : None
   ================================================================ */

void Puts_UART(char *s)
{
	Byte  i;

	for(i=0; s[i] != '\0'; i++)
		while(!Put_UART(s[i]));
}


/* ================================================================
    Name    : Put_UART
    Purpose : Output One Char
    Passed  : None
    Notes   : None
   ================================================================ */

bit Put_UART(Byte  c)
{
	if(UART_Tx.Count < SIZE_OF_UART_TX_BUF - 1){            /* TX QUEUE is full? */
    	UART_Tx.Buf[UART_Tx.Tail++] = c;                    /* if no, put data into TX QUEUE */
    	if(UART_Tx.Tail >= SIZE_OF_UART_TX_BUF)             /* roll over? */
      		UART_Tx.Tail = 0;
    	ES = 0;                                             /* enter critical section */
			if(UART_Tx.Count++ == 0)                            /* if UART TX stop, retrigger it */
				SBUF = UART_Tx.Buf[UART_Tx.Head];
    	ES = 1;                                             /* leave critical section */
    	return TRUE;                                        /* process is OK */
	}
	else
    	return FALSE;                                       /* buffer is full */
}

/* ================================================================
    Name    : HexTobyStr
    Purpose : Change HEX Number to String on RS232
    Passed  : None
    Notes   : None
   ================================================================ */

void HexTobyStr(Byte  c)
{
	Byte  byData;

	/* transfer HIGH nibble */
	byData = c >> 4;
	if(byData <= 9)
		byStr[0] = byData + 0x30;
	else
		byStr[0] = byData + 55;

	/* transfer LOW nibble */
	byData = c & 0x0F;
	if(byData <= 9)
		byStr[1] = byData + 0x30;
	else
		byStr[1] = byData + 55;
	byStr[2] = '\0';
}


/* ================================================================
    Name    : UART_ISR
    Purpose : RS232 ISR
    Passed  : None
    Notes   : None
   ================================================================ */

void UART_ISR (void) interrupt 4
{
	/* TX */
	if(TI){                                                 /* previous data sended is finished */
    	TI = 0;                                             /* clear TX INT flag */
		if(++UART_Tx.Head >= SIZE_OF_UART_TX_BUF)           /* advanced header pointer */
			UART_Tx.Head = 0;
    	if(--UART_Tx.Count != 0)                            /* still has data need to send? */
				SBUF = UART_Tx.Buf[UART_Tx.Head];           /* if yes. put data into TX BUF */
	}
	/* RX */
  	else{                                                   /* received one data */
		RI = 0;
    	UART_Rx.Buf[UART_Rx.Tail] = SBUF;                   /* insert data into queue */
    	if(++UART_Rx.Tail >= SIZE_OF_UART_RX_BUF)           /* advanced tailer pointer */
      		UART_Rx.Tail = 0;
        bUart_rx_event=TRUE;
    	UART_Rx.Count++;                                    /* increment data counter of RX QUEUE */
	}
}


/* ================================================================
    Name    : Get_UART
    Purpose : Receive String From PC
    Passed  : None
    Notes   : None
   ================================================================ */

Byte Get_UART(void)
{
	Byte  Temp;
	Temp = UART_Rx.Buf[UART_Rx.Head++];                     /* get data into temperate storage */
	if(UART_Rx.Head >= SIZE_OF_UART_RX_BUF)                 /* roll over ? */
		UART_Rx.Head = 0;
	ES = 0;                                                 /* enter CS */
  	if(--UART_Rx.Count == 0)                                /* dec counter of RX QUEUE */
		bUart_rx_event = 0;                                 /* disable rx event */
	ES = 1;                                                 /* leave CS */
  	return Temp;                                            /* return data */
}

⌨️ 快捷键说明

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