📄 uart-16sm._c
字号:
// Title: UART-16sm.c
/* UCSRA: Control & Status Register A
b7-RXC: USART receive complete
b6-TXC: USART transmit complete
b5-UDRE: USART Data register empty
b4-FE: Frame Error
b3-DOR: Data overtun
b2-PE: Parity error
b1-U2X: double the USART transmission speed
b0-MPCM: multi-processor communication mode
USARB
* b7-RXCIE: RX complete interrupt enable
b6-TXCIE: TX complete interrupt enable
b5-UDRIE: USART data register empty interrupt enable
* b4-RXEN: Receiver enable
* b3-TXEN: Transmitter enable
b2-UCSZ2: chracter size ------->0
b1-RXB8 receive data bit 8
b0-TXB8: Transmit data 8
UCSRC
* b7-URSEL: register select 0/UBRRH, 1/UCSRC
b6-UMSEL: USART mode select 0/Asyn 1/Synchronous
b5-UPM1: -------- Parity mode 00/disable, 01 reserved
b4-UPM0: -------- 10 even, 11 odd
b3-USBS: stop bit selection 0/1-bit, 1/2-bit
* b2-UCSZ1 --------> 1
* b1-UCSZ0 --------> 1
b0-UCPOL: clock polarity 0 rising XCK edge, 1 falling XCK edge
*/
#include <iom16v.h>
#include <macros.h>
#pragma interrupt_handler uart_rx_isr: 12
unsigned char RecBuf[40];
int rec_head=0, rec_tail=0;
unsigned rec_data;
void uart_rx_isr(void)
{
RecBuf[rec_head]=UDR;
rec_head++;
if(rec_head>=40)
rec_head=0;
}
void port_init(void)
{
DDRA = 0xFF; //set PortA output
DDRB = 0xff; //set PORTB output
DDRC = 0x00; //set PORTC output
PORTC = 0xff;
DDRD = 0x7f; //set PD.7 input for RX
}
void USART_init(void)
{
UCSRB=0x00;
UCSRA=0x00;
UCSRB=0b10011000; //b7: RXCIE enabeled, b4: RXEN enabled, B3: TXEN enabled
UBRRH=0x00; //
//Crystal=16MHx
//UBRRL=103; //Bausdrate=9600 tested work fine
//UBRRL=51; //Baudrate=19200 tested work fine
UBRRL=25; //Baudrate=38400 tested work fine
//UBRRL=8; //Baurate=115200 tested work fine
UCSRC=0b10000110; //Asyn, No parity, 1-stop, 8-bit, rising edge
memset(RecBuf, 0, sizeof(RecBuf));
rec_head=0;
rec_tail=0;
}
void delay(int count)
{
int i, j;
for(i=count; i>0; i--)
for(j=10; j>0; j--)
;
}
void transmit(unsigned char abyte)
{
UDR=abyte;
while(!(UCSRA&0b01000000)) //b6=1 TXE
;
}
//*****************************************************************
void main(void)
{
unsigned char outa=0b01010101, outb=0b10101010, outc=0x00, outd=0x00;
int dswin;
port_init();
USART_init();
SEI();
while(1)
{
WDR(); //Watchdog reset
if(rec_head!=rec_tail)
{
rec_data=RecBuf[rec_tail];
rec_tail++;
if(rec_tail>=40)
rec_tail=0;
dswin=rec_head<<2;
PORTD=dswin;
PORTA=rec_data;
transmit(rec_data);
if(rec_data==13)
transmit(10);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -