📄 rs232.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 + -