📄 main.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 + -