티스토리 뷰

반응형

# USART 라이브러리 


AVR ATmega328P Chip 기준으로 하여

Atmel Studio 7.0으로 작성되었습니다.


Update : 2018/01/01

 

UART.h


UART.c



# UART.h

#ifndef _UART_H_
#define _UART_H_

#include <avr/io.h>

void UART_INIT(void); // UART 초기화
unsigned char UART_receive(void); // 1바이트 수신
void UART_transmit(unsigned char data); // 1바이트 송신
void UART_printString(char *str); // 문자열 송신
void UART_print8bitNumber(uint8_t no); // 숫자를 문자열로 변환하여 송신
void UART_print16bitNumber(uint16_t no);
void UART_print32bitNumber(uint32_t no);

#endif


# UART.c

#include "UART.h"

void UART_INIT(void)
{
	UCSR0A |= _BV(U2X0);                                // 2배속 모드
	
	UBRR0H = 0x00;                                      // 통신 속도(보율) 설정
	UBRR0L = 207;// 보율 = 9600
	
	// 비동기, 8비트 데이터, 패리티 없음, 1비트 정지 비트 모드
	UCSR0C |= 0x06;
	
	UCSR0B |= _BV(RXEN0);                               // 송수신 가능
	UCSR0B |= _BV(TXEN0);
}
unsigned char UART_receive(void)                            // 1바이트 수신
{
	while( !(UCSR0A & (1<<RXC0)) );                     // 데이터 수신 대기
	return UDR0;
}

void UART_transmit(unsigned char data)                      // 1바이트 송신
{
	while( !(UCSR0A & (1<<UDRE0)) );                    // 송신 가능 대기
	UDR0 = data;
}

void UART_printString(char *str)                            // 문자열 송신
{
	for(int i=0; str[i]; i++)                           // '\0' 문자를 만날 때까지 반복
	UART_transmit(str[i]);                              // 바이트 단위 출력
}

void UART_print8bitNumber(uint8_t no)                  // 숫자를 문자열로 변환하여 송신, 8비트
{
	char numString[4] = "0";
	int i, index = 0;
	
	if(no > 0)// 문자열 변환
	{
		for(i=0; no!=0; i++)
		{
			numString[i] = no % 10 + '0';
			no = no / 10;
		}
		numString[i] ='\0';
		index = i-1;
	}
	for(i=index; i>=0; i--)                            // 변환된 문자열 출력
	UART_transmit(numString[i]);
}

void UART_print16bitNumber(uint16_t no)               // 숫자를 문자열로 변환하여 송신, 8비트
{
	char numString[6] = "0";
	int i, index = 0;
	
	if(no > 0)// 문자열 변환
	{
		for(i=0; no!=0; i++)
		{
			numString[i] = no % 10 + '0';
			no = no / 10;
		}
		numString[i] ='\0';
		index = i-1;
	}
	for(i=index; i>=0; i--)                            // 변환된 문자열 출력
	UART_transmit(numString[i]);
}

void UART_print32bitNumber(uint32_t no)               // 숫자를 문자열로 변환하여 송신, 8비트
{
	char numString[11] = "0";
	int i, index = 0;
	
	if(no > 0)// 문자열 변환
	{
		for(i=0; no!=0; i++)
		{
			numString[i] = no % 10 + '0';
			no = no / 10;
		}
		numString[i] ='\0';
		index = i-1;
	}
	for(i=index; i>=0; i--)                            // 변환된 문자열 출력
	UART_transmit(numString[i]);
}


 Ref. 아트멜 스튜디오와 아두이노로 배우는 ATmega328 프로그래밍 (출판사 - 제이펍)


반응형

'Electronic Engineering > Digital ' 카테고리의 다른 글

uint8/16/32/64_t 의미  (0) 2018.01.07
풀업(Pull-Up) 저항과 풀다운(Pull-Down) 저항  (5) 2018.01.05
RS232 / RS422 / RS485 정리  (0) 2018.01.02
UART 와 USART의 차이  (0) 2017.12.29
UART 통신 이론  (0) 2017.12.29
댓글