亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mp3player2_c.txt

?? 在高檔AVR單片機ATmega8上實現MP3播放功能
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
				if (--PlayMusic == 0){
					PlayMusic = MusicCount;
				}
			}
			Cluster = 0;	// 妒の呵介から
		} else {	// FF or その妒の浩欄姜位
			PlayMusic++;	// 肌の妒
			Cluster = 0;
		}
		if (BattVolt < BATT_START){
			beep(1, BEEP_LOW);	// 彈瓢排暗笆布になったら妒粗に焚桂不
		}
	}
}


//*********************************************************
//	スイッチが澄悸に庶されるまで略つ
//*********************************************************
void switch_wait(void){

	sei();
	for (;;) {
		WDR;
		SLEEP;
		SLEEP;
		if (!(SwitchFlag & ((1<<SW_FF)|(1<<SW_REW)|(1<<SW_STOP)))){
			SLEEP;
			SLEEP;
			if (!(SwitchFlag & ((1<<SW_FF)|(1<<SW_REW)|(1<<SW_STOP)))){
				break;
			}
		}
	}
}


//*********************************************************
//	MMC/SDカ〖ドの介袋步
//*********************************************************
uchar InitCard(void){
	uchar	c;

	outp(0x52, SPCR);	// SPIマスタ, CPOL=0, クロック 8MHz/64=125kHz
	sbi(PORTB, SPI_CS);	// CS=H

	// MMC/SD SPIモ〖ド敗乖漣のクロック流慨
	for (c=0; c < 10; c++){
		SPI_in();
	}

	// SPIモ〖ド敗乖コマンド
	cbi(PORTB, SPI_CS);		// CS=L
	c = SPI_command(0, 0);
	while ((c != 1)&&(c != 0xFF)){
		SLEEP;
		c = SPI_command(0, 0);
	}
	while (c == 1){
		c = SPI_command(1, 0);
	}
	sbi(PORTB, SPI_CS);	// CS=H

	outp(0x50, SPCR);	// SPIマスタ, CPOL=0, クロック 8MHz/4=2MHz
	sbi(SPSR, SPI2X);	// クロックを2擒 4MHz

	return c;
}


//*********************************************************
//	VFAT攫鼠粕み艱り
//*********************************************************
uchar read_VFAT_info(void){
	ulong	sec;
	uint	bpb;
	uint	n;

	// VFAT攫鼠粕み艱り。セクタ墓は 512bytesで瘋め慮ちしている
	read_32(446);										// MBR粕み哈み
	bpb = (uint)DataBuff[8] + ((uint)DataBuff[9]<<8);	// BPB黎片セクタ
	read_32((ulong)bpb * 512);							// 粕み哈み
	n = (uint)DataBuff[11] + ((uint)DataBuff[12] << 8);	// セクタ墓
	if (n != 512){
		return 2;	// 1セクタが 512bytesでない
	}
	SectorsPerCluster = DataBuff[13];		// クラスタあたりのセクタ眶
	FATstart = bpb + (uint)DataBuff[14]
		+ ((uint)DataBuff[15] << 8);		// 徒腆セクタ眶
	RootDirEntriesCount = (uint)DataBuff[17]
		+ ((uint)DataBuff[18] << 8);		// ル〖トディレクトリエントリ眶
	n = (uint)DataBuff[22] + ((uint)DataBuff[23] << 8);	// FATのセクタ眶
	if (n == 0){
		return 1;	// FAT32らしい
	}
	DIRstart = (uint)FATstart + (uint)DataBuff[16] * n;	// FATの眶∵セクタ眶
	n = RootDirEntriesCount / 16;	// ル〖トディレクトリに澀妥なセクタ眶
	if (RootDirEntriesCount % 16){
		n++;	// 前のため、途りが叫たら磊り懼げ。奶撅は稍妥だと蛔うが
	}
	DataStart = (ulong)DIRstart + (ulong)n;		// デ〖タ呈羌撾拌

	sec = (ulong)DataBuff[19] + ((ulong)DataBuff[20] << 8);	// 另セクタ眶
	if (sec == 0){
		read_32((ulong)bpb * 512 + 32);		// 粕み哈み
		sec = (ulong)DataBuff[0] + ((ulong)DataBuff[1] << 8)
			+ ((ulong)DataBuff[2] << 16) + ((ulong)DataBuff[3] << 24);
	}
	sec -= FATstart;
	sec /= SectorsPerCluster;
	if (sec >= 0x1000){
		FATtype = 1;	// FAT16
	} else {
		FATtype = 0;	// FAT12
	}

	return 0;
}


//*********************************************************
//	MP3ファイルを淋す
//	苞眶¨
//		num	この眶だけ斧つけたら提る
//		この眶笆布であってもディレクトリエントリを鏈て拇べ姜わったら提る
//	提り猛¨
//		斧つけた眶
//		DataBuff[0×31]	呵稿に斧つかった MP3のディレクトリ攫鼠
//*********************************************************
uint search_MP3(uint num){
	uint	ent;
	ulong	sec;
	uchar	i, j;
	uint	n;

	n = 0;
	sec = (ulong)DIRstart * 512;
	for (ent = 0; ent < RootDirEntriesCount; ){
		if (SPI_read_open(sec))	return n;
		for (i = 0; i < 16; i++){
			for (j = 0; j < 32; j++){
				DataBuff[j] = SPI_in();
			}
			if (DataBuff[0] == 0)	break;	// 踏蝗脫撾拌浮叫
			if (((DataBuff[26] != 0)||(DataBuff[27] != 0))&&	// クラスタ戎規
				(DataBuff[0] != 0xE5)&&						// 猴近マ〖ク
				(!(DataBuff[11] & 0x18))&&					// 奶撅ファイル
				(DataBuff[8]=='M')&&(DataBuff[9]=='P')&&(DataBuff[10]=='3')){
															// 橙磨灰MP3
				n++;
				if (--num == 0)	break;
			}
			ent++;
		}
		for (++i; i < 16; i++){
			for (j = 0; j < 32; j++){
				SPI_in();	// セクタ尸の荒りを粕み嘉て
			}
		}
		SPI_read_close();
		if (DataBuff[0] == 0)	break;	// 踏蝗脫撾拌浮叫
		if (num == 0)	break;
		sec += 512;	// 肌のセクタ
	}
	return n;
}


//****************************************
//	MP3ファイルを浩欄
//	fn:		妒戎規
//	clst:	遍琳倡幌クラスタ。==0 の眷圭は呵介から
//	remainsec: 浩欄デ〖タ荒りセクタ眶
//****************************************
char play_music(uint fn, uint clst, long remainsec){
	ulong	sec;
	uint	remain;
	uint	cn;
	uint	i;

	if (fn != search_MP3(fn)){
		return -1;	// 妒が痰い
	}

	MusicSize = (ulong)DataBuff[28] + ((ulong)DataBuff[29]<<8)
			  + ((ulong)DataBuff[30]<<16) + ((ulong)DataBuff[31]<<24);

	if (clst){
		// 龐面から浩欄
		Cluster = clst;
		RemainSec = remainsec;
		remain = MusicSize - (remainsec * 512);
	} else {
		// 呵介から浩欄
		Cluster = (uint)DataBuff[26] + ((uint)DataBuff[27] << 8);
		RemainSec = MusicSize / 512;
		remain = MusicSize % 512;
	}

	if ((Cluster == 0xFFFF)||(Cluster < 2)){
		return -2;	// クラスタ佰撅
	}

	// 肌のクラスタを拇べておく
	NextCluster = next_cluster(Cluster, 0, 0);

	StopSw = 0;
	RewSw = 0;
	FfSw = 0;

	cn = SectorsPerCluster;
	sec = (((ulong)Cluster - 2) * (ulong)SectorsPerCluster + DataStart)	* 512;

	MP3_init();
	Timer = 100;	// READYタイマ〖セット

	while (RemainSec > 0){
		uchar	data;
		char	bit;

		if (SPI_read_open(sec))	return -2;
		cli();				// 充哈み敦賄
		SPI_out(0xFF);		// 1byte謄のクロック流叫 & WAIT

		for (i = 0; i < 512; i++){

			while (!(inp(PIND)&(1<<MP3_DREQ))){	// VS1001 BUSYチェック

				WDR;			// ウォッチドッグタイマ〖リセット
				Timer = 100;	// READYタイマセット

				if (NextCluster == 0){
					// 肌のクラスタを拇べる
					NextCluster = next_cluster(Cluster, sec, i);
				} else {
					sei();	// 充り哈み釣材
					SLEEP;
					cli();	// 充哈み敦賄
				}
			}

			data = inp(SPDR);
			outp(0xFF, SPDR);	// SD/MMCカ〖ドへ肌のデ〖タリクエスト

			if (data & 0x80){
				sbi(PORTD, MP3_SI);
			} else {
				cbi(PORTD, MP3_SI);
			}
			sbi(PORTD, MP3_BSYNC);	// BSYNC = H
			sbi(PORTD, MP3_DCLK);
			data <<= 1;
			cbi(PORTD, MP3_DCLK);
			cbi(PORTD, MP3_BSYNC);	// BSYNC = L

			for (bit = 0; bit < 7; bit++){
				if (data & 0x80){
					sbi(PORTD, MP3_SI);
				} else {
					cbi(PORTD, MP3_SI);
				}
				sbi(PORTD, MP3_DCLK);
				data <<= 1;
				cbi(PORTD, MP3_DCLK);
			}
		}
		sei();	// 充り哈み釣材
		SPI_read_close();

		--RemainSec;
		
		if (--cn > 0){
			sec += 512;	// 肌のセクタ

			if (Debug && (cn == 1)){
				uint n;
				n = BattVolt;
				WriteHex(n>>8);
				WriteHex(n);
				WriteCom(' ');
				WriteHex(Cluster>>8);
				WriteHex(Cluster);
				WriteCom('\n');
			}
		} else {
			// 肌のクラスタ
			if (NextCluster == 0){
				Cluster = next_cluster(Cluster, 0, 0);
			} else {
				Cluster = NextCluster;
				NextCluster = 0;
			}

			if ((Cluster == 0xFFFF)||(Cluster < 2)){
				// 佰撅クラスタが浮叫されたので動擴姜位
				remain = 0;
				break;
			}

			sec = (((ulong)Cluster - 2) * (ulong)SectorsPerCluster
				   + DataStart) * 512;
			cn = SectorsPerCluster;

		}

		check_batt();	// バッテリ〖チェック

		if (Timer == 0){	// READYタイムアウトしたら
			if (NoBusyRetry > 0){	// リトライしてもダメなら
				beep(1, BEEP_LOW);	// 你不ビ〖プ1攙
				NoBusyRetry = 0;
				FfSw = 0;
				return 2;		// FF胺いで姜位 ⅹ 肌の妒へ
			} else {
				NoBusyRetry = 1;
				RewSw = 0;
				return 3;		// REW胺いで姜位 ⅹ その妒の呵介からリトライ
			}
		}

		// STOP, FFボタンチェック
		if (StopSw > 2){
			beep(1, BEEP_HIGH);
			NoBusyRetry = 0;
			return 1;
		} else if (FfSw > 2){
			beep(1, BEEP_HIGH);
			NoBusyRetry = 0;
			return 2;
		} else if (RewSw > 2){
			beep(1, BEEP_HIGH);
			NoBusyRetry = 0;
			return 3;
		}
	}

	NoBusyRetry = 0;

	// 1セクタ(512bytes)踏塔の尸を浩欄
	if ((remain > 0)&&(remain < 512)){
		uchar	data;
		char	bit;

		if (SPI_read_open(sec))	return -2;
		cli();				// 充哈み敦賄
		SPI_out(0xFF);		// 1byte謄のクロック流叫□WAIT

		for (i = 0; i < 512; i++){
			data = inp(SPDR);
			outp(0xFF, SPDR);
			if (remain-- > 0){
				while (!(inp(PIND)&(1<<MP3_DREQ))){
					// VS1001 BUSY
					WDR;		// ウォッチドッグタイマクリア
					sei();			// 充り哈み釣材
					SLEEP;
					cli();			// 充哈み敦賄
				}
				sbi(PORTD, MP3_BSYNC);	// BSYNC = H
				for (bit=0; bit<8; bit++){
					if (data & 0x80){
						sbi(PORTD, MP3_SI);
					} else {
						cbi(PORTD, MP3_SI);
					}
					sbi(PORTD, MP3_DCLK);
					data <<= 1;
					cbi(PORTD, MP3_DCLK);
					cbi(PORTD, MP3_BSYNC);	// BSYNC = L
				}
			}
		}

		sei();	// 充り哈み釣材
		SPI_read_close();
	}

	return 0;
}


//****************************************
//	肌のクラスタを滇める
//****************************************
uint next_cluster(uint c, ulong sec, uint remain){
	ulong	addr;
	uint	data;
	ulong	fatadr;
	uint	i;

	if (FATtype == 0){
		// FAT12
		addr = (ulong)FATstart * 512 + (ulong)c + (c >> 1);
		if ((addr & 511) == 511){
			if (sec != 0){
				// 粕み哈みオ〖プン面なら粕み嘉て
				for (i = remain; i < 512; i++)	SPI_in();
				SPI_read_close();

				data = read_word(addr) & 0x00FF;
				data |= ((read_word(addr+1) & 0x00FF) << 8);

				// 浩刨オ〖プン、笆漣の疤彌まで粕み嘉て
				if (SPI_read_open(sec))	return 0;
				SPI_in();
				for (i = 0; i < remain; i++)	SPI_in();
			} else {
				// セクタをまたぐ
				data = read_word(addr) & 0x00FF;
				data |= ((read_word(addr+1) & 0x00FF) << 8);
			}
		} else {
			fatadr = addr & 0xFFFFFE00;
			if ((sec != 0)&&(fatadr != FatCacheAddr)){
				// 粕み哈みオ〖プン面で FATバッファ痰跟なら粕み嘉て
				for (i = remain; i < 512; i++)	SPI_in();
				SPI_read_close();

				data = read_word(addr);

				// 浩刨オ〖プン、笆漣の疤彌まで粕み嘉て
				if (SPI_read_open(sec))	return 0xFFFF;
				SPI_in();
				for (i = 0; i < remain; i++)	SPI_in();
			} else {
				data = read_word(addr);
			}
		}
		if (c & 1){
			c = data >> 4;
		} else {
			c = data & 0x0fff;
		}
		if (c >= 0x0ff8)	c = 0xFFFF;
	} else {
		// FAT16
		addr = (ulong)FATstart * 512 + (ulong)c * 2;
		fatadr = addr & 0xFFFFFE00;
		if ((sec != 0)&&(fatadr != FatCacheAddr)){
			// 粕み哈みオ〖プン面で FATバッファ痰跟なら粕み嘉て
			for (i = remain; i < 512; i++)	SPI_in();
			SPI_read_close();

			c = read_word(addr);

			// 浩刨オ〖プン、笆漣の疤彌まで粕み嘉て
			if (SPI_read_open(sec))	return 0;
			SPI_in();
			for (i = 0; i < remain; i++)	SPI_in();
		} else {
			c = read_word(addr);
		}
		if (c >= 0xFFF8)	c = 0xFFFF;
	}

	return c;
}


//****************************************
//	MMC/SDカ〖ドから 2byteを粕む
//	セクタ董腸のアクセスはできないので
//	懼疤供鎳で雇胃すること
//****************************************
uint read_word(ulong addr){
	uint	w;
	uint	b;
	uchar	*p;

	b = addr & 511;
	addr &= 0xFFFFFE00;

	if (addr != FatCacheAddr){
		if (SPI_read_open(addr))	return 0;
		for (p = FatCache; p < (FatCache + 512); ){
			*p++ = SPI_in();
		}
		SPI_read_close();
		FatCacheAddr = addr;
	}

	w = (uint)FatCache[b++];
	w |= ((uint)FatCache[b] << 8);

	return w;
}


//*******************************************************
//	バッテリ〖排暗を拇べ、你すぎればシャットダウンする
//*******************************************************
int check_batt(void){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人午夜av在线| 国产麻豆成人精品| 亚洲天天做日日做天天谢日日欢| 精品免费视频.| 精品国免费一区二区三区| 在线综合亚洲欧美在线视频| 欧美日韩在线播放三区| 欧美日韩中文精品| 欧美日本一区二区| 欧美久久一二区| 欧美精品aⅴ在线视频| 欧美久久久影院| 91精品婷婷国产综合久久 | 伊人开心综合网| 国产精品乱人伦一区二区| 国产精品无遮挡| 亚洲一区二区三区四区五区中文 | 欧美日韩国产高清一区| 69p69国产精品| 久久久久久久性| 亚洲欧美自拍偷拍色图| 亚洲一区二区视频| 麻豆国产一区二区| 成人av网在线| 9191国产精品| 欧美国产精品中文字幕| 亚洲一区二区三区免费视频| 日本在线不卡视频| 不卡的电影网站| 欧美日韩高清一区二区三区| 精品第一国产综合精品aⅴ| 国产精品视频在线看| 一区二区三区成人| 国产酒店精品激情| 欧美性极品少妇| 久久久亚洲国产美女国产盗摄| 中文字幕中文字幕在线一区 | 欧美成人官网二区| 亚洲免费电影在线| 精品一区二区三区影院在线午夜| 成人激情综合网站| 欧美一区午夜精品| 亚洲欧美偷拍另类a∨色屁股| 麻豆freexxxx性91精品| 色噜噜狠狠成人中文综合| 亚洲精品在线观| 轻轻草成人在线| 一道本成人在线| 国产精品丝袜91| 激情偷乱视频一区二区三区| 在线观看国产精品网站| 中文一区在线播放| 国产乱码精品一区二区三区忘忧草 | 天天色综合天天| 97久久超碰国产精品| 日韩三级精品电影久久久| 亚洲日本乱码在线观看| 国产在线一区观看| 欧美日韩日日骚| 亚洲自拍与偷拍| 91啦中文在线观看| 国产精品嫩草99a| 国产成人精品亚洲午夜麻豆| 亚洲精品一区二区三区99| 亚洲1区2区3区4区| 日本韩国一区二区| 亚洲视频电影在线| 97超碰欧美中文字幕| 中文字幕av在线一区二区三区| 久久99久国产精品黄毛片色诱| 欧美日韩高清在线播放| 亚洲第一会所有码转帖| 欧美综合在线视频| 一区二区成人在线观看| 欧美性猛交xxxx黑人交| 亚洲综合999| 6080日韩午夜伦伦午夜伦| 日韩av中文字幕一区二区三区| 欧美日韩在线综合| 丝袜诱惑制服诱惑色一区在线观看 | 亚洲综合久久久| 精品视频色一区| 青娱乐精品在线视频| www久久久久| 成人激情免费电影网址| 亚洲欧美另类图片小说| 欧美性生活久久| 日本视频一区二区三区| 91精品国产91热久久久做人人| 蜜臀久久99精品久久久久久9| 欧美一区二区黄色| 粉嫩一区二区三区在线看| 亚洲日本一区二区| 91精品在线免费观看| 狠狠久久亚洲欧美| 中文字幕日韩精品一区| 91久久精品一区二区| 免费看欧美女人艹b| 久久久99精品久久| 欧美亚洲综合网| 久久精品噜噜噜成人88aⅴ| 久久精品欧美日韩精品| 欧美中文字幕一区二区三区亚洲| 日本不卡免费在线视频| 国产精品久久网站| 欧美一区二区女人| jizzjizzjizz欧美| 麻豆一区二区在线| 中文字幕亚洲成人| 精品捆绑美女sm三区| 在线观看视频一区二区| 狠狠色丁香婷婷综合| 亚洲精品视频自拍| 久久久久国色av免费看影院| 欧美日韩一区二区不卡| 成人一区二区在线观看| 青青草原综合久久大伊人精品 | 国产成人综合在线| 亚洲成人在线免费| 国产精品久久久久久久久动漫| 欧美日韩成人一区二区| 成人av电影在线观看| 久久精品免费观看| 亚洲va欧美va人人爽| 自拍偷拍亚洲综合| 久久久久国产精品麻豆ai换脸 | 欧美色电影在线| 成人av电影在线播放| 精品一区二区三区久久久| 亚洲一区二区高清| 国产精品麻豆一区二区| 久久只精品国产| 欧美福利电影网| 91国产视频在线观看| 99久久精品免费看国产| 国产精品亚洲综合一区在线观看| 日韩精品高清不卡| 亚洲专区一二三| 亚洲综合丝袜美腿| 亚洲另类中文字| 亚洲免费在线观看| 国产精品女主播av| 国产精品嫩草影院av蜜臀| 久久久久久电影| 国产情人综合久久777777| 久久久精品国产免费观看同学| 欧美一二三区在线观看| 日韩欧美中文一区| 欧美电影免费提供在线观看| 日韩亚洲欧美中文三级| 91精品婷婷国产综合久久竹菊| 欧美剧情电影在线观看完整版免费励志电影 | jizzjizzjizz欧美| 本田岬高潮一区二区三区| 丁香网亚洲国际| 99re8在线精品视频免费播放| 91原创在线视频| 色视频一区二区| 欧美高清你懂得| 欧美成人bangbros| 国产精品私房写真福利视频| 亚洲欧洲精品成人久久奇米网| 国产精品福利一区| 亚洲男人天堂一区| 亚洲 欧美综合在线网络| 天天影视色香欲综合网老头| 久久99精品国产麻豆不卡| 国产精品77777竹菊影视小说| 国产69精品久久久久毛片| 91小视频在线免费看| 欧美酷刑日本凌虐凌虐| 久久色中文字幕| 亚洲久草在线视频| 日韩成人精品在线观看| 国产精品99久久久| 色国产精品一区在线观看| 日韩欧美一二区| 国产精品水嫩水嫩| 天堂影院一区二区| 丰满放荡岳乱妇91ww| 欧美色精品天天在线观看视频| 精品免费国产一区二区三区四区| 欧美激情一区二区三区不卡| ...xxx性欧美| 久久成人精品无人区| 99久久精品免费| 日韩欧美在线影院| 一区二区成人在线| 韩国成人福利片在线播放| 色婷婷综合久久久久中文一区二区| 91精品国产色综合久久不卡电影| 欧美高清在线一区| 奇米综合一区二区三区精品视频 | 一区二区三区加勒比av| 麻豆一区二区三| 色婷婷国产精品综合在线观看| 欧美一区二区三区喷汁尤物| 亚洲婷婷综合色高清在线| 久久精品国产一区二区三| 一本一道久久a久久精品综合蜜臀|