📄 uart.c
字号:
//********************************************************************
// File Name : UART.c
// Author : Steaven
// Created : 2008-10-05
// Modified :
// Revision : V0.0
//********************************************************************
#include "includes.h"
struct SCI_Buffer stSciBuffer;
INT8U bSCI_Event = 0; //SCI Event
INT8U bBuzzer_Count = 0; //Buzzer ON Time
//********************************************************************
// Function : sSet_SCI_Event
// Input : event - SCI Event
// Output : none
// Description : Interface Function
//********************************************************************
void sSet_SCI_Event(INT8U event)
{
bSCI_Event = event;
}
//********************************************************************
// Function : sbGet_SCI_Event
// Input : none
// Output : SCI Event
// Description : Interface Function
//********************************************************************
INT8U sbGet_SCI_Event(void)
{
INT8U event;
event = bSCI_Event;
bSCI_Event = 0;
return(event);
}
//********************************************************************
// Function : sSet_Buzzer_Count
// Input : bCount - Buzzer ON Time
// Output : none
// Description : Interface Function
//********************************************************************
void sSet_Buzzer_Count(INT8U bCount)
{
bBuzzer_Count = bCount;
}
//********************************************************************
// Function : sbGet_Buzzer_Count
// Input : none
// Output : Buzzer ON Time
// Description : Interface Function
//********************************************************************
INT8U sbGet_Buzzer_Count(void)
{
return(bBuzzer_Count);
}
//********************************************************************
// Function : Init_UART
// Input : none
// Output : none
// Description : ATmega16 UART Initialization,9600/N/8/1
//********************************************************************
void Init_UART(void)
{
UCSRA = 0x00;
UCSRB = 0xD8;
UCSRC = 0x86;
UBRRL = 0x33;
SCI_Task_Init();
}
//********************************************************************
// Function : SCI_Task_Init
// Input : none
// Output : none
// Description : Enable UART RX Interrupt and Initialize Buffer
//********************************************************************
void SCI_Task_Init(void)
{
Enable_UART_RX_INT();
SciBuffer_Init(&stSciBuffer);
}
//********************************************************************
// Function : Enable_UART_RX_INT
// Input : none
// Output : none
// Description : Enable UART RX Interrupt
//********************************************************************
void Enable_UART_RX_INT(void)
{
UCSRB |= 0x80;
}
//********************************************************************
// Function : Enable_UART_TX_INT
// Input : none
// Output : none
// Description : Enable UART TX Interrupt
//********************************************************************
void Enable_UART_TX_INT(void)
{
UCSRB |= 0x40;
}
//********************************************************************
// Function : Disable_UART_RX_INT
// Input : none
// Output : none
// Description : Disable UART RX Interrupt
//********************************************************************
void Disable_UART_RX_INT(void)
{
UCSRB &= ~0x80;
}
//********************************************************************
// Function : Disable_UART_TX_INT
// Input : none
// Output : none
// Description : Disable UART TX Interrupt
//********************************************************************
void Disable_UART_TX_INT(void)
{
UCSRB &= ~0x40;
}
//********************************************************************
// Function : UART_TX_DATA
// Input : bData-data to be send
// Output : none
// Description : Write Data to UART TX Reigster
//********************************************************************
void UART_TX_DATA(INT8U bData)
{
UDR = bData;
}
//********************************************************************
// Function : UART_RX_DATA
// Input : none
// Output : data received
// Description : Get Received Data from Register
//********************************************************************
INT8U UART_RX_DATA(void)
{
return(UDR);
}
//********************************************************************
// Function : sUART_RX_ISR
// Input : none
// Output : none
// Description : UART RX Interrupt Service Routine
//********************************************************************
#pragma interrupt_handler sUART_RX_ISR:12
void sUART_RX_ISR(void)
{
INT8U data;
//step1:read receive register to clear interrupt flag
data = UART_RX_DATA();
//step2:report event or store received char to buffer
if((data == 0x0A) || (data == 0x0D))
{
if(sbGetRxBufferEmptyStatus(&stSciBuffer) == false)
{
SciBuffer_Rx_Reset(&stSciBuffer);
sSet_SCI_Event(1);
}
}
else
{
SciBuffer_Rx_In(&stSciBuffer,data);
}
}
//********************************************************************
// Function : sUART_TX_ISR
// Input : none
// Output : none
// Description : UART TX Interrupt Service Routine
//********************************************************************
#pragma interrupt_handler sUART_TX_ISR:14
void sUART_TX_ISR(void)
{
INT8U bData;
if(sbGetTxBufferNoEmptyStatus(&stSciBuffer) == true)
{
bData = SciBuffer_Tx_Out(&stSciBuffer);
UART_TX_DATA(bData);
}
else
{
Disable_UART_TX_INT();
SciBuffer_Tx_Reset(&stSciBuffer);
}
}
//********************************************************************
// Function : SciBuffer_Init
// Input : ptr-pointer to SCI Buffer
// Output : none
// Description : Initialization of SCI Buffer
//********************************************************************
void SciBuffer_Init(struct SCI_Buffer *ptr)
{
ptr->bRxLength = 0;
ptr->bTxLength = 0;
ptr->bTxBufferLength = 0;
}
//********************************************************************
// Function : SciBuffer_Rx_In
// Input : ptr-pointer to SCI Buffer
// Output : none
// Description : Add data into the SCI RX Buffer
//********************************************************************
void SciBuffer_Rx_In(struct SCI_Buffer *ptr,INT8U bData)
{
if(ptr->bRxLength < cMaxRxLength)
{
ptr->bRxBuffer[ptr->bRxLength] = bData;
ptr->bRxLength++;
}
else
{
ptr->bRxBuffer[0] = bData;
ptr->bRxLength = 1;
}
}
//********************************************************************
// Function : SciBuffer_Tx_Out
// Input : ptr-pointer to SCI Buffer
// Output : data from SCI TX Buffer
// Description : Get data from the SCI TX Buffer
//********************************************************************
INT8U SciBuffer_Tx_Out(struct SCI_Buffer *ptr)
{
INT8U bData;
bData = ptr->bTxBuffer[ptr->bTxLength];
ptr->bTxLength++;
return(bData);
}
//********************************************************************
// Function : SciBuffer_Tx_In
// Input : ptr-pointer to SCI Buffer
// Output : none
// Description : Add data into the SCI TX Buffer
//********************************************************************
void SciBuffer_Tx_In(struct SCI_Buffer *ptr,INT8U bData)
{
if(ptr->bTxBufferLength < cMaxTxLength)
{
ptr->bTxBuffer[ptr->bTxBufferLength] = bData;
ptr->bTxBufferLength++;
}
}
//********************************************************************
// Function : sbGetTxBufferNoEmptyStatus
// Input : ptr-pointer to SCI Buffer
// Output : Status of SCI TX Buffer
// Description : Check whether the SCI TX Buffer is empty or not
//********************************************************************
INT8U sbGetTxBufferNoEmptyStatus(struct SCI_Buffer *ptr)
{
if(ptr->bTxLength < ptr->bTxBufferLength)
{
return(true);
}
return(false);
}
//********************************************************************
// Function : sbGetTxBufferNoEmptyStatus
// Input : ptr-pointer to SCI Buffer
// Output : Status of SCI TX Buffer
// Description : Check whether the SCI TX Buffer is empty or not
//********************************************************************
INT8U sbGetTxBufferEmptyStatus(struct SCI_Buffer *ptr)
{
if(ptr->bTxBufferLength == 0)
{
return(true);
}
return(false);
}
//********************************************************************
// Function : sbGetRxBufferEmptyStatus
// Input : ptr-pointer to SCI Buffer
// Output : Status of SCI TX Buffer
// Description : Check whether the SCI TX Buffer is empty or not
//********************************************************************
INT8U sbGetRxBufferEmptyStatus(struct SCI_Buffer *ptr)
{
if(ptr->bRxLength == 0)
{
return(true);
}
return(false);
}
//********************************************************************
// Function : SciBuffer_Rx_Reset
// Input : ptr-pointer to SCI Buffer
// Output : none
// Description : Reset RX Buffer Length to zero
//********************************************************************
void SciBuffer_Rx_Reset(struct SCI_Buffer *ptr)
{
ptr->bRxLength = 0;
}
//********************************************************************
// Function : SciBuffer_Tx_Reset
// Input : ptr-pointer to SCI Buffer
// Output : none
// Description : Reset TX Buffer Length to zero
//********************************************************************
void SciBuffer_Tx_Reset(struct SCI_Buffer *ptr)
{
ptr->bTxLength = 0;
ptr->bTxBufferLength = 0;
}
//********************************************************************
// Function : SciBuffer_Tx_Inc
// Input : ptr-pointer to SCI Buffer
// Output : none
// Description : Increase TX Buffer Length
//********************************************************************
void SciBuffer_Tx_Inc(struct SCI_Buffer *ptr)
{
ptr->bTxLength++;
}
//********************************************************************
// Function : UART_WRITE_DATA
// Input : ptr-pointer to SCI Buffer
// Output : none
// Description : Send the firstIncrease TX Buffer Length
//********************************************************************
void UART_WRITE_DATA(struct SCI_Buffer *ptr)
{
UART_TX_DATA(ptr->bTxBuffer[0]);
SciBuffer_Tx_Inc(ptr);
Enable_UART_TX_INT();
}
//********************************************************************
// Function : C1Command
// Input : none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -