Код: Выделить всё
#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;
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)
{
_delay_ms(2000);
//Команда AT+CM02 зададаём модулю режим воспроизведения с USB
Send_Command("AT+CM02\r\n");
_delay_ms(100);
//Устанавливаем значение 2 в переменной mode
mode=2;
//Команда AT+CA15 задаём модулю уровень громкости на 15
Send_Command("AT+CA15\r\n");
_delay_ms(100);
//Конвертируем значение уровня звука в ASCII
vol = 15;
dek = vol%10;
def = vol/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
//Выводим на дисплей уровень звука
lcd_pos(1,11);
lcd_str("VOL");
lcd_pos(1,14);
send_byte(ind1,1);
lcd_pos(1,15);
send_byte(ind0,1);
//Команда AT+AA00 останавливаем воспроизведение
Send_Command("AT+AA00\r\n");
_delay_ms(100);
//Команда AT+AA01 задаём модулю команду PLAY
Send_Command("AT+AA01\r\n");
_delay_ms(1);
}
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;
}
void Send_Command(char *str)
{
for(uint8_t i = 0; i < strlen(str); i++)
{
while(!(UCSRA&(1<<UDRE)));
UDR=str[i];
}
}
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)
{
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;
}
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;
}
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)
{
BTN_PORT = 0b11111111;
init_UART();
lcd_ini();
flags = 0;
_delay_ms(5000);
bt201_start();
while(1)
{
if (flags == FLAG_END_RX)
{
char i = 0;
if (rx_buf[i] == 'M')//M
{
i++;
if (rx_buf[i] == '1')//1
{
dec=0;
def=0;
dek=0;
ind7=0;
ind6=0;
ind5=0;
ind4=0;
ind3=0;
ind2=0;
ind1=0;
ind0=0;
//M1 Номер текущего файла
long dec = CharToInt(rx_buf[3]);
dec = dec*16 + CharToInt(rx_buf[4]);
dec = dec*16 + CharToInt(rx_buf[5]);
dec = dec*16 + CharToInt(rx_buf[6]);
dec = dec*16 + CharToInt(rx_buf[7]);
dec = dec*16 + CharToInt(rx_buf[8]);
dec = dec*16 + CharToInt(rx_buf[9]);
dec = dec*16 + CharToInt(rx_buf[10]);
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);
flags = 0;
buf_index = 0;
}
else if (rx_buf[i] == '2')//2
{
dec=0;
def=0;
dek=0;
ind7=0;
ind6=0;
ind5=0;
ind4=0;
ind3=0;
ind2=0;
ind1=0;
ind0=0;
//M2 Общее колличество звуковых файлов
long dec = CharToInt(rx_buf[3]);
dec = dec*16 + CharToInt(rx_buf[4]);
dec = dec*16 + CharToInt(rx_buf[5]);
dec = dec*16 + CharToInt(rx_buf[6]);
dec = dec*16 + CharToInt(rx_buf[7]);
dec = dec*16 + CharToInt(rx_buf[8]);
dec = dec*16 + CharToInt(rx_buf[9]);
dec = dec*16 + CharToInt(rx_buf[10]);
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);
flags = 0;
buf_index = 0;
}
else if (rx_buf[i] == 'T')//T
{
dec=0;
def=0;
dek=0;
ind7=0;
ind6=0;
ind5=0;
ind4=0;
ind3=0;
ind2=0;
ind1=0;
ind0=0;
min=0;
sec=0;
//MT Общее время воспроизведения
long dec = CharToInt(rx_buf[3]);
dec = dec*16 + CharToInt(rx_buf[4]);
dec = dec*16 + CharToInt(rx_buf[5]);
dec = dec*16 + CharToInt(rx_buf[6]);
dec = dec*16 + CharToInt(rx_buf[7]);
dec = dec*16 + CharToInt(rx_buf[8]);
dec = dec*16 + CharToInt(rx_buf[9]);
dec = dec*16 + CharToInt(rx_buf[10]);
CharToDec(dec);
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);
flags = 0;
buf_index = 0;
}
else if (rx_buf[i] == 'F')//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);
flags = 0;
buf_index = 0;
}
/*else if (rx_buf[i] == 'K')//K
{
//MK Время воспроизведения текущего файла
long dec = CharToInt(rx_buf[3]);
dec = dec*16 + CharToInt(rx_buf[4]);
dec = dec*16 + CharToInt(rx_buf[5]);
dec = dec*16 + CharToInt(rx_buf[6]);
dec = dec*16 + CharToInt(rx_buf[7]);
dec = dec*16 + CharToInt(rx_buf[8]);
dec = dec*16 + CharToInt(rx_buf[9]);
dec = dec*16 + CharToInt(rx_buf[10]);
CharToDec(dec);
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);
flags = 0;
buf_index = 0;
}*/
else if (rx_buf[i] == 'P')//P
{
//MP Текущее состояние плеера
if (rx_buf[4] == 0)
{
//Стоп
LED2_R1;
LED2_G0;
}
if (rx_buf[4] == 1)
{
//Воспроизведение
LED2_G1;
LED2_R0;
}
if (rx_buf[4] == 2)
{
//Пауза
LED2_R1;
LED2_G0;
}
}
flags = 0;
buf_index = 0;
}
if (rx_buf[i] == 'Q')//Q
{
i++;
if (rx_buf[i] == 'M')//M
{
//QM Режим работы плеера
if (rx_buf[4] == 1)
{
//Блютус
lcd_pos(0,13);
lcd_str("BLE");
LED1_R1;
LED1_G0;
LED1_B0;
}
if (rx_buf[4] == 2)
{
//USB Flash
lcd_pos(0,13);
lcd_str("USB");
LED1_R0;
LED1_G1;
LED1_B0;
}
if (rx_buf[4] == 3)
{
//SD Card
lcd_pos(0,13);
lcd_str(" SD");
LED1_R0;
LED1_G0;
LED1_B1;
}
}
flags = 0;
buf_index = 0;
}
}
if (BTN_PREV)
{
//Команда AT+CD задаём модулю воспроизведение предыдущего трека
Send_Command("AT+CD\r\n");
_delay_ms(500);
}
if (BTN_NEXT)
{
//Команда AT+CC задаём модулю воспроизведение следующего трека
Send_Command("AT+CC\r\n");
_delay_ms(500);
}
if (BTN_VOL_MIN)
{
//Команда AT+CF задаём модулю уменьшение громкости
Send_Command("AT+CF\r\n");
if (vol>0)
{
vol--;
}
_delay_ms(500);
//Конвертируем значение уровня звука в ASCII
dek = vol%10;
def = vol/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
//Выводим на дисплей уровень звука
lcd_pos(1,11);
lcd_str("VOL");
lcd_pos(1,14);
send_byte(ind1,1);
lcd_pos(1,15);
send_byte(ind0,1);
}
if (BTN_VOL_PLS)
{
//Команда AT+CE задаём модулю увеличение громкости
Send_Command("AT+CE\r\n");
if (vol<30)
{
vol++;
}
_delay_ms(500);
//Конвертируем значение уровня звука в ASCII
dek = vol%10;
def = vol/10;
ind0 = dek+48;
dek = def%10;
def = def/10;
ind1 = dek+48;
//Выводим на дисплей уровень звука
lcd_pos(1,11);
lcd_str("VOL");
lcd_pos(1,14);
send_byte(ind1,1);
lcd_pos(1,15);
send_byte(ind0,1);
}
if (BTN_MODE)
{
if (mode == 3)
{
//Команда AT+CM01 зададаём модулю режим воспроизведения с BLE
Send_Command("AT+CM01\r\n");
_delay_ms(500);
//Устанавливаем значение 1 в переменной mode
mode=1;
}
else if (mode == 2)
{
//Команда AT+CM03 зададаём модулю режим воспроизведения с SD CARD
Send_Command("AT+CM03\r\n");
_delay_ms(500);
//Устанавливаем значение 3 в переменной mode
mode=3;
}
else if (mode == 1)
{
//Команда AT+CM02 зададаём модулю режим воспроизведения с USB
Send_Command("AT+CM02\r\n");
_delay_ms(500);
//Устанавливаем значение 2 в переменной mode
mode=2;
}
}
if (BTN_PLAY_PAUSE)
{
//Команда AT+CB даём модулю команду PLAY/PAUSE
Send_Command("AT+CB\r\n");
_delay_ms(500);
}
if (BTN_REPEAT)
{
if (repeat == 2)
{
repeat=0;
//Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
Send_Command("AT+AC00\r\n");
_delay_ms(500);
LED3_Y0;
LED4_B0;
}
else
{
repeat=2;
//Команда AT+AC02 воспроизведение в цикле
Send_Command("AT+AC02\r\n");
_delay_ms(500);
LED3_Y1;
LED4_B0;
}
}
if (BTN_RAND)
{
if (repeat == 3)
{
repeat=0;
//Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
Send_Command("AT+AC00\r\n");
_delay_ms(500);
LED3_Y0;
LED4_B0;
}
else
{
repeat=3;
//Команда AT+AC03 воспроизведение в случайном порядке
Send_Command("AT+AC03\r\n");
_delay_ms(500);
LED3_Y0;
LED4_B1;
}
}
}
}