Cod:
#define F_CPU
8000000UL
#include
<avr/io.h>
#include <util/delay.h>
void UART_Init(void){
// viteza de transmitere baud=9600
UBRRH=0; //UBRR=f/(16*baud)-1,=>f=8000000/(16*9600)=52.08~51
UBRRL=51; //regim normal
dublu directi
// RXC - завершение приёма
// | TXC - завершение передачи
// | | UDRE - отсутствие данных для отправки
// | | | FE - ошибка кадра
// | | | | DOR - ошибка переполнение буфера
// | | | | | PE - ошибка чётности
// | | | | | | U2X - Двойная скорость
// | | | | | | | MPCM - Многопроцессорный режим
// 76543210
UCSRA=0b00000000;
// RXCIE - прерывание при приёме данных
// | TXCIE - прерывание при завершение передачи
// | | UDRIE - прерывание отсутствие данных для отправки
// | | | RXEN - разрешение приёма
// | | | | TXEN - разрешение передачи
// | | | | | UCSZ2 - UCSZ0:2 размер кадра данных
// | | | | | | RXB8 - 9 бит принятых данных
// | | | | | | | TXB8 - 9 бит переданных данных
// 76543210
UCSRB=0b00011000; // разрешен приём и передача по UART
// URSEL - всегда 1
// | UMSEL - режим:1-синхронный 0-асинхронный
// | | UPM1 - UPM0:1 чётность
// | | | UPM0 - UPM0:1 чётность
// | | | | USBS - топ биты: 0-1, 1-2
// | | | | | UCSZ1 - UCSZ0:2 размер кадра данных
// | | | | | | UCSZ0 - UCSZ0:2 размер кадра данных
// | | | | | | | UCPOL- в синхронном режиме - тактирование
// 76543210
UCSRC=0b10000110; // 8-битовая посылка
}
// UART
---------------------------------------------------------------------------
void send_Uart(unsigned char c)
{
while(!(UCSRA&(1<<UDRE))) // 1-
cind registru este liber
{}
UDR = c;
}
//-----------------------------------------------------------------------------------
void send_Uart_str(unsigned char *s)// trimitere string
{
while (*s != 0)
send_Uart(*s++);
}
//-----------------------------------------------------------------------------------
unsigned char getch_Uart(void)// primire
bait de oe UART
{
while(!(UCSRA&(1<<RXC)))
{}
return UDR;
}
//-----------------------------------------------------------------------------------
char CharTo7Seg(char c){
switch (c){
case
'1' : {c=0b00000110; break;} //1
case
'2' : {c=0b01011011; break;} //2
case
'3' : {c=0b01001111; break;} //3
case
'4' : {c=0b01100110; break;} //4
case
'5' : {c=0b01101101; break;} //5
case
'6' : {c=0b01111101; break;} //6
case
'7' : {c=0b00000111; break;} //7
case
'8' : {c=0b01111111; break;} //8
case
'9' : {c=0b01101111; break;} //9
case
'0' : {c=0b01000000; break;} //0
default :c=0x00;
}
return c;
}
//-----------------------------------------------------------------------------------
void main(void)
{char k;
DDRA=0xFF; // p/u 7 seg
PORTA=0x00;
DDRC = 0xFF; // LED
PORTC=0x00;
UART_Init(); // Initializare UART
send_Uart_str("AVR
Studio 4.0"); // trimite un string
send_Uart(13);
send_Uart_str("UART");
send_Uart(13); // "apasare pe enter" - \n
- trece din rind nou
while(1)
{
if(UCSRA&(1<<RXC)) // daca a venit "bait" pe
uart
{k=UDR;
switch
(k){
case
'0':{PORTC^=0b11111111;
PORTA=CharTo7Seg('0');break;}
case
'1':{PORTC^=0b00000001;
PORTA=CharTo7Seg('1'); break;}
case
'2':{PORTC^=0b00000010;
PORTA=CharTo7Seg('2');break;}
case
'3':{PORTC^=0b00000100; PORTA=CharTo7Seg('3');break;}
case
'4':{PORTC^=0b00001000;
PORTA=CharTo7Seg('4');break;}
case
'5':{PORTC^=0b00010000;
PORTA=CharTo7Seg('5');break;}
case
'6':{PORTC^=0b00100000;
PORTA=CharTo7Seg('6');break;}
case
'7':{PORTC^=0b01000000;
PORTA=CharTo7Seg('7');break;}
case
'8':{PORTC^=0b10000000;
PORTA=CharTo7Seg('8');break;}
}
_delay_ms(50); // retinere 50ms
}
}
}
|