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

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

?? mp3.c

?? AVR+CH375+VS1003
?? C
?? 第 1 頁 / 共 3 頁
字號:

//晶振: 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
{
	//主函數
	void main()
	{
		//發光二極管初始化
		led.init();
		led.flash( 1 );
		
		//液晶屏初始化
		screen.init();
		screen.clear();
		
		//MP3解碼芯片初始化
		vs1003b.init();
		
		//FAT32文件系統初始化
		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文件可以放在任意文件夾中,文件夾的層數不能超過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 );
			
			//如果是目錄,就進入
			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電子書文件內容
	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文件內容
	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文件系統
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];
		
		//隱藏扇區數
		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 );
		//每扇區字節數
		sector_byte_size.0[uint8] = buffer[0x000b];
		sector_byte_size.8[uint8] = buffer[0x000c];
		//每簇的扇區數
		cluster_sector_size = buffer[0x000d];
		//FAT表數目
		FAT_number = buffer[0x0010];
		//每個FAT表占據的扇區數
		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];
		
		//保留扇區數
		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;
	}
	//退出當前目錄,成功時返回true,失敗時返回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;
	}
	//選中當前目錄的第一項
	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();
	}
	//選中當前目錄的下一項
	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;
	}
	//讀取下一個扇區
	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 );
	}
	//關閉當前的文件
	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 );
	}
	//獲取當前簇的下一個簇號
	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;
	}
	//獲取一個簇的首扇區號
	uint32 get_first_sector_of_cluster( uint32 cluster )
	{
		//這里最好改成 cluster * cluster_sector_size + cluster_start_sector;
		
		return ( cluster << 3 ) + cluster_start_sector;
	}
	//獲取當前項的信息
	void get_current_item_info()
	{
		uint16 index = directory_node[current_level].current_index;
		//項目類型
		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;
		}
		//復制文件基本名
		*uint8 p1 = selected_item.base_name;
		*uint8 p2 = buffer + index;
		loop( 8 ) {
			*p1 = *p2;
			++p1;
			++p2;
		}
		*p1 = 0;
		//復制文件擴展名
		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;
			}
		}
		//獲取文件起始簇號
		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];
		//獲取文件長度(單位字節)
		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
	{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品久久久久一区二区国产| 国产视频一区二区在线| 欧美一区二区三区系列电影| 日韩久久精品一区| 国产精品久久久久久福利一牛影视 | 色婷婷激情久久| 欧美美女一区二区在线观看| 日韩欧美高清一区| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 国产成人精品三级麻豆| 99re热视频精品| 欧美日韩激情在线| 国产亚洲欧美一区在线观看| 亚洲色图20p| 蜜桃精品在线观看| 懂色av中文一区二区三区| 在线视频国内自拍亚洲视频| 日韩欧美成人午夜| 亚洲欧洲性图库| 美女精品自拍一二三四| 波多野结衣精品在线| 欧美精品乱码久久久久久| 国产午夜精品美女毛片视频| 一区二区三区在线观看动漫| 久久疯狂做爰流白浆xx| 色综合亚洲欧洲| 久久综合色鬼综合色| 亚洲精品国产高清久久伦理二区| 美腿丝袜亚洲一区| 色婷婷香蕉在线一区二区| 久久综合999| 亚洲超丰满肉感bbw| 成人一区二区在线观看| 欧美一区永久视频免费观看| 中文字幕中文字幕一区| 久草在线在线精品观看| 欧美日韩情趣电影| 国产精品久久久久久妇女6080| 久久99热狠狠色一区二区| 欧美私人免费视频| 国产精品久久久久婷婷二区次| 青青草国产精品亚洲专区无| 欧美亚州韩日在线看免费版国语版| 国产欧美日韩激情| 久久精品国产精品亚洲红杏| 蜜桃av一区二区| 韩国av一区二区三区四区| 在线免费观看不卡av| 国产精品污www在线观看| 久久国产剧场电影| 欧美日韩成人综合天天影院| 亚洲欧美偷拍另类a∨色屁股| 国产一区二区三区四区在线观看| 欧美日韩电影在线播放| 亚洲三级免费观看| 成人v精品蜜桃久久一区| 久久―日本道色综合久久| 天天亚洲美女在线视频| 在线免费精品视频| 日韩理论在线观看| 成人一道本在线| 欧美激情综合在线| 国产一区二区精品久久99| 日韩一区二区视频| 日韩在线一区二区三区| 欧美日韩视频一区二区| 亚洲综合丁香婷婷六月香| 99国产精品视频免费观看| 国产精品视频一二三区| 国产河南妇女毛片精品久久久| 日韩欧美第一区| 经典三级一区二区| 精品欧美一区二区三区精品久久 | 欧美三级中文字| 亚洲午夜一区二区三区| 91无套直看片红桃| 成人免费在线视频| 91美女在线看| 亚洲黄色性网站| 欧美伊人精品成人久久综合97| 一区二区三区波多野结衣在线观看| 91在线观看地址| 亚洲精品国产a| 欧美日韩国产一区| 首页国产丝袜综合| 日韩精品一区二区在线观看| 精品亚洲欧美一区| 国产无人区一区二区三区| 成人av小说网| 亚洲免费av高清| 欧美日韩在线不卡| 日本vs亚洲vs韩国一区三区 | 秋霞电影一区二区| 日韩欧美一级片| 国产精品综合一区二区三区| 中文字幕av资源一区| 色域天天综合网| 婷婷久久综合九色国产成人| 欧美一区二区福利视频| 国产一区二区在线电影| 欧美国产乱子伦 | 亚洲高清久久久| 日韩一级大片在线| 国精产品一区一区三区mba桃花| 国产校园另类小说区| 99精品久久99久久久久| 亚洲综合一区在线| 欧美一区二区三区不卡| 天天综合天天综合色| 国产精品白丝在线| 欧美在线短视频| 男人的天堂亚洲一区| 久久久电影一区二区三区| 91美女在线视频| 男女男精品视频网| 欧美激情一区二区三区全黄| 91丨国产丨九色丨pron| 日韩精品电影在线观看| 国产人成亚洲第一网站在线播放 | 自拍偷拍亚洲综合| 欧美日韩一区 二区 三区 久久精品| 蜜臀av国产精品久久久久| 国产精品美日韩| 欧美日韩1234| 国产91露脸合集magnet| 亚洲国产成人91porn| 久久久久国产精品厨房| 欧美亚洲国产怡红院影院| 久久99精品久久久久婷婷| 亚洲色图视频免费播放| 日韩一卡二卡三卡四卡| 99久久婷婷国产综合精品电影| 午夜视频在线观看一区二区 | 丰满亚洲少妇av| 天天综合天天综合色| 欧美激情一二三区| 欧美一区二区三区视频| 丁香桃色午夜亚洲一区二区三区| 亚洲二区在线视频| 日本一区二区高清| 91精品国产综合久久久久久久久久| 高清久久久久久| 日韩av中文字幕一区二区| 国产精品久久久久久久岛一牛影视| 欧美一区二区成人6969| 色偷偷一区二区三区| 国产久卡久卡久卡久卡视频精品| 午夜视频一区二区| 国产精品色在线| 欧美xfplay| 欧美日韩一区中文字幕| 不卡av在线免费观看| 久久99精品久久只有精品| 亚洲午夜精品一区二区三区他趣| 中国色在线观看另类| 日韩美一区二区三区| 91久久精品日日躁夜夜躁欧美| 国产成人综合亚洲91猫咪| 日韩激情一二三区| 亚洲专区一二三| 国产精品污网站| 国产日产精品一区| 精品国产三级电影在线观看| 欧美剧情电影在线观看完整版免费励志电影 | 欧美精品高清视频| 色综合网站在线| 91亚洲精品久久久蜜桃网站 | 日本一区二区三区四区 | 国产成人在线色| 黑人精品欧美一区二区蜜桃| 性做久久久久久久久| 国产不卡免费视频| 国内精品久久久久影院色| 人人爽香蕉精品| 天天色天天操综合| 午夜欧美视频在线观看| 亚洲自拍偷拍图区| 亚洲综合一区在线| 亚洲一区免费在线观看| 亚洲欧美日韩国产综合在线| 国产精品理伦片| 国产精品女上位| 国产精品国产三级国产a | 91亚洲国产成人精品一区二区三 | 亚洲一区免费视频| 亚洲国产精品久久不卡毛片 | 91麻豆精品国产| 欧美日韩在线观看一区二区| 欧美私人免费视频| 3atv在线一区二区三区| 欧美一区二区视频免费观看| 欧美另类高清zo欧美| 在线播放视频一区| 91麻豆精品91久久久久久清纯| 8x8x8国产精品| 日韩欧美国产wwwww| 久久亚洲精品小早川怜子| 久久精品一区四区| 国产精品久久久久久久久免费相片| 国产精品久久久久久久浪潮网站|