📄 f34x_uart_multiuart.c
字号:
P2MDOUT |= 0x04; // set LED to push-pull
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure the UART0 using Timer1, for baudrate; and 8-N-1.
//
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
// level of STOP bit is ignored
// RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
if (SYSCLK/BAUDRATE0/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE0/2);
CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx
CKCON |= 0x08;
} else if (SYSCLK/BAUDRATE0/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE0/2/4);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
CKCON |= 0x09;
} else if (SYSCLK/BAUDRATE0/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE0/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
} else {
TH1 = -(SYSCLK/BAUDRATE0/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
CKCON |= 0x02;
}
TL1 = TH1; // init Timer1
TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TR1 = 1; // START Timer1
TI0 = 1; // Indicate TX0 ready
}
//-----------------------------------------------------------------------------
// UART1_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure UART1 for baudrate1 and 8-N-1.
//
//-----------------------------------------------------------------------------
void UART1_Init (void)
{
SMOD1 = 0x0C; // set to disable parity, 8-data bit,
// disable extra bit,
// stop bit 1 bit wide
SCON1 = 0x10; // SCON1: 8-bit variable bit rate
// level of STOP bit is ignored
// RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
if (SYSCLK/BAUDRATE1/2/0xFFFF < 1) {
SBRL1 = -(SYSCLK/BAUDRATE1/2);
SBCON1 |= 0x03; // set prescaler to 1
} else if (SYSCLK/BAUDRATE1/2/0xFFFF < 4) {
SBRL1 = -(SYSCLK/BAUDRATE1/2/4);
SBCON1 &= ~0x03;
SBCON1 |= 0x01; // set prescaler to 4
} else if (SYSCLK/BAUDRATE1/2/0xFFFF < 12) {
SBRL1 = -(SYSCLK/BAUDRATE1/2/12);
SBCON1 &= ~0x03; // set prescaler to 12
} else {
SBRL1 = -(SYSCLK/BAUDRATE1/2/48);
SBCON1 &= ~0x03;
SBCON1 |= 0x02; // set prescaler to 4
}
SCON1 |= 0x02; // indicate ready for TX
SBCON1 |= 0x40; // enable baud rate generator
}
//-----------------------------------------------------------------------------
// putchar
//-----------------------------------------------------------------------------
//
// Return Value : UART0/1 buffer value
// Parameters : character to be transmitted across UART0/1
//
// This is an overloaded fuction found in the stdio library. When the
// function putchar is called, either by user code or through calls to stdio
// routines such as printf, the following routine will be executed instead
// of the function located in the stdio library.
//
// The function checks the UART global variable to determine which UART to
// use to receive a character.
//
// The routine expands '\n' to include a carriage return as well as a
// new line character by first checking to see whether the character
// passed into the routine equals '\n'. If it is, the routine waits for
// TI0/TI1 to be set, indicating that UART 0/1 is ready to transmit another
// byte. The routine then clears TI0/TI1 bit, and sets the UART0/1 output
// buffer to '0x0d', which is the ASCII character for carriage return.
//
// The routine the waits for TI0/TI1 to be set, clears TI0/TI1, and sets
// the UART output buffer to <c>.
//
//-----------------------------------------------------------------------------
char putchar (char c) {
if (UART == 0) {
if (c == '\n') { // check for newline character
while (!TI0); // wait until UART0 is ready to transmit
TI0 = 0; // clear interrupt flag
SBUF0 = 0x0d; // output carriage return command
}
while (!TI0); // wait until UART0 is ready to transmit
TI0 = 0; // clear interrupt flag
return (SBUF0 = c); // output <c> using UART 0
}
else if (UART == 1) {
if (c == '\n') { // check for newline character
while (!(SCON1 & 0x02)); // wait until UART1 is ready to transmit
SCON1 &= ~0x02; // clear TI1 interrupt flag
SBUF1 = 0x0d; // output carriage return
}
while (!(SCON1 & 0x02)); // wait until UART1 is ready to transmit
SCON1 &= ~0x02; // clear TI1 interrupt flag
return (SBUF1 = c); // output <c> using UART 1
}
}
//-----------------------------------------------------------------------------
// _getkey
//-----------------------------------------------------------------------------
//
// Return Value : byte received from UART0/1
// Parameters : none
// This is an overloaded fuction found in the stdio library. When the
// function _getkey is called, either by user code or through calls to stdio
// routines such as scanf, the following routine will be executed instead
// of the function located in the stdio library.
//
// The function checks the UART global variable to determine which UART to
// use to receive a character.
//
// The routine waits for RI0/RI1 to be set, indicating that a byte has
// been received across the UART0/UART1 RX line. The routine saves the
// received character into a local variable, clears the RI0/RI1 interrupt
// flag, and returns the received character value.
//
//-----------------------------------------------------------------------------
char _getkey () {
char c;
if (UART == 0) {
while (!RI0); // wait until UART0 receives a character
c = SBUF0; // save character to local variable
RI0 = 0; // clear UART0 receive interrupt flag
return (c); // return value received through UART0
}
else if (UART == 1) {
while (!(SCON1 & 0x01)); // wait until UART1 receives a character
c = SBUF1; // save character to local variable
SCON1 &= ~0x01; // clear UART1 receive interrupt flag
return (c); // return value received through UART1
}
}
//-----------------------------------------------------------------------------
// Delay
//-----------------------------------------------------------------------------
//
// Return Value : none
// Parameters : none
//
// Used for a small pause of approximately 40 us.
//
//-----------------------------------------------------------------------------
void Delay(void)
{
int x;
for(x = 0;x < 500;x)
x++;
}
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -