📄 uart.c
字号:
/* file: uart.c
* author: xuhuashan@gmail.com
* create date: 2006/04/15
*/
#include <STC12C2052AD.H>
#include "uart.h"
#define XTAL 22118400L
//#define XTAL 11059200L
#define BAUDRATE 38400
#define RX_BUF_LEN 16
#define TX_BUF_LEN 16
//receive buffer
uchar idata rxBuf[RX_BUF_LEN];
ubyte rxPos = 0;
ubyte rxCnt = 0;
uchar idata txBuf[TX_BUF_LEN];
ubyte txPos = 0;
ubyte txCnt = 0;
uchar txDone = true;
static void UartInterruptRoutine(void) interrupt 4 using 3
{
uchar c;
if(RI)
{
RI = 0;
c = SBUF;
if(rxCnt < RX_BUF_LEN)
{
rxBuf[(rxPos + rxCnt) % RX_BUF_LEN] = c;
rxCnt++;
}
}
if(TI)
{
TI = 0;
if(txCnt)
{
SBUF = txBuf[txPos];
txCnt--;
txPos = (txPos + 1) % TX_BUF_LEN;
}
else
txDone = 1;
}
}
void InitUart(void)
{
PCON |= 0x80; // 0x80=SMOD: set serial baudrate doubler
TMOD = (TMOD & 0x0F ) | 0x20; // put timer 1 into MODE 2
TH1 = TL1 = (uchar)(256 - (XTAL / (16L * 12L * BAUDRATE)));
TR1 = 1; // start timer 1
SCON = 0x50; // serial port MODE 1, enable serial receiver
PS = 0; // serial interrupt low level
ES = 1; // enable serial interrupts
}
ubyte UartGetChar(uchar *c)
{
ES = 0;
if(rxCnt > 0)
{
*c = rxBuf[rxPos];
rxPos = (rxPos + 1) % RX_BUF_LEN;
rxCnt --;
ES = 1;
return 1;
}
ES = 1;
return 0;
}
ubyte UartPutChar(const uchar c)
{
ubyte result = 0;
ES = 0;
if(txCnt < TX_BUF_LEN)
{
txBuf[(txPos + txCnt) % TX_BUF_LEN] = c;
txCnt++;
if (txDone)
{
txDone = 0;
TI = 1;
}
result = 1;
}
ES = 1;
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -