⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 arm7 lpc2132+vs1003+sdcard制作MP3 此程序在 KEIL3下编译
💻 C
字号:

#include "stdlib.h"
#include "main.h"
  
#include   <string.h>	
#include   <stdio.h>  

#define	TaskStkLengh	64		//Define the Task0 stack length 定义用户任务0的堆栈长度

//////////////////////////////////////////////////////////////////////
//任务的堆栈的定义
//////////////////////////////////////////////////////////////////////
OS_STK	TaskStartStk [TaskStkLengh]; 				//Define the Task0 stack 定义用户任务0的堆栈

OS_STK	VS1003_Stk[TaskStkLengh];

OS_STK  LCD_Stk[TaskStkLengh];

OS_STK  KEYBOARD_Stk[TaskStkLengh];


extern void VS1003_Play(void *pdata);
//////////////////////////////////////////////////////////////////////
//定义消息队列消息邮箱 信号量的
//全局变量
//////////////////////////////////////////////////////////////////////

OS_EVENT * Key_Mbox;


extern const uint8 Logo1[1024];
extern const uint8 Logo2[1024];

extern uint8 MP3_BUFFER[512];
extern uint16 VOL_BUFFER[30];

uint8 voloue=20;

extern INT32U  Clust; 
/**************************************************************************************************
**Name: 	  
**Function:   
**Input:	  
**Output:	  
**************************************************************************************************/
void AD_Init(void)
{
	PINSEL1 = 1 << 18;								// P0.25连接到AD0.4
	
	AD0CR = (1 << 4)				|				// SEL=8,选择通道4
			((Fpclk / 1000000 - 1) << 8)     |		// CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
			(0 << 16)				|				// BURST=0,软件控制转换操作
			(0 << 17)				|				// CLKS=0, 使用11clock转换
			(1 << 21)				|				// PDN=1,正常工作模式
			(0 << 22)				|				// TEST1:0=00,正常工作模式
			(1 << 24)				|				// START=1,直接启动ADC转换
			(0 << 27);								// 直接启动ADC转换时,此位
}
/**************************************************************************************************
**Name: 	  
**Function:   
**Input:	  
**Output:	  
**************************************************************************************************/
void AD_VOL(void)
{	
	uint32  ADC_Data;
	uint8   dat[4];

	OS_ENTER_CRITICAL();
	AD0CR |= 1 << 24;					// 进行第一次转换
	
	while ((ADDR & 0x80000000) == 0);	// 等待转换结束
	
	AD0CR |= 1 << 24;					// 再次启动转换
	
	while ((AD0DR & 0x80000000) == 0);	// 等待转换结束
	
	ADC_Data = AD0DR;					// 读取ADC结果
	ADC_Data = (ADC_Data >> 6) & 0x3ff;
	ADC_Data = ADC_Data * 3250; 		// 参考电压经过3/4分压
	ADC_Data = ADC_Data / 1024;

	OS_EXIT_CRITICAL();
	
	dat[0] = (uint8)ADC_Data;
	dat[1] = (uint8)(ADC_Data>>8);
	dat[2] = (uint8)(ADC_Data>>16);
	dat[3] = (uint8)(ADC_Data>>24);
	
	UART0_SendByte (dat[3]);
	UART0_SendByte (dat[2]);
	UART0_SendByte (dat[1]);
	UART0_SendByte (dat[0]);
	
}
/**************************************************************************************************
**Name: 	  
**Function:   
**Input:	  
**Output:	  
**************************************************************************************************/
void PORT_Init(void)
{
	SYSTEM_PO_GPIO();		
	SYSTEM_PO_OUT();

	SYSTEM_PO_SET();
	
	POWER_GPIO();		
	POWER_IN();	
	
	KEY1_GPIO();				
	KEY1_IN();	

	KEY2_GPIO();				
	KEY2_IN();	

	KEY3_GPIO();				
	KEY3_IN();	

	KEY4_GPIO();				
	KEY4_IN();

	KEY5_GPIO();				
	KEY5_IN();	

	KEY6_GPIO();				
	KEY6_IN();	
					
	LED1_GPIO();				
	LED1_OUT();	
	LED1_SET();

	LED2_GPIO();					
	LED2_OUT();	
	LED2_SET();

	LED3_GPIO();					
	LED3_OUT();		
	LED3_SET();
}
/**************************************************************************************************
**Name: 	  
**Function:   
**Input:	  
**Output:	  
**************************************************************************************************/
void VIC_Init(void)
{
	//VICIntSelect = 0x00000000;
	//VICVectAddr1 = (int)IRQ_IIC;
	//VICVectAddr3 = (int)Eint0_IRQ;	    // 设置中断服务程序地址
	//VICVectCntl1 = 0x29;   				// i2c0  中断9
	//VICVectCntl3 = 0x20 | 14;				// 分配外部中断0到向量中断0
	//EXTINT       = 0x01;					// 清除EINT0中断标志
	//VICIntEnable = 1 << 14;				// 使能EINT0中断
	//VICIntEnable = (1 << 9);			
	//VICIntEnable = 0x02c0;                     
}
/**************************************************************************************************
**Name: 	  
**Function:   
**Input:	  
**Output:	  
**************************************************************************************************/
void Create_SemBox(void)
{
	//INT8U err;

	//Disp_Sem = OSSemCreate(1);
	
	Key_Mbox = OSMboxCreate((void *)0);
}
/**************************************************************************************************
**Name: 	  
**Function:   
**Input:	  
**Output:	  
**************************************************************************************************/
void All_Init(void)
{
	OS_ENTER_CRITICAL();
	PORT_Init();
	LED1_CLR();
	AD_Init();
	SD_Init();
	Fat_Init();
	VS1003_Init();
	GetFileClust();
	AM12864_Init();
	UART0_Init(115200);
	LED1_SET();
	OS_EXIT_CRITICAL();
}
/**************************************************************************************************
**Name: 	  
**Function:   
**Input:	  
**Output:	  
**************************************************************************************************/
void KEYBOARD(void *pdata)
{
	pdata=pdata;

	while(1)
    {
		
		if( KEY1_STATE()==0 )
		{
			OSTimeDlyHMSM(0, 0, 0, 50);
			if( KEY1_STATE()==0 )
			{
				OS_ENTER_CRITICAL();
				LED1_CLR();
				OSTaskDel (15);
				VS1003_SendNull();
				OSTimeDlyHMSM(0, 0, 0, 100);
				GetUpFileClust();
				OSTaskCreate(VS1003_Play, (void *)0, &VS1003_Stk[TaskStkLengh -1],15);
				OSTimeDlyHMSM(0, 0, 0, 500);
				LED1_SET();
				OS_EXIT_CRITICAL();
			}
		}
	
		if(KEY3_STATE() == 0)
		{
			OSTimeDlyHMSM(0, 0, 0, 50);
			if(KEY3_STATE() == 0)
			{
				OS_ENTER_CRITICAL();
				LED1_CLR();
				OSTaskDel (15);
				VS1003_SendNull();
				OSTimeDlyHMSM(0, 0, 0, 100);
				GetFileClust();
				OSTaskCreate(VS1003_Play, (void *)0, &VS1003_Stk[TaskStkLengh -1],15);
				OSTimeDlyHMSM(0, 0, 0, 500);
				LED1_SET();
				OS_EXIT_CRITICAL();
			}
		}

		if(KEY5_STATE()==0)
		{
			LED1_CLR();
			voloue = voloue+1;
			if(voloue>=29)
			{
				voloue=29;
			}
			VS1003_WriteReg(VS1003_SPI_VOL ,VOL_BUFFER[voloue]);
			
			OSTimeDlyHMSM(0, 0, 0, 200);
			LED1_SET();
 			//OSMboxPost(Key_Mbox, &key);
		}
		
		if(KEY6_STATE()==0)
		{
			LED1_CLR();
			voloue=voloue-1;
			if(voloue<=1)
			{
				voloue=1;
			}
			
			VS1003_WriteReg(VS1003_SPI_VOL ,VOL_BUFFER[voloue]);
			
			OSTimeDlyHMSM(0, 0, 0, 200);
			LED1_SET();
 			//OSMboxPost(Key_Mbox, &key);
		}
		
		//if(POWER_STATE() == POWER)
		//{
		//	LED2_CLR();
		//	OSTimeDlyHMSM(0, 0, 0, 500);	
		//	LED2_SET();
		//}
		OSTimeDlyHMSM(0, 0, 0, 10);
    }
}
/**************************************************************************************************
**Name: 	  
**Function:   
**Input:	  
**Output:	  
**************************************************************************************************/
void LCD_Display(void *pdata)
{
	//int8 *keynumber;
	//uint8 err;
	
	pdata = pdata;

	AM12864_BL_SET();
	
	while(1)	
	{
		//keynumber = OSMboxPend(Key_Mbox, 0, & err);
		
		//if(*keynumber==1)
		//{
			AM12864_Graphics_Display(Logo1,0,0,128,8, AM12864_Natural);
			OSTimeDlyHMSM(0, 0, 2, 0);

			//AD_VOL();
			
			AM12864_Graphics_Display(Logo2,0,0,128,8, AM12864_Natural);
			OSTimeDlyHMSM(0, 0, 2, 0);
		//}
	}
}
/**************************************************************************************************
**Name: 	  
**Function:   
**Input:	  
**Output:	  
**************************************************************************************************/
void VS1003_Play(void *pdata)
{
	uint32 n;
	uint32 i;
	uint32 num;
	uint32 data_pointer=0; 

	pdata = pdata;

	num	= Clust;

	while(1)
	{
		for(i=0;i<8;i++)
		{
			GetFileData(num,i);
			do
			{
				if(VS1003_DREQ_STATE()== VS1003_DREQ) 
				{	
					for(n=0;n<32;n++)
					{	
						VS1003_WriteDat(MP3_BUFFER[data_pointer]);
						data_pointer++;	
					}	
				}
			}
			while(data_pointer<511);

			data_pointer=0;
		}

		num = fatNextCluster(num);

		if(num==CLUST_EOFE)
		{
			GetFileClust();
			num = Clust;
		}
	}
}
/**************************************************************************************************
**Name: 	  
**Function:   
**Input:	  
**Output:	  
**************************************************************************************************/
void TaskStart(void *pdata)
{
	pdata = pdata;  																	/* 避免编译警告 */

	All_Init();

	//Create_SemBox();
	
	OSTaskCreate(LCD_Display, (void *)0, &LCD_Stk[TaskStkLengh -1],11);
	
	OSTaskCreate(KEYBOARD, (void *)0, &KEYBOARD_Stk[TaskStkLengh -1],12);
	
	OSTaskCreate(VS1003_Play, (void *)0, &VS1003_Stk[TaskStkLengh -1],15);

	while(1)
	{ 	
		LED3_CLR();
		OSTimeDlyHMSM(0, 0, 0, 500);
		LED3_SET();
		OSTimeDlyHMSM(0, 0, 0, 500);
	}
}

/**************************************************************************************************
**Name: 	  
**Function:   
**Input:	  
**Output:	  
**************************************************************************************************/
int main (void)
{	
	OSInit ();
	OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TaskStkLengh - 1], 10);
	OSStart ();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -