?? mp3player2_c.txt
字號:
if (BattVolt < BATT_SHUTDOWN){
sbi(PORTB, SPI_CS); // SPI CS=H
beep(4, BEEP_LOW);
cli(); // 充哈み敦賄
if (RunningTimeH){
write_eeprom(EEPROM_RUNNING_TIME_OLD_M, RunningTimeM);
write_eeprom(EEPROM_RUNNING_TIME_OLD_H, RunningTimeH);
RunningTimeM = 0;
RunningTimeH = 0;
}
shutdown(0); // シャットダウン
}
return BattVolt;
}
//*********************************************************
// シャットダウン
// flag != 0 の眷圭は EEPROM今き哈みを乖わずに排富を磊る
//*********************************************************
void shutdown(char flag){
cli(); // 充哈み敦賄
sbi(PORTB, SPI_CS); // SPI CS=H
cbi(PORTB, MUTE); // 不蘭ミュ〖ト
MP3_command(0, 0x0010); // VS1001k powerdown
if (!flag){
write_eeprom(EEPROM_VOLUME, Volume);
write_eeprom(EEPROM_MUSIC, PlayMusic);
write_eeprom(EEPROM_CLUSTER_L, Cluster);
write_eeprom(EEPROM_CLUSTER_H, Cluster>>8);
write_eeprom(EEPROM_REMAIN1, RemainSec);
write_eeprom(EEPROM_REMAIN2, RemainSec>>8);
write_eeprom(EEPROM_REMAIN3, RemainSec>>16);
write_eeprom(EEPROM_SIZE1, MusicSize);
write_eeprom(EEPROM_SIZE2, MusicSize>>8);
write_eeprom(EEPROM_SIZE3, MusicSize>>16);
write_eeprom(EEPROM_SIZE4, MusicSize>>24);
write_eeprom(EEPROM_RUNNING_TIME_M, RunningTimeM);
write_eeprom(EEPROM_RUNNING_TIME_H, RunningTimeH);
}
for(;;){ // 痰嘎ル〖プ
cbi(PORTC, POWER); // Power down
WDR;
SLEEP;
}
}
//*******************************************************
// EEPROM 今き哈み
//*******************************************************
void write_eeprom(uchar adrs, uchar data){
// 票じ柒推なら今き哈み瓢侯を乖わない
if (read_eeprom(adrs) != data){
while(inp(EECR) & (1<<EEWE));
outp(adrs >> 8, EEARH);
outp(adrs, EEARL);
outp(data, EEDR);
sbi(EECR, EEMWE);
sbi(EECR, EEWE);
}
}
//*******************************************************
// EEPROM 粕み哈み
//*******************************************************
uchar read_eeprom(uchar adrs){
while(inp(EECR) & (1<<EEWE));
outp(adrs >> 8, EEARH);
outp(adrs, EEARL);
sbi(EECR, EERE);
return inp(EEDR);
}
//****************************************
// BEEP
// 苞眶¨ n 棠瓢攙眶
// err != 0 ならエラ〖不(你い不)
// 充り哈み釣材にすることに廟罷
//****************************************
void beep(uchar n, char err){
char i;
cli(); // MP3_init()借妄面に不翁拇淚されたら氦るので充哈み敦賄
MP3_init();
sei(); // 充り哈み釣材
for (; n > 0; --n){
if (err){
MP3_sin(ErrorBeep);
} else {
MP3_sin(BeepData);
}
// 箕粗略ち。この粗が BEEPの不の墓さになる
for (i=0; i < 10*2; i++){ // 腆100ms
SLEEP;
}
MP3_sin(BeepStop);
// BEEPの不粗
for (i=0; i < 3*2; i++){ // 腆30ms
SLEEP;
}
}
MP3_sin(BeepStop); // 箕」賄まらないことがあるのでもう辦攙
}
//****************************************
// EasyMP3 介袋步
//****************************************
void MP3_init(void){
MP3_command(0, 0x0004); // Soft Reset
InitWait();
MP3_command(0, 0x0000);
while(!(inp(PIND)&(1<<MP3_DREQ)));
MP3_command(11, ((uint)Volume << 8)|((uint)Volume)); // 不翁肋年
MP3_command(3, 0x8000 + (uint)((VS1001_CLOCK)/2000)); // Clock
InitWait();
}
//****************************************
// EasyMP3 テスト脫賴腹僑叫蝸
//****************************************
void MP3_sin(PGM_VOID_P data){
uchar i;
uchar bit;
uchar c;
for (i=0; i < 8; i++){
c = (uchar)PRG_RDB(data++);
sbi(PORTD, MP3_BSYNC);
for (bit=0; bit<8; bit++){
if (c & 0x80){
sbi(PORTD, MP3_SI);
} else {
cbi(PORTD, MP3_SI);
}
sbi(PORTD, MP3_DCLK);
c <<= 1;
cbi(PORTD, MP3_DCLK);
cbi(PORTD, MP3_BSYNC);
}
sbi(PORTD, MP3_SI);
}
}
//****************************************
// EasyMP3 コマンド叫蝸
//****************************************
void MP3_command(uchar addr, uint arg){
cbi(PORTD, MP3_CS);
MP3_com_write(2);
MP3_com_write(addr);
MP3_com_write(arg >> 8);
MP3_com_write(arg);
sbi(PORTD, MP3_CS);
}
//****************************************
// EasyMP3 コマンド掐蝸 踏蝗脫
//****************************************
/*
uint MP3_command_read(uchar addr){
char i;
uint r = 0;
cbi(PORTD, MP3_CS);
MP3_com_write(3);
MP3_com_write(addr);
for(i=0; i<16; i++){
sbi(PORTD, MP3_SCLK);
r <<= 1;
if (inp(PINB) & (1<<MP3_SO)){
r |= 1;
}
cbi(PORTD, MP3_SCLK);
}
sbi(PORTD, MP3_CS);
return r;
}
*/
//****************************************
// EasyMP3 コマンド 1byte叫蝸
//****************************************
void MP3_com_write(uchar data){
char i;
for (i=0; i<8; i++){
if (data & 0x80){
sbi(PORTD, MP3_SI);
} else {
cbi(PORTD, MP3_SI);
}
sbi(PORTD, MP3_SCLK);
data <<= 1;
cbi(PORTD, MP3_SCLK);
}
sbi(PORTD, MP3_SI);
}
//****************************************
// MMC/SDカ〖ドから 32byteを粕んで DataBuffに呈羌
//****************************************
void read_32(ulong addr){
uint i, b;
if (SPI_read_open(addr & 0xFFFFFE00)) return;
b = (uint)addr & 0x01FF;
for (i=0; i < 512; i++){
if (i == b){
int n;
for (n = 0; n < 32; n++){
DataBuff[n] = SPI_in();
i++;
}
} else {
SPI_in();
}
}
SPI_read_close();
}
//****************************************
// 介袋步箕のクロックウエイト
//****************************************
void InitWait(void){
uchar i;
for(i=0; i< 255; i++){
NOP;
}
}
//****************************************
// MMC/SDカ〖ド粕み哈みオ〖プン
//****************************************
uchar SPI_read_open(ulong adrs){
uint i;
uchar r;
uchar retry;
// カ〖ドによってはリトライが澀妥のようだ
for (retry = 0; retry < 100; retry++){
cbi(PORTB, SPI_CS); // SPI CS=L
r = SPI_command(17, adrs);
if (r == 0){
for (i = 0; i < 2000; i++){ // ものすごく略つ眷圭がある
r = SPI_in();
if (r == 0xFE){
return 0; // 啪流倡幌マ〖ク
}
}
} else if (r == 0xFE){
return 0; // 賴撅オ〖プン
}
sbi(PORTB, SPI_CS); // SPI CS=H
if (Debug){
WriteHex(r);
WriteCom(' ');
}
// InitWait();
}
return 1; // オ〖プンできなかった
}
//****************************************
// MMC/SDカ〖ド粕み哈みクロ〖ズ
// 1byteのずれがあっても丹にしない
//****************************************
void SPI_read_close(void){
uint i;
SPI_in(); // CRC
SPI_in(); // CRC
// BUSYチェック
for (i = 0; i < 1000; i++){
if (SPI_in() == 0xFF) break;
}
sbi(PORTB, SPI_CS); // SPI CS=H
}
//****************************************
// MMC/SD SPIコマンド叫蝸
//****************************************
uchar SPI_command(uchar com, ulong arg){
uint i;
uchar r;
// BUSYチェック 絲家のカ〖ドでは澀寇みたい
for (i = 0; i < 1000; i++){
r = SPI_in();
if (r == 0xFF) break;
}
if (r != 0xFF) return 1;
SPI_out(com|0x40);
SPI_out(arg >> 24);
SPI_out(arg >> 16);
SPI_out(arg >> 8);
SPI_out(arg);
SPI_out(0x95); // 介袋步コマンドのCRC
for(i = 0; i < 1000; i++){
r = SPI_in();
if (r == 0xFE) break;
if (!(r & 0x80)) break;
}
return r;
}
//****************************************
// MMC/SD SPIデ〖タ叫蝸
//****************************************
void SPI_out(uchar data){
outp(data, SPDR);
while(!(inp(SPSR) & 0x80));
}
//****************************************
// MMC/SD SPIデ〖タ掐蝸
//****************************************
uchar SPI_in(void){
outp(0xFF, SPDR);
while(!(inp(SPSR) & 0x80));
return inp(SPDR);
}
//****************************************
// MMC/SD SPIクロック姜位略ち
// SPDRをアクセスしてない眷圭は
// SPIF=0になって痰嘎ル〖プする眷圭があることに廟罷
//****************************************
void SPI_wait(void){
while(!(inp(SPSR) & 0x80));
}
//****************************************
// 1セクタ〖粕み哈んで山績する
//****************************************
void print_sector(ulong sec){
uchar r;
int i;
sec *= 512;
r = SPI_read_open(sec);
WriteHex(r);
WriteCom('\n');
for (i=0; i<512; i++){
r = SPI_in();
WriteHex(r);
if ((i & 31) == 31){
WriteCom('\n');
} else if (i & 1){
WriteCom(' ');
}
}
SPI_read_close();
}
//****************************************
// シリアル掐蝸。掐蝸があるまで略つ
//****************************************
uchar ReadCom(void){
do {
WDR;
} while(!(inp(UCSRA)&(1<<RXC)));
return inp(UDR);
}
//****************************************
// シリアル叫蝸
//****************************************
void WriteCom(uchar data){
do {
;
} while(!(inp(UCSRA)&(1<<UDRE)));
outp(data, UDR);
}
//****************************************
// 1byteを16渴眶で山績
//****************************************
void WriteHex(uchar data){
uchar c;
c = (data>>4) + '0';
if (c > '9'){ c += 7; }
WriteCom(c);
c = (data & 0x0f) + '0';
if (c > '9'){ c += 7; }
WriteCom(c);
}
//****************************************
// intを 10渴矢機誤恃垂
//****************************************
/*
void ItoStr(uint i, uchar str[]){
char *p;
if (i >= 10000){
p = &str[5];
} else if (i >= 1000){
p = &str[4];
} else if (i >= 100){
p = &str[3];
} else if (i >= 10){
p = &str[2];
} else {
p = &str[1];
}
*p-- = 0;
do {
*p-- = (i % 10) + '0';
i /= 10;
} while(i);
}
*/
//****************************************
// 蓋年矢機誤叫蝸
// 蝗脫毋¨
// char *s;
// s = PSTR("Message OK.\n");
// WriteComMsg(s);
//****************************************
void WriteComMsg(PGM_VOID_P msg){
char i;
uchar c;
i = 0;
while((c = (uchar)PRG_RDB(msg++)) != 0){
WriteCom(c);
i++;
}
}
//****************************************
// バッファ矢機誤叫蝸
//****************************************
void WriteComStr(uchar *msg){
char i;
uchar c;
i = 0;
while((c = (uchar)(*msg++)) != 0){
WriteCom(c);
i++;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -