#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1
void USART_Init(unsigned int ubrr) {
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}
void USART_Transmit(unsigned char data) {
while (!(UCSR0A & (1<<UDRE0)));
UDR0 = data;
}
char USART_Receive() {
while (!(UCSR0A & (1<<RXC0)));
return UDR0;
}
void ADC_Init() {
ADMUX = (1<<REFS0);
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
int ADC_Read(unsigned char channel) {
ADMUX = (ADMUX & 0xF0) | (channel & 0x0F);
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));
return ADC;
}
int main() {
char s[] = "Comunicacao SERIAL\n";
char bt_press[] = "pressionado\n";
char bt_solto[] = "solto\n";
char buffer[5];
volatile char ch;
volatile char flag_com = 0;
int valor_adc = 0;
DDRC = 0b00000000;
PORTC = 0b00001100;
DDRD = 0b11111111;
PORTD = 0b00000000;
USART_Init(MYUBRR);
ADC_Init();
sei();
while(1) {
if (flag_com == 1) {
switch (ch) {
case 'A':
PORTD |= (1<<PD6); // Liga LED
break;
case 'B':
PORTD &= ~(1<<PD6); // Desliga LED
break;
case 'C':
if (!(PINC & (1<<PINC2)))
USART_TransmitString(bt_press);
else
USART_TransmitString(bt_solto);
break;
case 'D':
valor_adc = ADC_Read(0);
sprintf(buffer, "%4d\n", valor_adc);
USART_TransmitString(buffer);
break;
}
flag_com = 0;
}
}
}
void USART_TransmitString(char *str) {
while (*str) {
USART_Transmit(*str);
str++;
}
}