YX5200_main.c 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715
  1. #include "main.h"
  2. #include "YX5200_main.h"
  3. #include "Delay.h"
  4. #include "SPI-SD/Lcd/lcd_5110_solution.h"
  5. uint8_t TxBufferUart2[256] = { 0 };
  6. uint8_t RxBufferUart2[256] = { 0 };
  7. __IO uint8_t TxCounterUart2 = 0x00;
  8. __IO uint8_t RxCounterUart2 = 0x00;
  9. uint8_t Uart2SendCount = 0;//实际发送
  10. uint8_t YX5200HaveRecFlag = false;
  11. /*******************wifi UART通讯配置*********************/
  12. void Configuration_YX5200_Usart2 ( void )
  13. {
  14. #if xy5200_Uart2_def
  15. GPIO_InitTypeDef GPIO_InitStructure;
  16. USART_InitTypeDef USART_InitStructure;
  17. //使能USARTz 时钟可配置
  18. YX5200_RCC_GPIO_CONFIG();
  19. YX5200_RCC_UART_CONFIG();
  20. YX5200_RCC_Remap_CONFIG();
  21. /*
  22. * USART2_TX -> PD5 , USART2_RX -> PD6
  23. */
  24. GPIO_InitStructure.GPIO_Pin = YX5200_Tx;
  25. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  26. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  27. GPIO_Init ( YX5200_GPIO, &GPIO_InitStructure );
  28. GPIO_InitStructure.GPIO_Pin = YX5200_Rx;
  29. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  31. GPIO_Init ( YX5200_GPIO, &GPIO_InitStructure );
  32. USART_InitStructure.USART_BaudRate = YX5200_UART_BAUD;
  33. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  34. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  35. USART_InitStructure.USART_Parity = USART_Parity_No;
  36. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  37. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  38. USART_Init ( YX5200_UART, &USART_InitStructure );
  39. USART_ITConfig ( YX5200_UART, USART_IT_RXNE, ENABLE );
  40. USART_ITConfig ( YX5200_UART, USART_IT_TXE, DISABLE );
  41. USART_Cmd ( YX5200_UART, ENABLE );
  42. #endif
  43. }
  44. //系统中断管理
  45. void NVIC_Configuration_YX5200_USART2 ( void )
  46. {
  47. #if xy5200_Uart2_def
  48. NVIC_InitTypeDef NVIC_InitStructure;
  49. /* Configure the NVIC Preemption Priority Bits */
  50. NVIC_PriorityGroupConfig ( YX5200_NVIC_Group );
  51. /* Enable the USARTy Interrupt */
  52. NVIC_InitStructure.NVIC_IRQChannel = YX5200_NVIC_Interrupt;
  53. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = YX5200_NVIC_Pre;
  54. NVIC_InitStructure.NVIC_IRQChannelSubPriority = YX5200_NVIC_Sub;
  55. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  56. NVIC_Init ( &NVIC_InitStructure );
  57. Init_YX5200_VOL();
  58. #endif
  59. }
  60. void Uart2Send ( char *buffer, int nBytes )
  61. {
  62. // Wait for previous xmt to complete
  63. while ( TxCounterUart2 < Uart2SendCount );
  64. // Setup next XMT
  65. memcpy ( TxBufferUart2, buffer, nBytes );
  66. TxCounterUart2 = 0;
  67. Uart2SendCount = nBytes;
  68. USART_ITConfig ( YX5200_UART, USART_IT_TXE, ENABLE );
  69. }
  70. /*******************************************************************************************************************/
  71. //配置结束
  72. /*******************************************************************************************************************/
  73. static INT8U MSG_FIFO = NO_MSG;
  74. static INT8U InputNumCnt = 0 ;
  75. static INT8U FolderNum = 0 ;//指定文件夹操作时的文件夹数目
  76. static INT8U FileNum = 0 ;//指定文件名操作时的文件名数目
  77. INT8U _ErrorStatus = 0 ;
  78. INT8U FEEDBACK = 1 ;//是否需要反馈[=1:要应答][=0:不要应答]
  79. INT8U UartRecvStatus ;
  80. INT16U UartRecvACK ;
  81. bool UartRecvACKFlag = false;
  82. INT8U UartRecv_100Ms ;//保证串口接收错误,也能回到初始状态
  83. INT8U System_Status = 0 ;//系统状态
  84. INT8U OutTimeCnt = 0 ;//重发计时
  85. INT8U ResendCount = 3 ;//重发次数
  86. INT8U QueryACKTime = 0 ;//[查询参数]等待应答计时
  87. INT8U SysReturnTime = 0 ;//系统返回初始界面计时
  88. INT8U PlayledCnt = 0 ;//测试led点亮的时间
  89. INT8U PlayledStatus;
  90. INT8U CurrentEQ = 0 ;//当前的EQ
  91. INT8U PlayMode = 0 ;//当前的播放模式
  92. INT8U PlayDevice = 0;//当前播放的设备
  93. INT8U OnlineDevice = 0 ;//在线的设备
  94. INT8U DelayTime = 0 ;
  95. INT8U input_vol = 0 ;//当前的音量
  96. INT8U CurrentModule = 0 ;//当前的模块型号
  97. INT8U PointFunc = 0 ;
  98. INT16U input_number ;//选曲输入的数字
  99. INT16U CurDevTotal = 0 ;//当前设备的总文件数
  100. INT16U UDiskTotal = 0 ; //U盘总文件数
  101. INT16U TFTotal = 0 ;//TF卡文件数
  102. INT16U FlashTotal = 0 ;//_FLASH中的文件数
  103. INT16U CurDevNUM = 0 ;//当前设备播放的曲目
  104. INT16U UDiskCurFile = 0 ; //当前U盘播放的文件号
  105. INT16U TFCurFile = 0 ;//当前TF播放的文件号
  106. INT16U FlashCurFile = 0 ;//当前_FLASH播放的文件号
  107. INT16U input_cur_fold = 0; //指定的文件夹
  108. INT16U CurFileNum = 0 ;//当前文件数目
  109. INT16U CurFoldNum = 0 ;//当前文件夹数目
  110. cc Status0 , Status1 , Status2, Status3;
  111. const INT8U asc_number[] = "0123456789"; ///<0~9的ASCII码表
  112. INT8U bcd_number[5];
  113. void Let_One_Music_play ( u8 fold, u16 file )
  114. {
  115. #if xy5200_Uart2_def
  116. FolderNum = fold;
  117. FileNum = file;
  118. PointFunc = POINTNUM_FOLDER;
  119. put_msg_lifo ( MSG_MUSIC_PLAY_NEW_FILE );
  120. #endif
  121. }
  122. void Random_play_music ( u8 num )
  123. {
  124. #if xy5200_Uart2_def
  125. input_number = num;
  126. put_msg_lifo ( MSG_PLAY_RANDOM );
  127. #endif
  128. }
  129. /*****************************************************************************************************
  130. - 功能描述: 将消息存入消息池
  131. - 隶属模块: 外部
  132. - 参数说明: 无
  133. - 返回说明:
  134. - 注:无
  135. *****************************************************************************************************/
  136. void put_msg_lifo ( INT8U msg )
  137. {
  138. MSG_FIFO = msg ;
  139. }
  140. /*****************************************************************************************************
  141. - 功能描述: 取消息
  142. - 隶属模块: 外部
  143. - 参数说明: 无
  144. - 返回说明:
  145. - 注:无
  146. *****************************************************************************************************/
  147. INT8U app_get_msg ( void )
  148. {
  149. static INT8U msg ;
  150. msg = MSG_FIFO ;
  151. if ( MSG_FIFO != NO_MSG )
  152. {
  153. MSG_FIFO = NO_MSG ;
  154. return msg ;
  155. }
  156. else
  157. {
  158. return NO_MSG ;//将消息清除
  159. }
  160. }
  161. /*****************************************************************************************************
  162. - 函数说明:获取一个一位十进制的数的个位
  163. - 隶属模块:内部
  164. - 参数说明:i:输入的一个一位十进制的数
  165. - 返回说明:
  166. - 注 :
  167. *****************************************************************************************************/
  168. void itoa1 ( INT8U i )
  169. {
  170. bcd_number[0] = asc_number[i % 10];
  171. bcd_number[1] = 0;
  172. }
  173. /*****************************************************************************************************
  174. - 函数说明:获取一个2位十进制的数的各个位
  175. - 隶属模块:内部
  176. - 参数说明:i:输入的一个2位十进制的数
  177. - 返回说明:
  178. - 注 :
  179. *****************************************************************************************************/
  180. void itoa2 ( INT8U i )
  181. {
  182. bcd_number[0] = asc_number[ ( i % 100 ) / 10];
  183. bcd_number[1] = asc_number[ ( i % 10 )];
  184. bcd_number[2] = 0;
  185. }
  186. /*****************************************************************************************************
  187. - 函数说明:获取一个3位十进制数的各个位
  188. - 隶属模块:内部
  189. - 参数说明:i:输入的一个3位十进制数
  190. - 返回说明:
  191. - 注 :
  192. *****************************************************************************************************/
  193. void itoa3 ( INT16U i )
  194. {
  195. bcd_number[0] = asc_number[ ( i % 1000 ) / 100];
  196. bcd_number[1] = asc_number[ ( i % 100 ) / 10];
  197. bcd_number[2] = asc_number[i % 10];
  198. bcd_number[3] = 0;
  199. }
  200. /*****************************************************************************************************
  201. - 函数说明:获取一个4位十进制的数的各个位
  202. - 隶属模块:内部
  203. - 参数说明:i:输入的一个4位十进制的数
  204. - 返回说明:
  205. - 注 :
  206. *****************************************************************************************************/
  207. void itoa4 ( INT16U i )
  208. {
  209. bcd_number[0] = asc_number[ ( i % 10000 ) / 1000];
  210. bcd_number[1] = asc_number[ ( i % 1000 ) / 100];
  211. bcd_number[2] = asc_number[ ( i % 100 ) / 10];
  212. bcd_number[3] = asc_number[i % 10];
  213. bcd_number[4] = 0;
  214. }
  215. /********************************************************************************************
  216. - 功能描述: 清屏
  217. - 隶属模块: 内部
  218. - 参数说明:
  219. - 返回说明:
  220. - 注:
  221. *******************************************************************************************/
  222. void LCD1602_Clear ( void )
  223. {
  224. if ( System_Flag_Prin_Music )
  225. {
  226. memset ( n5110_string, 0x20, sizeof ( n5110_string ) );
  227. delay_ms ( 1 );
  228. }
  229. }
  230. /********************************************************************************************
  231. - 功能描述: 指定位置显示字符
  232. - 隶属模块: 内部
  233. - 参数说明: x:代表显示的行[0:第一行][1:第二行]
  234. y:代表显示的列[0~15]
  235. - 返回说明:
  236. - 注:
  237. *******************************************************************************************/
  238. void LCD1602_DispDat ( INT8U x, INT8U y, INT8U ch )
  239. {
  240. if ( System_Flag_Prin_Music )
  241. {
  242. sprintf ( &n5110_string[2 * x][y], "%c", ch );
  243. }
  244. }
  245. /********************************************************************************************
  246. - 功能描述: 指定位置显示字符串
  247. - 隶属模块: 内部
  248. - 参数说明: x:代表显示的行[0:第一行][1:第二行]
  249. y:代表显示的列[0~15]
  250. - 返回说明:
  251. - 注:
  252. *******************************************************************************************/
  253. void LCD1602_DispStr ( INT8U x, INT8U y, INT8U *str )
  254. {
  255. if ( System_Flag_Prin_Music )
  256. {
  257. sprintf ( &n5110_string[2 * x][y], "%s", str );
  258. }
  259. }
  260. /********************************************************************************************
  261. - 功能描述: 清除指定的行
  262. - 隶属模块: 内部
  263. - 参数说明:
  264. - 返回说明:
  265. - 注:
  266. *******************************************************************************************/
  267. void LCD1602_ClearLine ( INT8U x )
  268. {
  269. sprintf ( n5110_string[x * 2 + 0], " " );
  270. sprintf ( n5110_string[x * 2 + 1], " " );
  271. }
  272. /*****************************************************************************************************
  273. - 函数说明:显示模块返回的错误
  274. - 隶属模块:内部
  275. - 参数说明:无
  276. - 返回说明:
  277. - 注 :
  278. *****************************************************************************************************/
  279. void DispModlueError ( INT8U error )
  280. {
  281. LCD1602_Clear();
  282. LCD1602_DispStr ( 0 , 0 , "RETURN ERROR " );
  283. switch ( error )
  284. {
  285. case ERROR_IDLE :
  286. break ;
  287. case ERROR_Busy :
  288. LCD1602_DispStr ( 1 , 0 , "BUSY " );
  289. break ;
  290. case ERROR_SLEEP :
  291. LCD1602_DispStr ( 1 , 0 , "SLEEP " );
  292. break ;
  293. case ERROR_RecvError :
  294. LCD1602_DispStr ( 1 , 0 , "RECV ERROR " );
  295. break ;
  296. case ERROR_CheckSError :
  297. LCD1602_DispStr ( 1 , 0 , "SUM ERROR " );
  298. break ;
  299. case ERROR_FolPointOver :
  300. LCD1602_DispStr ( 1 , 0 , "FOL OVER " );
  301. break ;
  302. case ERROR_FolPointNo :
  303. LCD1602_DispStr ( 1 , 0 , "NO FIND FILE " );
  304. break ;
  305. }
  306. }
  307. /*****************************************************************************************************
  308. - 功能描述: 按键的初始化
  309. - 隶属模块: 外部
  310. - 参数说明: 无
  311. - 返回说明: 无
  312. - 注:
  313. *****************************************************************************************************/
  314. void RAM_Init ( void )
  315. {
  316. System_Flag_2Ms = 0 ;
  317. System_Flag_10Ms = 0 ;
  318. System_Flag_100Ms = 0 ;
  319. System_Flag_500Ms = 0 ;
  320. RecvOver_Flag = 0 ;
  321. Resend_Flag_Enable = 0 ;
  322. MainEnable = true ;
  323. SysReturnTime = 0 ;
  324. PlayledCnt = 0 ;
  325. PlayledStatus = 0;
  326. PlayledStatus = SET_PLAYLED_OFF;
  327. }
  328. /*****************************************************************************************************
  329. - 功能描述:初始化
  330. - 参数说明:无
  331. - 返回参数:无
  332. - 注:无
  333. *****************************************************************************************************/
  334. void System_Init ( void )
  335. {
  336. RAM_Init() ;
  337. itoa1 ( 0 );
  338. itoa2 ( 0 );
  339. itoa3 ( 0 );
  340. itoa4 ( 0 );
  341. TrigEnable = 1 ;
  342. PointFunc = POINTNUM_ONE ;
  343. input_vol = MAX_MAIN_VOL ;//上电默认最大音量
  344. System_Status = SYS_STATUS_WORK ;
  345. SysReturnTime = 30 ;//定义3S的时候等待模块初始化完成
  346. }
  347. /********************************************************************************************
  348. - 功能描述: 显示当前的播放模式
  349. - 隶属模块: 内部
  350. - 参数说明:
  351. - 返回说明:
  352. - 注:
  353. *******************************************************************************************/
  354. static void DispDevice ( INT8U device )
  355. {
  356. switch ( device )
  357. {
  358. case PLAYDEVICE_UDISK :
  359. LCD1602_DispStr ( 0 , 9 , "U" );
  360. break ;
  361. case PLAYDEVICE_TFCARD :
  362. LCD1602_DispStr ( 0 , 9 , "T" );
  363. break ;
  364. case PLAYDEVICE_PC:
  365. LCD1602_DispStr ( 0 , 9 , "P" );
  366. break ;
  367. case PLAYDEVICE_FLASH:
  368. LCD1602_DispStr ( 0 , 9 , "F" );
  369. break ;
  370. case PLAYDEVICE_SLEEP:
  371. LCD1602_DispStr ( 0 , 9 , "S" );
  372. break ;
  373. default:
  374. LCD1602_DispStr ( 0 , 9 , "N" );
  375. break ;
  376. }
  377. }
  378. /********************************************************************************************
  379. - 功能描述: 返回液晶显示界面
  380. - 隶属模块: 内部
  381. - 参数说明:
  382. - 返回说明:
  383. - 注:
  384. *******************************************************************************************/
  385. void ReturnLcdInit ( void )
  386. {
  387. DispDevice ( PlayDevice ) ;
  388. if ( FEEDBACK )
  389. {
  390. LCD1602_DispStr ( 0 , 13 , "ACK" );
  391. }
  392. else
  393. {
  394. LCD1602_DispStr ( 0 , 12 , "NACK" );
  395. }
  396. #if 0
  397. if ( TrigEnable )
  398. {
  399. LCD1602_DispStr ( 1 , 5 , "TRIG" ); //触发模式
  400. }
  401. else
  402. {
  403. LCD1602_DispStr ( 1 , 5 , "CONT" ); //连续模式
  404. }
  405. #endif
  406. if ( PointFunc == POINTNUM_ONE )
  407. {
  408. LCD1602_DispStr ( 1 , 5 , "ONE " );
  409. }
  410. else if ( PointFunc == POINTNUM_LOOP )
  411. {
  412. LCD1602_DispStr ( 1 , 5 , "LOOP" );
  413. }
  414. else if ( PointFunc == POINTNUM_FOLDER )
  415. {
  416. LCD1602_DispStr ( 1 , 5 , "FOLD" );
  417. }
  418. if ( PointFolNum_Flag )
  419. {
  420. LCD1602_DispStr ( 0 , 7 , "F" ); //指定文件夹
  421. }
  422. else
  423. {
  424. LCD1602_DispStr ( 0 , 7 , "N" ); //正常指定曲目
  425. }
  426. }
  427. /********************************************************************************************
  428. - 功能描述: 显示播放到的设备
  429. - 隶属模块: 内部
  430. - 参数说明:
  431. - 返回说明:
  432. - 注:
  433. *******************************************************************************************/
  434. void Disp_PlayDevice ( INT8U device )
  435. {
  436. if ( device == PLAYDEVICE_UDISK )
  437. {
  438. LCD1602_DispStr ( 1 , 0 , "PLAYD:_UDISK" );
  439. }
  440. else if ( device == PLAYDEVICE_TFCARD )
  441. {
  442. LCD1602_DispStr ( 1 , 0 , "PLAYD:_TFCARD" );
  443. }
  444. else if ( device == PLAYDEVICE_PC )
  445. {
  446. LCD1602_DispStr ( 1 , 0 , "PLAYD:_PC" );
  447. }
  448. else if ( device == PLAYDEVICE_FLASH )
  449. {
  450. LCD1602_DispStr ( 1 , 0 , "PLAYD:_FLASH" );
  451. }
  452. else if ( device == PLAYDEVICE_SLEEP )
  453. {
  454. LCD1602_DispStr ( 1 , 0 , "PLAYD:SLEEP" );
  455. }
  456. }
  457. /********************************************************************************************
  458. - 功能描述: 显示播放到的模式
  459. - 隶属模块: 内部
  460. - 参数说明:
  461. - 返回说明:
  462. - 注:
  463. *******************************************************************************************/
  464. void Disp_PlayMode ( INT8U mode )
  465. {
  466. if ( mode == REPEAT_ALL )
  467. {
  468. LCD1602_DispStr ( 1 , 0 , "PLAYM:ALL_0" );
  469. }
  470. else if ( mode == REPEAT_FOLDER )
  471. {
  472. LCD1602_DispStr ( 1 , 0 , "PLAYM:FOLDER_1" );
  473. }
  474. else if ( mode == REPEAT_ONE )
  475. {
  476. LCD1602_DispStr ( 1 , 0 , "PLAYM:ONE_2" );
  477. }
  478. else if ( mode == REPEAT_RANDOM )
  479. {
  480. LCD1602_DispStr ( 1 , 0 , "PLAYM:RANDOM_3" );
  481. }
  482. }
  483. /********************************************************************************************
  484. - 功能描述: 显示播放到的EQ
  485. - 隶属模块: 内部
  486. - 参数说明:
  487. - 返回说明:
  488. - 注:
  489. *******************************************************************************************/
  490. void Disp_PlayEQ ( INT8U EQ )
  491. {
  492. if ( EQ == EQ_NORMAL )
  493. {
  494. LCD1602_DispStr ( 1 , 0 , "EQ:NORMAL_0" );
  495. }
  496. else if ( EQ == EQ_POP )
  497. {
  498. LCD1602_DispStr ( 1 , 0 , "EQ:POP_1" );
  499. }
  500. else if ( EQ == EQ_ROCK )
  501. {
  502. LCD1602_DispStr ( 1 , 0 , "EQ:ROCK_2" );
  503. }
  504. else if ( EQ == EQ_JAZZ )
  505. {
  506. LCD1602_DispStr ( 1 , 0 , "EQ:JAZZ_3" );
  507. }
  508. else if ( EQ == EQ_CLASSIC )
  509. {
  510. LCD1602_DispStr ( 1 , 0 , "EQ:CLASSIC_4" );
  511. }
  512. else if ( EQ == EQ_BASS )
  513. {
  514. LCD1602_DispStr ( 1 , 0 , "EQ:BASS_5" );
  515. }
  516. }
  517. /********************************************************************************************
  518. - 功能描述: 显示模块返回的在线设备
  519. - 隶属模块: 内部
  520. - 参数说明:
  521. - 返回说明:
  522. - 注:
  523. *******************************************************************************************/
  524. void Disp_OnlineDevice ( INT8U Online )
  525. {
  526. INT8U temp ;
  527. temp = Online & 0x01 ;
  528. if ( temp ) //_UDISK
  529. {
  530. LCD1602_DispStr ( 1 , 12 , "U" );
  531. }
  532. temp = Online & 0x02 ;
  533. if ( temp ) //TF
  534. {
  535. LCD1602_DispStr ( 1 , 13 , "T" );
  536. }
  537. temp = Online & 0x04 ;
  538. if ( temp ) //_PC
  539. {
  540. LCD1602_DispStr ( 1 , 14 , "P" );
  541. }
  542. temp = Online & 0x08 ;
  543. if ( temp ) //_FLASH
  544. {
  545. LCD1602_DispStr ( 1 , 15 , "F" );
  546. }
  547. }
  548. /********************************************************************************************
  549. - 功能描述: 上电跳转至设备状态
  550. - 隶属模块: 外部
  551. - 参数说明:
  552. - 返回说明:
  553. - 注:
  554. *******************************************************************************************/
  555. void GoInitDevice ( INT8U Online )
  556. {
  557. INT8U temp ;
  558. if ( 0 == Online )
  559. {
  560. PlayDevice = PLAYDEVICE_SLEEP ;
  561. return ;
  562. }
  563. temp = Online & 0x01 ;
  564. if ( temp )
  565. {
  566. PlayDevice = PLAYDEVICE_UDISK ;
  567. return ;
  568. }
  569. temp = Online & 0x02 ;
  570. if ( temp ) //TF
  571. {
  572. PlayDevice = PLAYDEVICE_TFCARD ;
  573. return ;
  574. }
  575. temp = Online & 0x04 ;
  576. if ( temp ) //_PC
  577. {
  578. PlayDevice = PLAYDEVICE_PC ;
  579. return ;
  580. }
  581. temp = Online & 0x08 ;
  582. if ( temp ) //_FLASH
  583. {
  584. PlayDevice = PLAYDEVICE_FLASH ;
  585. return ;
  586. }
  587. }
  588. /********************************************************************************************
  589. - 功能描述: 设备拔出跳至下一个设备
  590. - 隶属模块: 外部
  591. - 参数说明:
  592. - 返回说明:
  593. - 注:
  594. *******************************************************************************************/
  595. void GotoNextDevice ( INT8U device )
  596. {
  597. if ( device == _UDISK )
  598. {
  599. if ( OnlineDevice & BIT ( _TFCARD ) )
  600. {
  601. PlayDevice = PLAYDEVICE_TFCARD ;
  602. }
  603. else
  604. {
  605. if ( OnlineDevice & BIT ( _FLASH ) )
  606. {
  607. PlayDevice = PLAYDEVICE_FLASH ;
  608. }
  609. else
  610. {
  611. PlayDevice = PLAYDEVICE_SLEEP ;
  612. }
  613. }
  614. }
  615. else if ( device == _TFCARD )
  616. {
  617. if ( OnlineDevice & BIT ( _UDISK ) )
  618. {
  619. PlayDevice = PLAYDEVICE_UDISK ;
  620. }
  621. else
  622. {
  623. if ( OnlineDevice & BIT ( _FLASH ) )
  624. {
  625. PlayDevice = PLAYDEVICE_FLASH ;
  626. }
  627. else
  628. {
  629. PlayDevice = PLAYDEVICE_SLEEP ;
  630. }
  631. }
  632. }
  633. else if ( device == _PC )
  634. {
  635. if ( OnlineDevice & BIT ( _FLASH ) )
  636. {
  637. PlayDevice = PLAYDEVICE_FLASH ;
  638. }
  639. else
  640. {
  641. PlayDevice = PLAYDEVICE_SLEEP ;
  642. }
  643. }
  644. }
  645. void ChangeDevice ( INT8U dev )
  646. {
  647. if ( dev == PLAYDEVICE_UDISK )
  648. {
  649. if ( 0 == ( OnlineDevice & BIT ( _UDISK ) ) )
  650. {
  651. if ( OnlineDevice & BIT ( _TFCARD ) )
  652. {
  653. PlayDevice = PLAYDEVICE_TFCARD ;
  654. }
  655. else
  656. {
  657. if ( OnlineDevice & BIT ( _FLASH ) )
  658. {
  659. PlayDevice = PLAYDEVICE_FLASH ;
  660. }
  661. else
  662. {
  663. PlayDevice = PLAYDEVICE_SLEEP ;
  664. }
  665. }
  666. }
  667. }
  668. if ( dev == PLAYDEVICE_TFCARD )
  669. {
  670. if ( 0 == ( OnlineDevice & BIT ( _TFCARD ) ) )
  671. {
  672. if ( OnlineDevice & BIT ( _UDISK ) )
  673. {
  674. PlayDevice = PLAYDEVICE_UDISK ;
  675. }
  676. else
  677. {
  678. if ( OnlineDevice & BIT ( _FLASH ) )
  679. {
  680. PlayDevice = PLAYDEVICE_FLASH ;
  681. }
  682. else
  683. {
  684. PlayDevice = PLAYDEVICE_SLEEP ;
  685. }
  686. }
  687. }
  688. }
  689. else if ( dev == PLAYDEVICE_PC )
  690. {
  691. if ( 0 == ( OnlineDevice & BIT ( _PC ) ) )
  692. {
  693. if ( OnlineDevice & BIT ( _FLASH ) )
  694. {
  695. PlayDevice = PLAYDEVICE_FLASH ;
  696. }
  697. else
  698. {
  699. PlayDevice = PLAYDEVICE_SLEEP ;
  700. }
  701. }
  702. }
  703. else if ( dev == PLAYDEVICE_FLASH )
  704. {
  705. if ( 0 == ( OnlineDevice & BIT ( _FLASH ) ) )
  706. {
  707. PlayDevice = PLAYDEVICE_SLEEP ;
  708. }
  709. }
  710. }
  711. /********************************************************************************************
  712. - 功能描述: LCD1602液晶初始化
  713. - 隶属模块: 内部
  714. - 参数说明:
  715. - 返回说明:
  716. - 注:
  717. *******************************************************************************************/
  718. void LCD1602_Init()
  719. {
  720. //LCD初始化设定
  721. LCD1602_DispDat ( 0, 0, 0 );
  722. LCD1602_DispStr ( 0 , 0 , "QYMxFS----------" ); //
  723. LCD1602_DispStr ( 1 , 0 , "PLAY: " ); //
  724. ReturnLcdInit();
  725. Disp_OnlineDevice ( OnlineDevice );
  726. }
  727. #define DBG(str)
  728. /*****************************************************************************************************
  729. - 函数说明:数字选曲操作
  730. - 隶属模块:内部
  731. - 参数说明:无
  732. - 返回说明:
  733. - 注 :
  734. *****************************************************************************************************/
  735. void PointPlayNum ( INT8U num )
  736. {
  737. DBG ( "MSG_input_num\n" ) ;
  738. if ( 0 == InputNumCnt )
  739. {
  740. LCD1602_ClearLine ( 1 );
  741. }
  742. InputNumCnt = 30 ;//连续3S没有按键按下,输入超时
  743. SysReturnTime = 0 ;
  744. LCD1602_DispStr ( 1 , 0 , "INPUT NUM:[" );
  745. LCD1602_DispStr ( 1 , 15 , "]" );
  746. input_number = input_number * 10 + num ;
  747. if ( input_number > 1999 )
  748. {
  749. input_number = 0;
  750. }
  751. itoa4 ( input_number );
  752. LCD1602_DispStr ( 1 , 11 , ( INT8U * ) bcd_number );
  753. }
  754. /*****************************************************************************************************
  755. - 函数说明:指定文件夹以及文件名操作
  756. - 隶属模块:内部
  757. - 参数说明:无
  758. - 返回说明:
  759. - 注 :
  760. *****************************************************************************************************/
  761. void PointPlayFolderNum ( INT8U num )
  762. {
  763. static INT8U InputCnt = 0 ;
  764. DBG ( "MSG_input_num\n" ) ;
  765. if ( 0 == InputNumCnt )
  766. {
  767. InputCnt = 5 ;
  768. LCD1602_Clear();
  769. LCD1602_DispStr ( 0 , 0 , "FOLD NUM[ ]" ); //指定的文件夹
  770. LCD1602_DispStr ( 1 , 0 , "FILE NUM[ ]" ); //指定的文件名
  771. }
  772. InputNumCnt = 30 ;//连续3S没有按键按下,输入超时
  773. SysReturnTime = 0 ;
  774. if ( InputCnt > 3 )
  775. {
  776. FolderNum = FolderNum * 10 + num ;
  777. if ( FileNum > 99 )
  778. {
  779. FileNum = 0;
  780. }
  781. itoa2 ( FolderNum );
  782. LCD1602_DispStr ( 0 , 9 , ( INT8U * ) bcd_number );
  783. }
  784. else
  785. {
  786. FileNum = FileNum * 10 + num ;
  787. if ( FileNum >= 255 )
  788. {
  789. FileNum = 0;
  790. }
  791. itoa3 ( FileNum );
  792. LCD1602_DispStr ( 1 , 9 , ( INT8U * ) bcd_number );
  793. }
  794. if ( ( --InputCnt ) == 0 )
  795. {
  796. InputCnt = 0 ;
  797. InputNumCnt = 10 ;
  798. }
  799. }
  800. /*****************************************************************************************************
  801. - 函数说明:消息处理
  802. - 隶属模块:内部
  803. - 参数说明:无
  804. - 返回说明:
  805. - 注 :
  806. *****************************************************************************************************/
  807. void MSG_Task ( void )
  808. {
  809. #if xy5200_Uart2_def
  810. static INT8U msg ;
  811. msg = app_get_msg();
  812. switch ( msg )
  813. {
  814. /*****************************************************
  815. 显示模块返回的错误
  816. *****************************************************/
  817. case MSG_RECV_ERROR:
  818. DispModlueError ( _ErrorStatus );
  819. SysReturnTime = SYSRETURNTIME ;
  820. break ;
  821. /*****************************************************
  822. 返回初始状态
  823. *****************************************************/
  824. case MSG_RETURN_INIT:
  825. RAM_Init() ;
  826. LCD1602_Init();
  827. DBG ( "MSG_RETURN_INIT\n" ) ;
  828. break ;
  829. /*****************************************************
  830. 设备插入
  831. *****************************************************/
  832. case MSG_UDISK_IN:
  833. LCD1602_ClearLine ( 1 );
  834. LCD1602_DispStr ( 1 , 0 , "_UDISK IN" );
  835. PlayDevice = PLAYDEVICE_UDISK ;
  836. OnlineDevice |= BIT ( _UDISK ) ;
  837. SysReturnTime = SYSRETURNTIME ;
  838. break ;
  839. case MSG_TF_IN:
  840. LCD1602_ClearLine ( 1 );
  841. LCD1602_DispStr ( 1 , 0 , "TF IN" );
  842. PlayDevice = PLAYDEVICE_TFCARD ;
  843. OnlineDevice |= BIT ( _TFCARD ) ;
  844. SysReturnTime = SYSRETURNTIME ;
  845. break ;
  846. case MSG_PC_IN:
  847. LCD1602_ClearLine ( 1 );
  848. LCD1602_DispStr ( 1 , 0 , "_PC IN" );
  849. PlayDevice = PLAYDEVICE_PC ;
  850. OnlineDevice |= BIT ( _PC ) ;
  851. SysReturnTime = SYSRETURNTIME ;
  852. break ;
  853. /*****************************************************
  854. 设备拔出
  855. *****************************************************/
  856. case MSG_UDISK_OUT:
  857. LCD1602_ClearLine ( 1 );
  858. LCD1602_DispStr ( 1 , 0 , "_UDISK OUT" );
  859. OnlineDevice &= ~ BIT ( _UDISK ) ;
  860. GotoNextDevice ( _UDISK ) ;
  861. SysReturnTime = SYSRETURNTIME ;
  862. break ;
  863. case MSG_TF_OUT:
  864. LCD1602_ClearLine ( 1 );
  865. LCD1602_DispStr ( 1 , 0 , "TF OUT" );
  866. OnlineDevice &= ~ BIT ( _TFCARD ) ;
  867. GotoNextDevice ( _TFCARD ) ;
  868. SysReturnTime = SYSRETURNTIME ;
  869. break ;
  870. case MSG_PC_OUT:
  871. LCD1602_ClearLine ( 1 );
  872. LCD1602_DispStr ( 1 , 0 , "_PC OUT" );
  873. OnlineDevice &= ~ BIT ( _PC ) ;
  874. GotoNextDevice ( _PC ) ;
  875. SysReturnTime = SYSRETURNTIME ;
  876. break ;
  877. /*****************************************************
  878. 返回初始状态
  879. *****************************************************/
  880. case MSG_DELAY_TIME:
  881. DelayTime = 6 ;
  882. break ;
  883. /*****************************************************
  884. 查询参数无应答
  885. *****************************************************/
  886. case MSG_QUERY_ERROR:
  887. LCD1602_Clear() ;
  888. LCD1602_DispStr ( 1 , 0 , "ERROR CMD" );
  889. SysReturnTime = SYSRETURNTIME ;
  890. break ;
  891. /*****************************************************
  892. 查询歌曲总数
  893. *****************************************************/
  894. case MSG_QUERY_NUMTOTAL:
  895. LCD1602_Clear() ;
  896. LCD1602_DispStr ( 0 , 0 , "QUERY TOTAL NUM " );
  897. #if 1
  898. if ( PlayDevice == PLAYDEVICE_SLEEP )
  899. {
  900. LCD1602_Clear() ;
  901. LCD1602_DispStr ( 1 , 0 , "MOD IN SLEEP " );
  902. QueryACKTime = QUERYACKTIME ;//等待应答计时
  903. break;
  904. }
  905. #endif
  906. if ( PlayDevice == PLAYDEVICE_UDISK )
  907. {
  908. Uart_SendCMD ( UARTQUR_UDISK_TOTAL , FEEDBACK , 0 );
  909. }
  910. else if ( PlayDevice == PLAYDEVICE_TFCARD )
  911. {
  912. Uart_SendCMD ( UARTQUR_TF_TOTAL , FEEDBACK , 0 );
  913. }
  914. else if ( PlayDevice == PLAYDEVICE_FLASH )
  915. {
  916. Uart_SendCMD ( UARTQUR_FLASH_TOTAL , FEEDBACK , 0 );
  917. }
  918. LCD1602_DispStr ( 1 , 0 , "WAIT RETURN ...." );
  919. QueryACKTime = QUERYACKTIME ;//等待应答计时
  920. break ;
  921. /*****************************************************
  922. 显示查询当前播放设备曲目总数
  923. *****************************************************/
  924. case MSG_RETURN_NUMTOTAL:
  925. QueryACKTime = 0 ;//清除等待超时
  926. LCD1602_Clear() ;
  927. LCD1602_DispStr ( 0 , 0 , "DEVICE: " );
  928. LCD1602_DispStr ( 1 , 0 , "TOTAL NUM: " );
  929. if ( PlayDevice == PLAYDEVICE_UDISK )
  930. {
  931. CurDevTotal = UDiskTotal ;
  932. LCD1602_DispStr ( 0 , 8 , "_UDISK" );
  933. }
  934. else if ( PlayDevice == PLAYDEVICE_TFCARD )
  935. {
  936. CurDevTotal = TFTotal ;
  937. LCD1602_DispStr ( 0 , 8 , "TF" );
  938. }
  939. else if ( PlayDevice == PLAYDEVICE_FLASH )
  940. {
  941. CurDevTotal = FlashTotal ;
  942. LCD1602_DispStr ( 0 , 8 , "_FLASH" );
  943. }
  944. itoa4 ( CurDevTotal );
  945. LCD1602_DispStr ( 1 , 11 , ( INT8U * ) bcd_number );
  946. break ;
  947. /*****************************************************
  948. 指定文件夹曲目数查询
  949. *****************************************************/
  950. case MSG_QUERY_CURNUM:
  951. LCD1602_Clear() ;
  952. LCD1602_DispStr ( 0 , 0 , "QUERY CUR NUM " );
  953. if ( PlayDevice == PLAYDEVICE_SLEEP )
  954. {
  955. LCD1602_Clear() ;
  956. LCD1602_DispStr ( 1 , 0 , "MOD IN SLEEP " );
  957. QueryACKTime = QUERYACKTIME ;//等待应答计时
  958. break;
  959. }
  960. if ( PlayDevice == PLAYDEVICE_UDISK )
  961. {
  962. Uart_SendCMD ( UARTQUR_UDISK_FILE , FEEDBACK , 0 );
  963. }
  964. else if ( PlayDevice == PLAYDEVICE_TFCARD )
  965. {
  966. Uart_SendCMD ( UARTQUR_TF_FILE , FEEDBACK , 0 );
  967. }
  968. else if ( PlayDevice == PLAYDEVICE_FLASH )
  969. {
  970. Uart_SendCMD ( UARTQUR_FLASH_FILE, FEEDBACK , 0 );
  971. }
  972. LCD1602_DispStr ( 1 , 0 , "WAIT RETURN ...." );
  973. QueryACKTime = QUERYACKTIME ;//等待应答计时
  974. break ;
  975. /*****************************************************
  976. 显示查询当前播放曲目
  977. *****************************************************/
  978. case MSG_RETURN_CURNUM:
  979. QueryACKTime = 0 ;//清除等待超时
  980. LCD1602_Clear() ;
  981. LCD1602_DispStr ( 0 , 0 , "DEVICE: " );
  982. LCD1602_DispStr ( 1 , 0 , "CUR UM: " );
  983. if ( PlayDevice == PLAYDEVICE_UDISK )
  984. {
  985. CurDevNUM = UDiskCurFile ;
  986. LCD1602_DispStr ( 0 , 8 , "_UDISK" );
  987. }
  988. else if ( PlayDevice == PLAYDEVICE_TFCARD )
  989. {
  990. CurDevNUM = TFCurFile ;
  991. LCD1602_DispStr ( 0 , 8 , "TF" );
  992. }
  993. else if ( PlayDevice == PLAYDEVICE_FLASH )
  994. {
  995. CurDevNUM = FlashCurFile ;
  996. LCD1602_DispStr ( 0 , 8 , "_FLASH" );
  997. }
  998. itoa4 ( CurDevNUM );
  999. LCD1602_DispStr ( 1 , 11 , ( INT8U * ) bcd_number );
  1000. SysReturnTime = SYSRETURNTIME ;
  1001. break ;
  1002. /*****************************************************
  1003. 查询当前文件数
  1004. *****************************************************/
  1005. case MSG_QUERY_FILENUM:
  1006. LCD1602_Clear() ;
  1007. LCD1602_DispStr ( 0 , 0 , "QUERY CUR FILE " );
  1008. LCD1602_DispStr ( 1 , 0 , "WAIT RETURN ...." );
  1009. Uart_SendCMD ( UARTQUR_FILE_NUM , FEEDBACK , input_cur_fold );
  1010. input_cur_fold = 0 ;
  1011. QueryACKTime = QUERYACKTIME ;//等待应答计时
  1012. break;
  1013. /*****************************************************
  1014. 显示当前文件数(0-999)
  1015. *****************************************************/
  1016. case MSG_RETURN_FILENUM:
  1017. QueryACKTime = 0 ;//清除等待超时
  1018. LCD1602_Clear() ;
  1019. LCD1602_DispStr ( 1 , 0 , "FILE: " );
  1020. itoa3 ( CurFileNum );
  1021. LCD1602_DispStr ( 1 , 11 , ( INT8U * ) bcd_number );
  1022. SysReturnTime = SYSRETURNTIME ;
  1023. break ;
  1024. /*****************************************************
  1025. 查询当前音量
  1026. *****************************************************/
  1027. case MSG_QUERY_VOL:
  1028. LCD1602_Clear() ;
  1029. LCD1602_DispStr ( 0 , 0 , "QUERY CUR VOL " );
  1030. #if 0
  1031. if ( PlayDevice == PLAYDEVICE_SLEEP )
  1032. {
  1033. LCD1602_DispStr ( 1 , 0 , "MOD IN SLEEP " );
  1034. }
  1035. else
  1036. #endif
  1037. {
  1038. LCD1602_DispStr ( 1 , 0 , "WAIT RETURN ...." );
  1039. Uart_SendCMD ( UARTQUR_VOL , FEEDBACK , 0 );
  1040. }
  1041. QueryACKTime = QUERYACKTIME ;//等待应答计时
  1042. break ;
  1043. /*****************************************************
  1044. 显示查询当前音量的数据
  1045. *****************************************************/
  1046. case MSG_RETURN_VOL:
  1047. QueryACKTime = 0 ;//清除等待超时
  1048. LCD1602_Clear() ;
  1049. LCD1602_DispStr ( 1 , 0 , "VOL: " );
  1050. itoa2 ( input_vol );
  1051. LCD1602_DispStr ( 1 , 11 , ( INT8U * ) bcd_number );
  1052. SysReturnTime = SYSRETURNTIME ;
  1053. break ;
  1054. /*****************************************************
  1055. 查询当前EQ
  1056. *****************************************************/
  1057. case MSG_QUERY_EQ:
  1058. LCD1602_Clear() ;
  1059. LCD1602_DispStr ( 0 , 0 , "QUERY CUR EQ " );
  1060. #if 1
  1061. if ( PlayDevice == PLAYDEVICE_SLEEP )
  1062. {
  1063. LCD1602_DispStr ( 1 , 0 , "MOD IN SLEEP " );
  1064. }
  1065. else
  1066. #endif
  1067. {
  1068. LCD1602_DispStr ( 1 , 0 , "WAIT RETURN ...." );
  1069. Uart_SendCMD ( UARTQUR_EQ , FEEDBACK , 0 );
  1070. }
  1071. QueryACKTime = QUERYACKTIME ;//等待应答计时
  1072. break ;
  1073. /*****************************************************
  1074. 显示查询当前EQ的数据
  1075. *****************************************************/
  1076. case MSG_RETURN_EQ:
  1077. QueryACKTime = 0 ;//清除等待超时
  1078. LCD1602_Clear() ;
  1079. Disp_PlayEQ ( CurrentEQ );
  1080. SysReturnTime = SYSRETURNTIME ;
  1081. break ;
  1082. /*****************************************************
  1083. 查询当前播放模式
  1084. *****************************************************/
  1085. case MSG_QUERY_PLAYMODE:
  1086. LCD1602_Clear() ;
  1087. LCD1602_DispStr ( 0 , 0 , "QUERY PLAY MODE " );
  1088. if ( PlayDevice == PLAYDEVICE_SLEEP )
  1089. {
  1090. LCD1602_DispStr ( 1 , 0 , "MOD IN SLEEP " );
  1091. }
  1092. else
  1093. {
  1094. LCD1602_DispStr ( 1 , 0 , "WAIT RETURN ...." );
  1095. Uart_SendCMD ( UARTQUR_PLAYMODE , FEEDBACK , 0 );
  1096. }
  1097. QueryACKTime = QUERYACKTIME ;//等待应答计时
  1098. break ;
  1099. /*****************************************************
  1100. 显示查询当前播放模式的数据
  1101. *****************************************************/
  1102. case MSG_RETURN_PLAYMODE:
  1103. QueryACKTime = 0 ;//清除等待超时
  1104. LCD1602_Clear() ;
  1105. Disp_PlayMode ( PlayMode );
  1106. SysReturnTime = SYSRETURNTIME ;
  1107. break ;
  1108. /*****************************************************
  1109. 显示模块初始化发出的数据
  1110. *****************************************************/
  1111. case MSG_RETURN_MINIT:
  1112. LCD1602_Clear() ;
  1113. LCD1602_DispStr ( 0 , 0 , "RECV MODL OK " );
  1114. LCD1602_DispStr ( 1 , 0 , "ONLINE DEV: " );
  1115. Disp_OnlineDevice ( OnlineDevice );
  1116. GoInitDevice ( OnlineDevice ) ;
  1117. System_Status = SYS_STATUS_WORK ;
  1118. SysReturnTime = SYSRETURNTIME ;//定义3S的时候等待模块初始化完成
  1119. break ;
  1120. #if 0
  1121. /*****************************************************
  1122. 切换工作模式
  1123. *****************************************************/
  1124. case MSG_TRIG_MODE:
  1125. TrigEnable = !TrigEnable ;
  1126. LCD1602_ClearLine ( 1 );
  1127. if ( TrigEnable == PLAYDEVICE_UDISK )
  1128. {
  1129. LCD1602_DispStr ( 1 , 0 , "PLAYM : TRIG" ); //1:触发模式
  1130. }
  1131. else
  1132. {
  1133. LCD1602_DispStr ( 1 , 0 , "PLAYM : CONT" ); //0:连续模式
  1134. }
  1135. SysReturnTime = SYSRETURNTIME ;
  1136. break ;
  1137. #endif
  1138. /*****************************************************
  1139. 切换当前播放设备
  1140. *****************************************************/
  1141. case MSG_NEXT_WORKMODE:
  1142. LCD1602_Clear() ;
  1143. LCD1602_DispStr ( 0 , 0 , "PLAY DEVICE SET" );
  1144. PlayDevice ++ ;
  1145. if ( PlayDevice == PLAYDEVICE_MAX )
  1146. {
  1147. PlayDevice = PLAYDEVICE_UDISK;
  1148. }
  1149. ChangeDevice ( PlayDevice );
  1150. Disp_PlayDevice ( PlayDevice );
  1151. Uart_SendCMD ( UARTCMD_PLAYDEVICE , FEEDBACK , PlayDevice );
  1152. SysReturnTime = SYSRETURNTIME ;
  1153. break ;
  1154. /*****************************************************
  1155. EQ
  1156. *****************************************************/
  1157. case MSG_MUSIC_NEXT_EQ:
  1158. LCD1602_Clear() ;
  1159. LCD1602_DispStr ( 0 , 0 , "EQ SET" );
  1160. CurrentEQ ++ ;
  1161. if ( CurrentEQ == EQ_BASS )
  1162. {
  1163. CurrentEQ = EQ_NORMAL;
  1164. }
  1165. Uart_SendCMD ( UARTCMD_EQ_POINT , FEEDBACK , CurrentEQ );
  1166. Disp_PlayEQ ( CurrentEQ );
  1167. SysReturnTime = SYSRETURNTIME ;
  1168. break ;
  1169. /*****************************************************
  1170. 播放
  1171. *****************************************************/
  1172. case MSG_MUSIC_PLAY:
  1173. Uart_SendCMD ( UARTCMD_MUSIC_PLAY , FEEDBACK , 0 );
  1174. DBG ( "MUSIC_PLAY\n" ) ;
  1175. LCD1602_ClearLine ( 1 );
  1176. LCD1602_DispStr ( 1 , 0 , "MUSIC_PLAY" );
  1177. SysReturnTime = SYSRETURNTIME ;
  1178. break ;
  1179. /*****************************************************
  1180. 暂停
  1181. *****************************************************/
  1182. case MSG_MUSIC_PAUSE:
  1183. Uart_SendCMD ( UARTCMD_MUSIC_PAUSE , FEEDBACK , 0 );
  1184. DBG ( "MUSIC_PAUSE\n" ) ;
  1185. LCD1602_ClearLine ( 1 );
  1186. LCD1602_DispStr ( 1 , 0 , "MUSIC_PAUSE" );
  1187. SysReturnTime = SYSRETURNTIME ;
  1188. break ;
  1189. /*****************************************************
  1190. 下一曲
  1191. *****************************************************/
  1192. case MSG_MUSIC_NEXT_FILE:
  1193. if ( input_vol > 0 )
  1194. {
  1195. input_vol -- ;
  1196. }
  1197. Uart_SendCMD ( UARTCMD_NEXT_FILE , FEEDBACK , 0 );
  1198. DBG ( "MSG_MUSIC_NEXT_FILE\n" ) ;
  1199. LCD1602_ClearLine ( 1 );
  1200. LCD1602_DispStr ( 1 , 0 , "NEXT FILE PLAY" );
  1201. SysReturnTime = SYSRETURNTIME ;
  1202. break ;
  1203. /*****************************************************
  1204. 上一曲
  1205. *****************************************************/
  1206. case MSG_MUSIC_PREV_FILE:
  1207. Uart_SendCMD ( UARTCMD_PREV_FILE , FEEDBACK , 0 );
  1208. DBG ( "MSG_MUSIC_PREV_FILE\n" ) ;
  1209. LCD1602_ClearLine ( 1 );
  1210. LCD1602_DispStr ( 1 , 0 , "PREV FILE PLAY" );
  1211. SysReturnTime = SYSRETURNTIME ;
  1212. break ;
  1213. /*****************************************************
  1214. 循环播放模式设置
  1215. *****************************************************/
  1216. case MSG_PLAYALL:
  1217. PlayAllFlag = !PlayAllFlag ;
  1218. LCD1602_ClearLine ( 1 );
  1219. if ( PlayAllFlag )
  1220. {
  1221. LCD1602_DispStr ( 1 , 0 , "ALL PLAY ON " );
  1222. put_msg_lifo ( MSG_PLAYALL_ON );
  1223. }
  1224. else
  1225. {
  1226. LCD1602_DispStr ( 1 , 0 , "ALL PLAY OFF" );
  1227. put_msg_lifo ( MSG_PLAYALL_OFF );
  1228. }
  1229. break ;
  1230. /*****************************************************
  1231. 循环播放模式--开
  1232. *****************************************************/
  1233. case MSG_PLAYALL_ON:
  1234. Uart_SendCMD ( UARTCMD_PLAYALL , FEEDBACK , 0x01 );
  1235. DBG ( "MSG_MUSIC_PREV_FILE\n" ) ;
  1236. SysReturnTime = SYSRETURNTIME ;
  1237. break ;
  1238. /*****************************************************
  1239. 循环播放模式--关
  1240. *****************************************************/
  1241. case MSG_PLAYALL_OFF:
  1242. Uart_SendCMD ( UARTCMD_PLAYALL , FEEDBACK , 0 );
  1243. DBG ( "MSG_MUSIC_PREV_FILE\n" ) ;
  1244. SysReturnTime = SYSRETURNTIME ;
  1245. break ;
  1246. /******************************************************
  1247. 音量调节
  1248. *****************************************************/
  1249. case MSG_VOL_UP:
  1250. input_vol++;
  1251. input_vol++;
  1252. case MSG_VOL_DOWN:
  1253. input_vol--;
  1254. if ( input_vol == 255 )
  1255. {
  1256. input_vol = 0 ;
  1257. }
  1258. else if ( input_vol > MAX_MAIN_VOL )
  1259. {
  1260. input_vol = MAX_MAIN_VOL ;
  1261. }
  1262. Uart_SendCMD ( UARTCMD_VOL_POINT , FEEDBACK , input_vol );
  1263. LCD1602_ClearLine ( 1 );
  1264. LCD1602_DispStr ( 1 , 0 , "CUR VOL[ ]" );
  1265. SysReturnTime = SYSRETURNTIME ;
  1266. itoa2 ( input_vol );
  1267. LCD1602_DispStr ( 1 , 8 , ( INT8U * ) bcd_number );
  1268. break ;
  1269. /*****************************************************
  1270. 输入超时处理
  1271. *****************************************************/
  1272. case MSG_INPUT_TIMEOUT:
  1273. DBG ( "MSG_INPUT_TIMEOUT\n" ) ;
  1274. put_msg_lifo ( MSG_MUSIC_PLAY_NEW_FILE );
  1275. break;
  1276. /*****************************************************
  1277. 选择指定的曲目
  1278. *****************************************************/
  1279. case MSG_MUSIC_PLAY_NEW_FILE:
  1280. DBG ( "MSG_MUSIC_PLAY_NEW_FILE\n" ) ;
  1281. LCD1602_Clear() ;
  1282. if ( PlayDevice == PLAYDEVICE_SLEEP )
  1283. {
  1284. LCD1602_DispStr ( 1 , 0 , "MOD IN SLEEP " );
  1285. }
  1286. else
  1287. {
  1288. if ( POINTNUM_ONE == PointFunc ) //指定单曲播放
  1289. {
  1290. Uart_SendCMD ( UARTCMD_NUM_POINT , FEEDBACK , input_number );
  1291. LCD1602_DispStr ( 1 , 0 , "SEND ONE NUM " );
  1292. }
  1293. else if ( POINTNUM_LOOP == PointFunc ) //指定单曲循环播放
  1294. {
  1295. Uart_SendCMD ( UARTCMD_LOOP_PLAY , FEEDBACK , input_number );
  1296. LCD1602_DispStr ( 1 , 0 , "SEND LOOP NUM " );
  1297. }
  1298. else if ( POINTNUM_FOLDER == PointFunc ) //指定文件夹和文件
  1299. {
  1300. input_number = ( ( INT16U ) ( FolderNum ) << 8 ) | FileNum ;
  1301. FileNum = 0 ;
  1302. FolderNum = 0 ;
  1303. Uart_SendCMD ( UARTCMD_MUSIC_FOLDER , FEEDBACK , input_number );
  1304. LCD1602_DispStr ( 1 , 0 , "FOLD FILE POINT" );
  1305. }
  1306. }
  1307. input_number = 0 ;
  1308. SysReturnTime = SYSRETURNTIME ;
  1309. break;
  1310. /*****************************************************
  1311. 随机播放
  1312. *****************************************************/
  1313. case MSG_PLAY_RANDOM:
  1314. Uart_SendCMD ( UARTCMD_PLAY_RANDOM_ALL , FEEDBACK , input_number );
  1315. input_number = 0;
  1316. LCD1602_ClearLine ( 1 );
  1317. LCD1602_DispStr ( 1 , 0 , "PLAY RANDOM" );
  1318. SysReturnTime = SYSRETURNTIME ;
  1319. break;
  1320. /*****************************************************
  1321. 指定文件夹以及指定文件名
  1322. *****************************************************/
  1323. case MSG_SET_PLAYMODE:
  1324. if ( ( ++PointFunc ) == POINTNUM_MAX )
  1325. {
  1326. PointFunc = POINTNUM_ONE ;
  1327. }
  1328. SysReturnTime = SYSRETURNTIME ;
  1329. LCD1602_ClearLine ( 1 );
  1330. if ( PointFunc == POINTNUM_ONE )
  1331. {
  1332. LCD1602_DispStr ( 1 , 0 , "POINT ONE " );
  1333. }
  1334. else if ( PointFunc == POINTNUM_LOOP )
  1335. {
  1336. LCD1602_DispStr ( 1 , 0 , "POINT LOOP " );
  1337. }
  1338. else if ( PointFunc == POINTNUM_FOLDER )
  1339. {
  1340. LCD1602_DispStr ( 1 , 0 , "POINT FOLDER " );
  1341. }
  1342. break;
  1343. /*****************************************************
  1344. 切换是否需要反馈
  1345. *****************************************************/
  1346. case MSG_UART_ACK:
  1347. LCD1602_ClearLine ( 1 );
  1348. if ( FEEDBACK )
  1349. {
  1350. FEEDBACK = 0 ;
  1351. LCD1602_DispStr ( 1 , 0 , "NO NEED ACK" );
  1352. }
  1353. else
  1354. {
  1355. FEEDBACK = 1 ;
  1356. LCD1602_DispStr ( 1 , 0 , "NEED ACK" );
  1357. }
  1358. SysReturnTime = SYSRETURNTIME ;
  1359. break;
  1360. /*****************************************************
  1361. 数字键操作,用于数字选曲
  1362. 和文件夹指定,文件名指定
  1363. *****************************************************/
  1364. case MSG_0:
  1365. case MSG_1:
  1366. case MSG_2:
  1367. case MSG_3:
  1368. case MSG_4:
  1369. case MSG_5:
  1370. case MSG_6:
  1371. case MSG_7:
  1372. case MSG_8:
  1373. case MSG_9:
  1374. if ( POINTNUM_FOLDER == PointFunc ) //指定文件夹的状态
  1375. {
  1376. PointPlayFolderNum ( msg );
  1377. }
  1378. else
  1379. {
  1380. PointPlayNum ( msg ) ;
  1381. }
  1382. break ;
  1383. }
  1384. #endif
  1385. }
  1386. /*****************************************************************************************************
  1387. - 函数说明:播放指示灯[100ms处理一次]
  1388. - 隶属模块:内部
  1389. - 参数说明:无
  1390. - 返回说明:
  1391. - 注 :
  1392. *****************************************************************************************************/
  1393. void Indicator_Scan ( void )
  1394. {
  1395. static INT8U flash_cnt;
  1396. switch ( PlayledStatus )
  1397. {
  1398. case SET_PLAYLED_ON:
  1399. PLAYLED_ON;
  1400. break;
  1401. case SET_PLAYLED_OFF:
  1402. PLAYLED_OFF;
  1403. break;
  1404. case SET_PLAYLED_100MS_FLASH:
  1405. PLAYLED_FLASH;
  1406. break;
  1407. case SET_PLAYLED_500MS_FLASH:
  1408. if ( ++flash_cnt > 4 )
  1409. {
  1410. flash_cnt = 0;
  1411. PLAYLED_FLASH;
  1412. }
  1413. break;
  1414. case SET_PLAYLED_900MS_ON_100MS_OFF:
  1415. if ( ++flash_cnt > 4 )
  1416. {
  1417. flash_cnt = 0;
  1418. PLAYLED_ON;
  1419. }
  1420. else
  1421. {
  1422. PLAYLED_OFF;
  1423. }
  1424. break;
  1425. }
  1426. }
  1427. /*****************************************************************************************************
  1428. - 函数说明:定时[100ms运行一次]
  1429. - 隶属模块:内部
  1430. - 参数说明:无
  1431. - 返回说明:
  1432. - 注 :
  1433. *****************************************************************************************************/
  1434. void Time_Task ( void )
  1435. {
  1436. #if xy5200_Uart2_def
  1437. if ( ( DelayTime ) && ( ( --DelayTime ) == 0 ) )
  1438. {
  1439. put_msg_lifo ( MSG_MUSIC_PLAY ); ; //
  1440. }
  1441. if ( ( UartRecv_100Ms ) && ( ( --UartRecv_100Ms ) == 0 ) )
  1442. {
  1443. UartRecvStatus = UART_RECV_IDLE ;//串口接收限定时间未接收完毕
  1444. }
  1445. if ( ( PlayledCnt ) && ( ( --PlayledCnt ) == 0 ) )
  1446. {
  1447. PlayledStatus = SET_PLAYLED_OFF ;
  1448. }
  1449. if ( ( InputNumCnt ) && ( ( --InputNumCnt ) == 0 ) )
  1450. {
  1451. put_msg_lifo ( MSG_INPUT_TIMEOUT );
  1452. }
  1453. if ( ( SysReturnTime ) && ( ( --SysReturnTime ) == 0 ) )
  1454. {
  1455. if ( System_Status == SYS_STATUS_INIT )
  1456. {
  1457. put_msg_lifo ( MSG_RETURN_INIT );
  1458. }
  1459. else if ( System_Status == SYS_STATUS_WORK )
  1460. {
  1461. put_msg_lifo ( MSG_RETURN_INIT );
  1462. }
  1463. }
  1464. if ( ( UartRecvACK ) && ( ( --UartRecvACK ) == 0 ) ) //没有收到应答
  1465. {
  1466. if ( FEEDBACK )
  1467. {
  1468. PlayledCnt = PLAYLEDCNT ;
  1469. PlayledStatus = SET_PLAYLED_100MS_FLASH ;
  1470. }
  1471. }
  1472. if ( ( QueryACKTime ) && ( ( --QueryACKTime ) == 0 ) ) //没有收到应答
  1473. {
  1474. if ( PlayDevice == PLAYDEVICE_NULL )
  1475. {
  1476. SysReturnTime = 1 ;
  1477. }
  1478. else
  1479. {
  1480. put_msg_lifo ( MSG_QUERY_ERROR );
  1481. }
  1482. }
  1483. #endif
  1484. }