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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? mp3.c

?? AVR+CH375+VS1003
?? C
?? 第 1 頁 / 共 3 頁
字號(hào):

//晶振: 11.0592MHz

#cpu "MEGA32"

//*******************************************************
//SD卡配置類
unit SD_card_config
{
	public bit SD_DO_port = @sfr.PORTB.0;
	public bit SD_DO_pin = @sfr.PINB.0;
	public bit SD_DO_ddr = @sfr.DDRB.0;
	
	public bit SCLK_port = @sfr.PORTB.1;
	//bit SCLK_pin = @sfr.PINB.1;
	public bit SCLK_ddr = @sfr.DDRB.1;
	
	public bit SD_DI_port = @sfr.PORTB.2;
	//bit SD_DI_pin = @sfr.PINB.2;
	public bit SD_DI_ddr = @sfr.DDRB.2;
	
	public bit CS_port = @sfr.PORTB.3;
	//bit CS_pin = @sfr.PINB.3;
	public bit CS_ddr = @sfr.DDRB.3;
}
//*******************************************************
//主控制元件
unit main
{
	//主函數(shù)
	void main()
	{
		//發(fā)光二極管初始化
		led.init();
		led.flash( 1 );
		
		//液晶屏初始化
		screen.init();
		screen.clear();
		
		//MP3解碼芯片初始化
		vs1003b.init();
		
		//FAT32文件系統(tǒng)初始化
		FAT32.init();
		if( !FAT32.is_ok ) {
			screen.put_const_string( 0, 0, "SD init failed!" );
			led.flash( 10 );
		}
		screen.put_const_string( 0, 0, "START PLAY..." );
		time.delay_10ms( 100 );
		play();
		screen.clear();
		screen.put_const_string( 0, 0, "PLAY END" );
		
		forever {
			led.flash( 2 );
			time.delay_10ms( 100 );
		}
	}
	//遍歷硬盤,顯示所有文件的名稱和大小,如果是MP3文件就播放
	//MP3文件可以放在任意文件夾中,文件夾的層數(shù)不能超過8層
	void play()
	{
		FAT32.open_root_directory();
		FAT32.select_first_item();
		screen.clear();
		
		forever 
		{
			if( selected_item.is_out ) 
			{
				//screen.put_char( 0, current_level * 10, ' ' );
				bool is_right = FAT32.close_current_directory();
				if( !is_right ) 
				{
					return;
				}
				FAT32.select_next_item();
			}
			if( !selected_item.is_directory && !selected_item.is_file ) {
				FAT32.select_next_item();
				continue;
			}
			//顯示硬盤目錄層次
			//uint8 index = directory_node[current_level].current_sector << 4;
			//index += (uint8)( directory_node[current_level].current_index >> 5 );
			//screen.put_char( 0, current_level * 10, 'A' + index );
			//顯示文件名
			screen.put_ram_string( 1, 0, selected_item.base_name );
			screen.put_char( 1, 8 * 5, '.' );
			screen.put_ram_string( 1, 9 * 5, selected_item.extend_name );
			//顯示文件大小
			screen.put_const_string( 2, 0, "SIZE: " );
			uint8 size = (uint8)( selected_item.length >> 10 );
			screen.put_hex_byte( 2, 40, size );
			screen.put_const_string( 2, 50, "KB" );
			time.delay_10ms( 100 );
			
			//如果是目錄,就進(jìn)入
			if( selected_item.is_directory ) {
				FAT32.open_selected_directory();
				FAT32.select_first_item();
			}
			else {
				//判斷是否為MP3文件
				if( selected_item.extend_name[0] == 'M' &&
				    selected_item.extend_name[1] == 'P' &&
				    selected_item.extend_name[2] == '3' ) {
					FAT32.open_selected_file();
					play_mp3_file();
					FAT32.close_current_file();
				}
				FAT32.select_next_item();
			}
		}
	}
	//顯示txt電子書文件內(nèi)容
	void show_txt_file()
	{
		uint16 index = 0;
		forever {
			screen.clear();
			uint8 line = 0;
			uint8 column = 0;
			do {
				uint8 c = FAT32.buffer[index];
				++index;
				if( FAT32.file_index + index >= selected_item.length ) {
					return;
				}
				if( index == 512 ) {
					FAT32.read_next_sector();
					index = 0;
				}
				if( c == 0x0d ) {
					++line;
					column = 0;
					continue;
				}
				if( c == 0x0a ) {
					continue;
				}
				screen.put_char( line, column, c );
				column += 5;
				if( column >= 16 * 5 ) {
					++line;
					column = 0;
				}
			}
			while( line < 6 );
			time.delay_10ms( 100 );
		}
	}
	//播放MP3文件內(nèi)容
	void play_mp3_file()
	{
		uint16 index = 0;
		forever {
			loop( 16 ) {
				//等待解碼芯片空閑
				while( vs1003b.is_busy() ) {}
				vs1003b.write_buffer_data( FAT32.buffer + index );
				index += 32;
			}
			if( FAT32.file_index + index >= selected_item.length ) {
				return;
			}
			if( index == 512 ) {
				led.set_LED( true );
				FAT32.read_next_sector();
				index = 0;
				led.set_LED( false );
			}
		}
	}
}
//*******************************************************
//FAT32文件系統(tǒng)
unit FAT32
{
	//初始化
	public void init()
	{
		is_ok = false;
		
		//SD卡初始化
		SD_card.init();
		is_ok = SD_card.reset();
		
		//讀取MBR
		is_ok = SD_card.read_block( 0, buffer );
		
		//獲取硬盤總空間
		disk_sector_size.0[uint8] = buffer[0x01ca];
		disk_sector_size.8[uint8] = buffer[0x01cb];
		disk_sector_size.16[uint8] = buffer[0x01cc];
		disk_sector_size.24[uint8] = buffer[0x01cd];
		
		//隱藏扇區(qū)數(shù)
		uint32 hidden_sector_number;
		hidden_sector_number.0[uint8] = buffer[0x01c6];
		hidden_sector_number.8[uint8] = buffer[0x01c7];
		hidden_sector_number.16[uint8] = buffer[0x01c8];
		hidden_sector_number.24[uint8] = buffer[0x01c9];
		
		//讀取DBR
		is_ok = SD_card.read_block( hidden_sector_number, buffer );
		//每扇區(qū)字節(jié)數(shù)
		sector_byte_size.0[uint8] = buffer[0x000b];
		sector_byte_size.8[uint8] = buffer[0x000c];
		//每簇的扇區(qū)數(shù)
		cluster_sector_size = buffer[0x000d];
		//FAT表數(shù)目
		FAT_number = buffer[0x0010];
		//每個(gè)FAT表占據(jù)的扇區(qū)數(shù)
		FAT_sector_size.0[uint8] = buffer[0x0024];
		FAT_sector_size.8[uint8] = buffer[0x0025];
		FAT_sector_size.16[uint8] = buffer[0x0026];
		FAT_sector_size.24[uint8] = buffer[0x0027];
		
		//保留扇區(qū)數(shù)
		uint16 reserved_sector_number;
		reserved_sector_number.0[uint8] = buffer[0x000e];
		reserved_sector_number.8[uint8] = buffer[0x000f];
		
		FAT1_start_sector = hidden_sector_number + reserved_sector_number;
		FAT2_start_sector = FAT1_start_sector + FAT_sector_size;
		cluster_start_sector = FAT2_start_sector + FAT_sector_size;
		cluster_start_sector -= cluster_sector_size * 2;
		
		is_ok = true;
	}
	//打開根目錄
	public void open_root_directory()
	{
		current_level = 0;
		directory_node[current_level].start_cluster = 2;
	}
	//打開選中的目錄
	public void open_selected_directory()
	{
		++current_level;
		directory_node[current_level].start_cluster = selected_item.start_cluster;
	}
	//退出當(dāng)前目錄,成功時(shí)返回true,失敗時(shí)返回false
	public bool close_current_directory()
	{
		if( current_level == 0 ) {
			return false;
		}
		--current_level;
		uint32 sector = get_first_sector_of_cluster(
			directory_node[current_level].current_cluster );
		sector += directory_node[current_level].current_sector;
		is_ok = SD_card.read_block( sector, buffer );
		return true;
	}
	//選中當(dāng)前目錄的第一項(xiàng)
	public void select_first_item()
	{
		uint32 cluster = directory_node[current_level].start_cluster;
		directory_node[current_level].current_cluster = cluster;
		directory_node[current_level].current_sector = 0;
		directory_node[current_level].current_index = 0;
		uint32 sector = get_first_sector_of_cluster( cluster );
		is_ok = SD_card.read_block( sector, buffer );
		get_current_item_info();
	}
	//選中當(dāng)前目錄的下一項(xiàng)
	public void select_next_item()
	{
		uint16 i = directory_node[current_level].current_index;
		i += 0x20;
		if( i == 0x0200 ) {
			i = 0;
			++directory_node[current_level].current_sector;
			
			uint32 sector = get_first_sector_of_cluster(
			directory_node[current_level].current_cluster );
			sector += directory_node[current_level].current_sector;
			if( sector == cluster_sector_size ) {
				//獲取下一簇
				uint32 c_cluster = get_next_cluster(
						directory_node[current_level].current_cluster );
				directory_node[current_level].current_cluster = c_cluster;
				if( c_cluster >= 0x0f_ff_ff_00 ) {
					selected_item.is_out = true;
					return;
				}
				sector = get_first_sector_of_cluster( current_file_cluster );
				directory_node[current_level].current_sector = 0;
			}
			is_ok = SD_card.read_block( sector, buffer );
		}
		directory_node[current_level].current_index = i;
		get_current_item_info();
	}
	
	uint32 current_file_cluster;
	uint32 current_file_sector_offset;
	uint32 current_file_sector;
	public uint32 file_index;
	//打開選中的文件
	public void open_selected_file()
	{
		current_file_cluster = selected_item.start_cluster;
		current_file_sector = get_first_sector_of_cluster( current_file_cluster );
		is_ok = SD_card.read_block( current_file_sector, buffer );
		current_file_sector_offset = 0;
		file_index = 0;
	}
	//讀取下一個(gè)扇區(qū)
	public void read_next_sector()
	{
		file_index += sector_byte_size;
		++current_file_sector_offset;
		if( current_file_sector_offset == cluster_sector_size ) {
			//獲取下一簇
			current_file_cluster = get_next_cluster( current_file_cluster );
			if( current_file_cluster >= 0x0f_ff_ff_00 ) {
				return;
			}
			current_file_sector = get_first_sector_of_cluster( current_file_cluster );
			current_file_sector_offset = 0;
		}
		is_ok = SD_card.read_block( current_file_sector + current_file_sector_offset, buffer );
	}
	//關(guān)閉當(dāng)前的文件
	public void close_current_file()
	{
		uint32 sector = get_first_sector_of_cluster(
			directory_node[current_level].current_cluster );
		sector += directory_node[current_level].current_sector;
		is_ok = SD_card.read_block( sector, buffer );
	}
	//獲取當(dāng)前簇的下一個(gè)簇號(hào)
	uint32 get_next_cluster( uint32 c_cluster )
	{
		uint32 sector = FAT1_start_sector + ( c_cluster >> 7 );
		is_ok = SD_card.read_block( sector, buffer );
		uint16 offset = (uint16)( c_cluster << 2 & 0x0000_01ff );
		c_cluster.0[uint8] = buffer[offset];
		c_cluster.8[uint8] = buffer[offset + 1];
		c_cluster.16[uint8] = buffer[offset + 2];
		c_cluster.24[uint8] = buffer[offset + 3];
		return c_cluster;
	}
	//獲取一個(gè)簇的首扇區(qū)號(hào)
	uint32 get_first_sector_of_cluster( uint32 cluster )
	{
		//這里最好改成 cluster * cluster_sector_size + cluster_start_sector;
		
		return ( cluster << 3 ) + cluster_start_sector;
	}
	//獲取當(dāng)前項(xiàng)的信息
	void get_current_item_info()
	{
		uint16 index = directory_node[current_level].current_index;
		//項(xiàng)目類型
		selected_item.type = buffer[index + 0];
		if( selected_item.type == selected_item.NULL ) {
			selected_item.is_out = true;
		}
		else {
			selected_item.is_out = false;
		}
		if( selected_item.type == selected_item.DELETE ) {
			selected_item.is_delete = true;
		}
		else {
			selected_item.is_delete = false;
		}
		if( selected_item.type == selected_item.SYSTEM_DIR ) {
			selected_item.is_system_dir = true;
		}
		else {
			selected_item.is_system_dir = false;
		}
		//復(fù)制文件基本名
		*uint8 p1 = selected_item.base_name;
		*uint8 p2 = buffer + index;
		loop( 8 ) {
			*p1 = *p2;
			++p1;
			++p2;
		}
		*p1 = 0;
		//復(fù)制文件擴(kuò)展名
		p1 = selected_item.extend_name;
		loop( 3 ) {
			*p1 = *p2;
			++p1;
			++p2;
		}
		*p1 = 0;
		//獲取文件屬性
		selected_item.attribute = buffer[index + 11];
		if( selected_item.attribute == 0x0f ) {
			selected_item.is_long_name = true;
		}
		else {
			selected_item.is_long_name = false;
		}
		selected_item.is_directory = false;
		selected_item.is_file = false;
		if( !selected_item.is_out && !selected_item.is_delete && !selected_item.is_system_dir && !selected_item.is_long_name ) {
			if( selected_item.attribute & selected_item.DIRECTORY != 0 ) {
				selected_item.is_directory = true;
			}
			else {
				selected_item.is_file = true;
			}
		}
		//獲取文件起始簇號(hào)
		selected_item.start_cluster.0[uint8] = buffer[index + 26];
		selected_item.start_cluster.8[uint8] = buffer[index + 27];
		selected_item.start_cluster.16[uint8] = buffer[index + 20];
		selected_item.start_cluster.24[uint8] = buffer[index + 21];
		//獲取文件長(zhǎng)度(單位字節(jié))
		selected_item.length.0[uint8] = buffer[index + 28];
		selected_item.length.8[uint8] = buffer[index + 29];
		selected_item.length.16[uint8] = buffer[index + 30];
		selected_item.length.24[uint8] = buffer[index + 31];
	}
	
	//目錄列表
	struct s_directory_node
	{

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日本一区二区在线观看| 亚洲精品一线二线三线| 激情综合色综合久久| 亚洲日本欧美天堂| 久久久久久黄色| 欧美日韩一区二区电影| 99综合影院在线| 久久国产精品区| 亚洲一级电影视频| 亚洲欧洲精品一区二区精品久久久| 正在播放一区二区| 日本高清不卡在线观看| 国产精品1区2区3区在线观看| 午夜精品福利一区二区蜜股av | 国产日本一区二区| 欧美巨大另类极品videosbest| 成人在线视频一区| 国产在线视频一区二区| 日本不卡不码高清免费观看| 亚洲一区二区美女| 亚洲欧美一区二区三区孕妇| 国产视频一区二区在线观看| 精品国产一区二区三区久久影院 | 蜜桃av噜噜一区| 亚洲国产视频一区二区| 亚洲免费观看高清在线观看| 国产三级三级三级精品8ⅰ区| 欧美成人乱码一区二区三区| 69堂成人精品免费视频| 欧美日韩在线播| 欧美日韩国产小视频在线观看| 色综合久久中文综合久久牛| 91猫先生在线| 色成人在线视频| 色综合久久久网| 日本高清不卡aⅴ免费网站| 91视频你懂的| 色视频一区二区| 在线免费av一区| 色狠狠av一区二区三区| 色爱区综合激月婷婷| 91美女片黄在线| 欧美午夜电影在线播放| 欧美日韩日本视频| 欧美一区二区三区性视频| 91精品国产全国免费观看| 91精品久久久久久久99蜜桃| 亚洲香肠在线观看| 亚洲免费三区一区二区| 伊人开心综合网| 亚洲在线视频一区| 日韩精品免费专区| 蜜桃精品视频在线| 国产精品99久久久久久久女警 | 国产做a爰片久久毛片| 黄色日韩网站视频| 国产成人精品一区二| 北条麻妃一区二区三区| 色偷偷一区二区三区| 欧美视频在线观看一区| 日韩欧美另类在线| 国产日本欧美一区二区| 国产精品每日更新在线播放网址 | 亚洲成av人片一区二区| 日韩vs国产vs欧美| 国产麻豆精品视频| 色欧美乱欧美15图片| 欧美一区二区视频免费观看| 久久久精品蜜桃| 亚洲蜜臀av乱码久久精品| 亚洲五月六月丁香激情| 老司机精品视频导航| 成人免费高清视频| 欧美视频在线播放| 久久精品网站免费观看| 亚洲视频电影在线| 免费观看91视频大全| youjizz久久| 777奇米成人网| 国产精品网曝门| 亚洲国产成人高清精品| 国产自产高清不卡| 在线亚洲高清视频| 精品免费日韩av| 亚洲天堂精品视频| 老司机午夜精品| 色一情一伦一子一伦一区| 精品国产成人系列| 亚洲与欧洲av电影| 成熟亚洲日本毛茸茸凸凹| 欧美亚洲国产一区在线观看网站| 欧美sm美女调教| 夜夜嗨av一区二区三区四季av| 国内精品视频666| 欧美性xxxxxx少妇| 国产女同性恋一区二区| 亚洲bt欧美bt精品| a在线播放不卡| 欧美videossexotv100| 一区二区三区四区高清精品免费观看| 国内精品免费**视频| 欧美日韩精品二区第二页| 国产精品国产a| 国内精品嫩模私拍在线| 欧美高清激情brazzers| 亚洲欧洲性图库| 国产精品18久久久久久久久 | 色国产综合视频| 欧美国产精品一区| 狠狠色丁香久久婷婷综合_中 | 欧美性感一区二区三区| 亚洲国产高清在线观看视频| 韩国精品主播一区二区在线观看 | 欧美日韩在线播| 国产精品久久久久久久久免费樱桃| 麻豆国产一区二区| 精品视频色一区| 一区二区三区四区不卡在线| 成人av在线一区二区| 久久久久久97三级| 美女在线观看视频一区二区| 欧美制服丝袜第一页| 亚洲人成网站影音先锋播放| 丰满白嫩尤物一区二区| 国产午夜三级一区二区三| 久久国产人妖系列| 日韩欧美国产小视频| 日韩高清电影一区| 91精品国产欧美一区二区成人| 亚洲成a人v欧美综合天堂| 欧美日韩在线精品一区二区三区激情 | 国产日韩欧美精品电影三级在线| 另类小说一区二区三区| 日韩欧美一二三| 久久99蜜桃精品| 久久久777精品电影网影网| 韩国中文字幕2020精品| 精品国产一区二区三区久久影院 | 韩国毛片一区二区三区| 欧美精品一区男女天堂| 国产麻豆9l精品三级站| 久久久久成人黄色影片| 成人综合婷婷国产精品久久免费| 欧美国产欧美综合| av中文一区二区三区| 一区二区三区在线影院| 欧美性大战久久久久久久 | 激情欧美一区二区三区在线观看| 精品av久久707| 国产高清久久久| 国产精品网站在线| 色94色欧美sute亚洲线路二 | 国产不卡视频一区| 国产精品视频观看| 99久久精品情趣| 亚洲影院在线观看| 日韩午夜激情av| 国产精品一区二区你懂的| 国产精品天美传媒| 91成人网在线| 日韩精品久久久久久| 欧美精品一区二区三区久久久| 国产91精品精华液一区二区三区| 亚洲欧洲日韩在线| 欧美精品v国产精品v日韩精品| 老司机午夜精品| 中文字幕在线一区免费| 欧美日韩不卡一区二区| 韩国三级在线一区| 亚洲欧洲国产专区| 在线电影欧美成精品| 国产一区二区在线看| 亚洲欧美乱综合| 91精品国产麻豆国产自产在线| 国产一区亚洲一区| 亚洲女爱视频在线| 日韩欧美www| 91麻豆国产精品久久| 蜜桃精品视频在线观看| 国产精品家庭影院| 91精品国产高清一区二区三区| 国产夫妻精品视频| 亚洲第一二三四区| 欧美韩国一区二区| 欧美日韩一区二区三区高清 | 韩国欧美一区二区| 亚洲精品videosex极品| 欧美大黄免费观看| 在线精品观看国产| 国产精品综合av一区二区国产馆| 亚洲一级二级三级在线免费观看| 精品国产青草久久久久福利| 色综合久久久久综合99| 国内外成人在线| 亚洲1区2区3区视频| 亚洲欧美一区二区视频| 日韩一级二级三级| 欧美羞羞免费网站| 成人激情小说乱人伦| 美女脱光内衣内裤视频久久网站 |