Код: Выделить всё
#include <mega16.h>
#include <delay.h>
#include <lcd.h>
#include "diskio.h"
#include "pff.h"
#define _XTAL_FREQ 16000000
#asm
.equ __lcd_port = 0x1b
#endasm
unsigned char buff[512]; // буфер аудиоданных
volatile unsigned int n = 0; // счетчик.
interrupt[TIM0_OVF] void Timer0_OVF_8bit (void)
{
OCR1AL = buff[n]; // помещение аудиоданных в шим каналы
OCR1BL = buff[n+1];
n = n + 2; // счетчик крутим по кольцу.
if (n > 511) n = 0;
TCNT0 = 0xd3; // 2000000 / (256 - 211) = 44.444 почти 44.100 :)
}
void main(void)
{
FATFS FS;
WORD bt;
unsigned char p = 0;
DDRD = 0xff; // Выходы ШИМ на выход настр.
PORTD = 0xff;
TCCR1A = 0b10100001; // Нормамльный режим FAST PWM 8bit
TCCR1B = 0b00001001; // Тактирование f/1 т.е 16 Mhz / 256 = 62,5 Khz ШИМ.
OCR1AL = 0x80; // 50% сигнал на ШИМ
OCR1BL = 0x80;
lcd_init(16);
delay_ms(1000);
lcd_gotoxy(0,0);
if (disk_initialize() == 0) lcd_putsf("SD_Init - OK "); else lcd_putsf("SD_Init - Error ");
delay_ms(1000);
lcd_gotoxy(0,0);
if (pf_mount(&FS) == 0) lcd_putsf("FAT_Init - OK "); else lcd_putsf("FAT_Init - Error ");
delay_ms(1000);
lcd_gotoxy(0,0);
if (pf_open("1.wav") == 0) lcd_putsf("1.wav - Open "); else lcd_putsf("File - Error ");
delay_ms(1000);
lcd_gotoxy(0,0);
TCCR0 = 0b00000010; // Тактирование таймера0 f/8 16 Mhz / 8 = 2Mhz.
TIMSK = 0x01; // Вкл. Таймер0
#asm("sei")
lcd_putsf("Play ");
while(1)
{
if (!p && n > 255) // Если первая половина буфера проиграна то...
{
pf_read(&buff[0], 256, &bt); // Считать в первую половину новые данные.
p = 1;
if (bt < 256) break; // Конец файла.
}
if (p && n < 256) // Если вторая половина буфера проиграна то...
{
pf_read(&buff[256], 256, &bt); // Считать в вторую половину новые данные.
p = 0;
if (bt < 256) break; // Конец файла.
}
}
}