我自己做的是一個DIY的mp3播放器。(相對簡單一點,見笑) 大概算是完成了,但是在最后添加上一曲下一曲功能的時候遇到了瓶頸。 我在上網查看了相關材料,但大多答非所問。 我的問題是: 使用的是按鍵實現上一曲下一曲,所以涉及到按鍵掃描的頻率問題。 設想的是使用中斷程序,每10ms掃描一次按鍵,或者更短。因為播放的mp3文件的16位數據是一個時間十分短暫、次數十分多的過程。 這個10ms一次的掃描頻率是否過高了?或者是否有其他方法可以實現持續整個音樂播放過程的按鍵掃描? (原本是在中斷程序中掃描按鍵情況對MusicNum進行加或減,緊接著調用MusicPlay。 我在主循環中用了這個函數之后,又在中斷中調用同一個函數,涉及到子函數重入的問題,會有warning。所以我將中斷中的MusicPlay刪除了。) 我在程序中設置一個變量MusicNum作為文件播放程序MusicPlay的參數。 MusicPlay是一個switch函數,MusicNum作為switch中case的判斷參數。 在中斷程序中根據按鍵情況對MusicNum進行加或減 中斷改變MusicNum的值,在中斷結束后返回MusicPlay程序后,是會根據新的MusicNum重新進入switch選擇還是在繼續運行上一個MusicNum對應的case? 還有幾種可能的錯誤是: 我將按鍵對應引腳拉低的方式是接地,拉低的方式是否會有一些不規范的問題?(但是我自己用電壓表測過了,初始電壓在5V左右,按鍵按下后跳轉至0V) 按鍵對應引腳的特殊性,是否會有些I/O口特別而不能將其拉低?(我選的是單片機不少I/O口都有復用的功能,但是我認為我選用的I/O只是普通的,也不是VCC和GND引腳) 我按照自己的想法做完之后,上一曲下一曲的按鍵并沒有作用,而且長按按鍵的話會使音樂停止播放,松開后繼續播放當前音樂,說明并沒有MusicNum值的改變。 我原本認為是沒有進入中斷,長按通知播放是引腳的問題(例如拉低某個引腳會進入掉電模式等等),所以在將中斷程序去除再長按,以證明。但是去除后,按鍵卻理想化的沒有任何作用。下為按鍵掃描的部分 if(key2==0) //音樂下一首 { delayms(10); if(key2==0); { MusicNum++; while(!key2); } } 所以是可以進入中斷的,長按停止播放應該是 while(!key2); /等待按鍵釋放 這一句的作用。 那么為什么進入了中斷中的掃描按鍵,并且可以到等待按鍵釋放這一句卻無法使得上一句中的MusicNum產生數值變化? 我不知道問題可能出在哪,麻煩大佬可以提供些意見或者看法,十分感謝!
|