⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 C++ Source code for writing custom characters on an LCD using ATMEGA16 microcontroler.
💻 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 + -