C styleでUARTを利用しようとします。
stdio.hを使っても良いですが、
メモリーを減りたいので
作ってみました。
uart.c
/*
* UART.c
*
* Created: 2017-08-03 10:57:22
* Author: Dreamwalker
*/
#include "UART.h"
void UART_INIT(void){
UCSR0A |= (1 << U2X0);
UBRR0H = 0x00;
UBRR0L = 207; // 9600bps
/*
asynchronous
8bit data
parity none
stop bit : 1bit
*/
UCSR0C |= 0x06;
UCSR0B |= (1 << RXEN0);
UCSR0B |= (1 << TXEN0);
}
unsigned char UART_receive(void){
while(!(UCSR0A & (1 << RXC0)));
return UDR0;
}
void UART_transmit(unsigned char data){
while( !(UCSR0A & (1 << UDRE0)) );
UDR0 = data;
}
void UART_printString(char *str){
for (int i = 0; str[i]; i++)
{
UART_transmit(str[i]);
}
}
void UART_print8bitNumber(uint8_t num){
char numString[4] = "0";
int i, index = 0;
if (num > 0)
{
for (i = 0; num != 0; i++)
{
numString[i] = num % 10 + '0';
num = num / 10;
}
numString[i] = '\0';
index = i - 1;
}
for (i = index; i >= 0; i--)
{
UART_transmit(numString[i]);
}
}
/***
* number -> string function
* @param : num
*/
void UART_print16bitNumber(uint16_t num){
char numString[6] = "0";
int i, index =0;
if (num > 0){
for (i = 0; num != 0; i++){
numString[i] = num % 10 + '0';
num = num / 10;
}
numString[i] = '\0';
index = i - 1;
}
for (i = index; i >= 0; i--){
UART_transmit(numString[i]);
}
}
void UART_print32bitNumber(uint32_t num){
char numString[11] = "0";
int i, index =0;
if (num > 0){
for (i = 0; num != 0; i++){
numString[i] = num % 10 + '0';
num = num / 10;
}
numString[i] = '\0';
index = i - 1;
}
for (i = index; i >= 0; i--){
UART_transmit(numString[i]);
}
}
uart.h
#ifndef _UART_H_
#define _UART_H_
#include <avr/io.h>
void UART_INIT(void);
unsigned char UART_receive(void);
void UART_transmit(unsigned char data);
void UART_printString(char *str);
void UART_print8bitNumber(uint8_t num);
void UART_print16bitNumber(uint16_t num);
void UART_print32bitNumber(uint32_t num);
#endif /* UART_H_ */