📄 uart.c
字号:
#define _UART_C_
#define BAUD 38400
#define CRYSTAL 11059200
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)
#include "includes.h"
extern uint8 isrCount;
void uartInit(uint8 uartNum)
{
if(1==uartNum)
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x06;
UBRR1L = BAUD_L; //set baud rate lo
UBRR1H = BAUD_H; //set baud rate hi
UCSR1B = 0x18;
///共有3个中断源, 接受, 发送, 寄存器空, 对应此寄存器的高3位
}
else
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06; //set frame format, 8 bits, 2stop]
UBRR0H = BAUD_H;
UBRR0L = BAUD_L;
UCSR0B = 0x18; //enable receive and transmite
}
}
void putChar(uint8 num, uint8 dat)
{
ENTER_CRITICAL();
if(1==num)
{
UDR1 = dat;
while(!(UCSR1A&BIT(TXC1))); //发送寄存器空
UCSR1A|=BIT(TXC1);
}
else
{
UDR0 = dat;
while(!(UCSR0A&BIT(TXC0)));
UCSR0A|=BIT(TXC0);
}
EXIT_CRITICAL();
}
void putStr(uint8 num, uint8 * str)
{
ENTER_CRITICAL();
while(*str)
{
putChar(num, *str);
str++;
}
EXIT_CRITICAL();
}
void putNum(uint8 port, uint8 num)
{
if((num>>4)<='9')
{
putChar(port, (num>>4)+'0');
}
else
{
putChar(port, (num>>4)+'A');
}
if((num&0x0f)<='9')
{
putChar(port, (num&0x0f)+'0');
}
else
{
putChar(port, (num&0x0f)+'A');
}
}
uint8 getChar(uint8 num)
{
uint8 temp=0;
ENTER_CRITICAL();
if(1==num)
{
if(UCSR1A&BIT(RXC1)) //no data
{
temp=UDR1;
UCSR1A|=BIT(RXC1);
}
}
else
{
if(UCSR0A&BIT(RXC0)) //no data
{
temp=UDR0;
UCSR0A|=BIT(RXC0);
}
}
EXIT_CRITICAL();
return(temp);
}
////////////////////////////////////////////////
//接受完成中断
////////////////////////////////////////////////
#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
ENTER_CRITICAL();//uart has received a character in UDR
EXIT_CRITICAL();
}
///////////////////////////////////////////////
//发送寄存器空中断
///////////////////////////////////////////////
#pragma interrupt_handler uart1_udre_isr:32
void uart1_udre_isr(void)
{
ENTER_CRITICAL();;//character transferred to shift register so UDR is now empty
EXIT_CRITICAL();
}
//////////////////////////////////////////////
//发送完成中断
//////////////////////////////////////////////
#pragma interrupt_handler uart1_tx_isr:33
void uart1_tx_isr(void)
{
ENTER_CRITICAL();;//character has been transmitted
EXIT_CRITICAL();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -