Код: Выделить всё
#define F_CPU 7372800UL
#define BAUND 9600L
#define UBRRL_value (F_CPU/(BAUND*16))-1
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#define MAIN_H_
#define LCD_H_
#define LCD_DDR DDRD
#define LCD_PORT PORTD
#define LCD_PIN PIND
#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA
#define BTN_DDR DDRC
#define BTN_PORT PORTC
#define BTN_PIN PINC
#define DATA 0b11110000
#define RS PD2
#define E PD3
#define E1 LCD_PORT|=(1<<E)
#define E0 LCD_PORT&=~(1<<E)
#define RS1 LCD_PORT|=(1<<RS)
#define RS0 LCD_PORT&=~(1<<RS)
#define LED1_R1 LED_PORT|=(1<<PA0)
#define LED1_R0 LED_PORT&=~(1<<PA0)
#define LED1_G1 LED_PORT|=(1<<PA1)
#define LED1_G0 LED_PORT&=~(1<<PA1)
#define LED1_B1 LED_PORT|=(1<<PA2)
#define LED1_B0 LED_PORT&=~(1<<PA2)
#define LED2_G1 LED_PORT|=(1<<PA3)
#define LED2_G0 LED_PORT&=~(1<<PA3)
#define LED2_R1 LED_PORT|=(1<<PA4)
#define LED2_R0 LED_PORT&=~(1<<PA4)
#define LED3_Y1 LED_PORT|=(1<<PA5)
#define LED3_Y0 LED_PORT&=~(1<<PA5)
#define LED4_B1 LED_PORT|=(1<<PA6)
#define LED4_B0 LED_PORT&=~(1<<PA6)
#define LED5_G1 LED_PORT|=(1<<PA7)
#define LED5_G0 LED_PORT&=~(1<<PA7)
#define BTN_PLAY_PAUSE (~PINC&(1<<PC0))
#define BTN_PREV (~PINC&(1<<PC1))
#define BTN_NEXT (~PINC&(1<<PC2))
#define BTN_VOL_MIN (~PINC&(1<<PC3))
#define BTN_VOL_PLS (~PINC&(1<<PC4))
#define BTN_RAND (~PINC&(1<<PC5))
#define BTN_REPEAT (~PINC&(1<<PC6))
#define BTN_MODE (~PINC&(1<<PC7))
#define FLAG_END_RX (1<<3)
#define FLAG_ERR_RX (1<<4)
#define BUF_SIZE 20
char rx_buf[BUF_SIZE];
char buf_index = 0;
char rxb;
volatile start=1, flags;
uint8_t n=0;
char ind7=0;
char ind6=0;
char ind5=0;
char ind4=0;
char ind3=0;
char ind2=0;
char ind1=0;
char ind0=0;
char chl=0;
char min=0;
char sec=0;
char vol=0;
char mode=0;
char repeat=0;
unsigned int dec=0;
unsigned int def=0;
unsigned int dek=0;
unsigned int dec_chl=0;
void lcd_ini(void);
void lcd_str(char* str);
void lcd_pos(uint8_t line, uint8_t pos);
void lcd_num(uint8_t num, uint8_t line, uint8_t pos);
void bt201_start(void);
void bt201_start (void)
{
/*
//Команда AT+CT01 задаём модулю скорость 9600
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('T');
send_UART('0');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(2000);
*/
//Команда AT+CM02 зададаём модулю режим воспроизведения с USB
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('M');
send_UART('0');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
//Устанавливаем значение 2 в переменной mode
mode=2;
//Команда AT+CA15 задаём модулю уровень громкости на 15
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('A');
send_UART('1');
send_UART('5');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(2000);
//Конвертируем значение уровня звука в ASCII
vol = 15;
dek = vol%10;
def = vol/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
//Выводим на дисплей уровень звука
lcd_pos(0,11);
lcd_str("VOL");
lcd_pos(0,14);
send_byte(ind1,1);
lcd_pos(0,15);
send_byte(ind0,1);
//Команда AT+AA00 останавливаем воспроизведение
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('A');
send_UART('0');
send_UART('0');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(100);
//Команда AT+AA01 задаём модулю команду PLAY
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('A');
send_UART('0');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
}
void write(uint8_t n)
{
n<<=4;
E1;
LCD_PORT&=~DATA;
LCD_PORT|=n;
_delay_us(1);
E0;
}
void send_byte(uint8_t byte, uint8_t tip)
{
if (tip) //если тип данные на линии RS 1
{
RS1;
}
else //иначе тип команда и на линии RS 0
{
RS0;
}
write(byte>>4); //передача старшего полубайта
_delay_us(250);
write(byte); //передача младшего полубайта
_delay_us(250);
}
void lcd_ini(void)
{
LCD_DDR|=DATA | (1<<RS) | (1<<E);
_delay_ms(20);
RS0;
write(3);
_delay_ms(5);
write(3);
_delay_us(150);
write(3);
_delay_us(50);
write(2);
_delay_us(50);
send_byte(40,0);
_delay_us(50);
send_byte(12,0);
_delay_us(50);
send_byte(1,0);
_delay_ms(2);
send_byte(6,0);
_delay_us(50);
}
void lcd_str(char* str)
{
uint8_t n=0;
while(str[n])
{
send_byte(str[n],1);
n++;
}
}
void lcd_pos(uint8_t line, uint8_t pos)
{
uint8_t adress=(line*0x40+pos)|0x80;
send_byte(adress,0);
_delay_us(50);
}
void init_UART()
{
UBRRL = UBRRL_value;
UBRRH = UBRRL_value>>8;
UCSRB|=(1<<TXEN);
UCSRB|=(1<<RXEN);
UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1));
UCSRB|=(1<<RXCIE);
sei();
flags = 0;
}
void send_UART(char value)
{
while(!(UCSRA&(1<<UDRE)));
UDR=value;
}
char CharToInt(char c)
{
char chl=0;
if ('0' <= c && c <= '9')
{
chl=c-48;
}
else if ('A' <= c && c <= 'F')
{
chl=c-55;
}
return chl;
}
char CharToDec(unsigned int s)
{
unsigned int dec_chl=0;
dek = s%10;
def = s/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
dek = def%10;
def = def/10;
ind2 = dek+48;
dek = def%10;
def = def/10;
ind3 = dek+48;
dek = def%10;
def = def/10;
ind4 = dek+48;
dek = def%10;
def = def/10;
ind5 = dek+48;
dek = def%10;
def = def/10;
ind6 = dek+48;
dek = def%10;
def = def/10;
ind7 = dek+48;
return dec_chl;
}
char Time(unsigned int s)
{
char min = s/60;
char sec = s%60;
dek = min%10;
def = min/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
dek = sec%10;
def = sec/10;
ind2 = dek+48;
dek = def%10;
def = def/10;
ind3 = dek+48;
return min;
}
ISR(USART_RXC_vect)
{
char rxb = UDR;
if(!(flags & FLAG_END_RX))
{
rx_buf[buf_index]=rxb;
if(rx_buf[buf_index] == 0x0D)
{
flags |= FLAG_END_RX;
return;
}
buf_index++;
if(buf_index >= BUF_SIZE)
{
buf_index = 0;
flags |= FLAG_ERR_RX;
}
}
}
int main(void)
{
init_UART();
lcd_ini();
void bt201_start();
_delay_ms(500);
send_UART('O');
send_UART('K');
send_UART('!');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
flags = 0;
while(1)
{
char i = 0;
if (rx_buf[i] == 'M')
{
i++;
if (rx_buf[i] == '1')
{
//M1 Номер текущего файла
long dec = CharToInt(rx_buf[3]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[4]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[5]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[6]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[7]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[8]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[9]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[10]);
_delay_us(1);
CharToDec(dec);
lcd_pos(1,0);
send_byte(ind3,1);
lcd_pos(1,1);
send_byte(ind2,1);
lcd_pos(1,2);
send_byte(ind1,1);
lcd_pos(1,3);
send_byte(ind0,1);
lcd_pos(1,4);
send_byte('/',1);
_delay_ms(300);
}
else if (rx_buf[i] == '2')
{
//M2 Общее колличество звуковых файлов
long dec = CharToInt(rx_buf[3]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[4]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[5]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[6]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[7]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[8]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[9]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[10]);
_delay_us(1);
CharToDec(dec);
lcd_pos(1,5);
send_byte(ind3,1);
lcd_pos(1,6);
send_byte(ind2,1);
lcd_pos(1,7);
send_byte(ind1,1);
lcd_pos(1,8);
send_byte(ind0,1);
_delay_ms(300);
}
else if (rx_buf[i] == 'T')
{
//MT Общее время воспроизведения
long dec = CharToInt(rx_buf[3]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[4]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[5]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[6]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[7]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[8]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[9]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[10]);
_delay_us(1);
CharToDec(dec);
_delay_us(1);
Time(dec);
lcd_pos(0,7);
send_byte(ind1,1);
lcd_pos(0,8);
send_byte(ind0,1);
lcd_pos(0,9);
send_byte(':',1);
lcd_pos(0,10);
send_byte(ind3,1);
lcd_pos(0,11);
send_byte(ind2,1);
_delay_ms(300);
}
/*else if (rx_buf[i] == 'K')
{
//MK Время воспроизведения текущего файла
long dec = CharToInt(rx_buf[3]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[4]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[5]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[6]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[7]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[8]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[9]);
_delay_us(1);
dec = dec*16 + CharToInt(rx_buf[10]);
_delay_us(1);
CharToDec(dec);
_delay_us(1);
Time(dec);
lcd_pos(0,7);
send_byte(ind1,1);
lcd_pos(0,8);
send_byte(ind0,1);
lcd_pos(0,9);
send_byte(':',1);
lcd_pos(0,10);
send_byte(ind3,1);
lcd_pos(0,11);
send_byte(ind2,1);
_delay_ms(300);
}*/
else if (rx_buf[i] == 'F')
{
//MF Имя текущего файла
lcd_pos(0,0);
send_byte(rx_buf[4],1);
lcd_pos(0,1);
send_byte(rx_buf[5],1);
lcd_pos(0,2);
send_byte(rx_buf[6],1);
lcd_pos(0,3);
send_byte(rx_buf[7],1);
lcd_pos(0,4);
send_byte(rx_buf[8],1);
lcd_pos(0,5);
send_byte(rx_buf[9],1);
_delay_ms(300);
}
else if (rx_buf[i] == 'P')
{
//MP Текущее состояние плеера
if (rx_buf[4] == 0)
{
//Стоп
LED2_R1;
LED2_G0;
_delay_ms(300);
}
if (rx_buf[4] == 1)
{
//Воспроизведение
LED2_G1;
LED2_R0;
_delay_ms(300);
}
if (rx_buf[4] == 2)
{
//Пауза
LED2_R1;
LED2_G0;
_delay_ms(300);
LED2_G1;
LED2_R0;
_delay_ms(300);
}
}
}
else if (rx_buf[i] == 'Q')
{
i++;
if (rx_buf[i] == 'M')
{
//QM Режим работы плеера
if (rx_buf[4] == 1)
{
//Блютус
lcd_pos(0,13);
lcd_str("BLE");
LED1_R1;
LED1_G0;
LED1_B0;
_delay_ms(300);
}
if (rx_buf[4] == 2)
{
//USB Flash
lcd_pos(0,13);
lcd_str("USB");
LED1_R0;
LED1_G1;
LED1_B0;
_delay_ms(300);
}
if (rx_buf[4] == 3)
{
//SD Card
lcd_pos(0,13);
lcd_str(" SD");
LED1_R0;
LED1_G0;
LED1_B1;
_delay_ms(300);
}
}
}
/*
//Команда AT+M1 запрос номера текущего файла
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('M');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(300);
//Команда AT+M2 запрос общего колличества файлов
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('M');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(300);
//Команда AT+MT запрос общего времени воспроизводимого файла
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('M');
send_UART('T');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(300);
//Команда AT+MK запрос текущего времени воспроизводимого файла
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('M');
send_UART('K');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(300);
*/
if (BTN_PREV)
{
//Команда AT+CD задаём модулю воспроизведение предыдущего трека
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('D');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(500);
}
if (BTN_NEXT)
{
//Команда AT+CC задаём модулю воспроизведение следующего трека
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('C');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(500);
}
if (BTN_VOL_MIN)
{
//Команда AT+CF задаём модулю уменьшение громкости
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('F');
send_UART(0x0D);
send_UART(0x0A);
vol--;
_delay_ms(200);
//Конвертируем значение уровня звука в ASCII
dek = vol%10;
def = vol/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
//Выводим на дисплей уровень звука
lcd_pos(0,11);
lcd_str("VOL");
lcd_pos(0,14);
send_byte(ind1,1);
lcd_pos(0,15);
send_byte(ind0,1);
}
if (BTN_VOL_PLS)
{
//Команда AT+CE задаём модулю увеличение громкости
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('E');
send_UART(0x0D);
send_UART(0x0A);
vol++;
_delay_ms(200);
//Конвертируем значение уровня звука в ASCII
dek = vol%10;
def = vol/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
//Выводим на дисплей уровень звука
lcd_pos(0,11);
lcd_str("VOL");
lcd_pos(0,14);
send_byte(ind1,1);
lcd_pos(0,15);
send_byte(ind0,1);
}
if (BTN_MODE)
{
if (mode == 3)
{
//Команда AT+CM01 зададаём модулю режим воспроизведения с BLE
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('M');
send_UART('0');
send_UART('1');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
//Устанавливаем значение 1 в переменной mode
mode=1;
}
if (mode == 2)
{
//Команда AT+CM03 зададаём модулю режим воспроизведения с SD CARD
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('M');
send_UART('0');
send_UART('3');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(20);
//Устанавливаем значение 3 в переменной mode
mode=3;
}
if (mode == 1)
{
//Команда AT+CM02 зададаём модулю режим воспроизведения с USB
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('M');
send_UART('0');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(20);
//Устанавливаем значение 2 в переменной mode
mode=2;
}
}
if (BTN_PLAY_PAUSE)
{
//Команда AT+CB даём модулю команду PLAY/PAUSE
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('C');
send_UART('B');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(20);
}
if (BTN_REPEAT)
{
/*
if (repeat == 2)
{
repeat=0;
//Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('C');
send_UART('0');
send_UART('0');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
LED3_Y0;
LED4_B0;
}
else
{
repeat=2;
//Команда AT+AC02 воспроизведение в цикле
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('C');
send_UART('0');
send_UART('2');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
LED3_Y1;
LED4_B0;
}
*/
}
if (BTN_RAND)
{
/*
if (repeat == 3)
{
repeat=0;
//Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('C');
send_UART('0');
send_UART('0');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
LED3_Y0;
LED4_B0;
}
else
{
repeat=3;
//Команда AT+AC03 воспроизведение в случайном порядке
send_UART('A');
send_UART('T');
send_UART('+');
send_UART('A');
send_UART('C');
send_UART('0');
send_UART('3');
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(10);
LED3_Y0;
LED4_B1;
}
*/
}
}
}