📄 uart.c
字号:
#include <avr/io.h>
#include <stdio.h>
#include <string.h>
// Functii pentru UART ////////////////////////////////////////////////////////
// pune un singur caracter pe seriala /////////////////////
int uart_putchar(char c, FILE *unused)
{
if( c == '\n' ) // daca caracterul este "end-of-line" CR_LF
uart_putchar( '\r', 0 ); // se reapeleaza functia cu: CR (pentru a face VTerm-ul fericit!)
loop_until_bit_is_set(UCSRA,UDRE ); // asteapta pana cand este trimis caracterul anterior
UDR = c; // se scrie bufferul cu caracterul dorit - apoi, automat,
// UART-ul va face toata treaba
return 0;
}
// se ia un singur caracter de pe seriala /////////////////
int uart_getchar(FILE* f)
{
char c;
loop_until_bit_is_set(UCSRA, RXC); // se asteapta pana exista un caracter nou in bufferul USART-ului
c = UDR; // se preia caracterul
if( c=='\r' ) // daca este un CR, se inlocuieste cu CRLF (vezi uart_putchar)
c='\n';
uart_putchar(c,NULL); // se retrimite caracterul citit inapoi la VTerm pentru efect de echo
return c;
}
// pointerii sunt legatura pentru printf si scanf
FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE ); // stdout replacement
FILE mystdin = FDEV_SETUP_STREAM( NULL, uart_getchar, _FDEV_SETUP_READ ); // stdin replacement
// initializarea UART-ului ////////////////////////////////
void uart_init( void )
{
UBRRH = 0; // baudrate-ul este pe 16 biti si daca procesorul merge la 16 MHz
UBRRL = 0x67; // pentru un baudrate de 9600 registrul UBRR va fi 0x0067
UCSRB = _BV(RXEN) | _BV(TXEN); // UART-ul este activat pentru receptie si transmisie
UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // UART-ul este configurat pentru Rx/Tx de 8 biti
// implicit USBS este 0 = un sigur bit de STOP
// implicit UPM1:0 sunt 0 = fara paritate
stdout = &mystdout;
stdin = &mystdin;
}// IMPORTANT: Verificati daca atat VTerm-ul (Proteus) cat si HiperTerm-ul (Windows) au aceleasi setari
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -