|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2008-05-30, 09:34 PM | #1 |
註冊會員
|
討論 - C語言音樂程式 疑問
問題一 我想加個sw4可以顯示0 可是不知道該加在哪好
問題二我想加八個LED燈(Do對應LED1 Re對應LED2 Mi對應LED3 Fa對應LED4 So對應LED5 La對應LED6 Si對應LED7 Hi_Do對應LED8),當每首歌響時,LED就跟著音符動作發亮 (已經寫好了) RUN了一下是沒問題 但是這樣寫問題二的動作會出來嗎 語法:
#include "reg51.h" #include "music.h" /*抓music.h內檔案*/ sbit P1_0=0x90; /*定義8051喇叭接腳位置*/ unsigned char TimeOut; /*發音長度控制(節拍)*/ unsigned int Tone; /*音符*/ unsigned char Beat; /*節拍*/ unsigned int Length=5; /*1拍長度控制*/ unsigned char No=0; /*音符指標*/ unsigned char KeyStatus; /*按鍵狀態*/ unsigned int code ToneTable1[]= /*小星星歌曲音符*/ {DO4,DO4,SO4,SO4, LA4,LA4,RE4, FA4,FA4,MI4,MI4, RE4,RE4,DO4, SO4,SO4,FA4,FA4, MI4,MI4,RE4, SO4,SO4,FA4,FA4, MI4,MI4,RE4, DO4,DO4,SO4,SO4, LA4,LA4,SO4, FA4,FA4,MI4,MI4, RE4,RE4,DO4}; unsigned char code BeatTable1[]= /*小星星歌曲節拍定義*/ {2,2,2,2, 2,2,4, 2,2,2,2, 2,2,4, 2,2,2,2, 2,2,4, 2,2,2,2, 2,2,4, 2,2,2,2, 2,2,4, 2,2,2,2, 2,2,4,0}; unsigned int code ToneTable2[]= /*布穀歌曲音符*/ {SO4,MI4,0, SO4,MI4,0, RE4,DO4,RE4, DO4, RE4,RE4,MI4, FA4,RE4, MI4,MI4,FA4, SO4,MI4, SO4,MI4, SO4,MI4, FA4,MI4,RE4, DO4}; unsigned char code BeatTable2[]= /*布穀歌曲節拍*/ {2,2,2, 2,2,2, 2,2,2, 6, 2,2,2, 4,2, 2,2,2, 2,2, 4,2, 4,2, 2,2,2, 6,0}; unsigned int code ToneTable3[]= /*倫敦鐵橋垮下來歌曲音符*/ {SO4,LA4,SO4,FA4, MI4,FA4,SO4,0, RE4,MI4,FA4,0, MI4,FA4,SO4,0, SO4,LA4,SO4,FA4, MI4,FA4,SO4,0, RE4,SO4,0, MI4,RE4,DO4,0}; /*倫敦鐵橋垮下來歌曲節拍*/ unsigned char code BeatTable3[]= {3,1,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2, 3,1,2,2, 2,2,2,2, 4,2,2, 2,2,2,2,0}; char table[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; void Tone_Led(int); main() { void KeyScan(void); /*按鍵函數宣告*/ void delay(void); /*延遲函數宣告*/ unsigned char key=0; /*鍵值*/ IE=0x8a; /*中斷致能暫存器使用計時器0跟計時器1*/ TMOD=0x11; /*計時器0跟計時器1使用模式1*/ TH1=(65536-50000); /*設定記其事1初值*/ TL1=(65536-50000); TR0=0; /*關閉計時器0*/ TR1=0; /*關閉計時器1*/ P2=0x40; /*P2七段顯示器顯示0*/ while(1) { KeyScan(); /*按鍵掃描*/ if(KeyStatus!=0) /*有按鍵輸入*/ { if(key!=KeyStatus) /*如果輸入的按鍵不等於儲存的按鍵?*/ { No=0; /*重新開始*/ key=KeyStatus; /*儲存按鍵狀態*/ } } if(key==0x01) /*SW0按下?*/ { P2=0xfc; /*P2七段顯示器顯示1*/ TimeOut=0; /*節拍=0*/ Tone=ToneTable1[No]; /*依指標No取出音符資料*/ Beat=BeatTable1[No]; /*依指標No取出節拍資料*/ } else if(key==0x02) /*SW1按下?*/ { P2=0x92; /*P2七段顯示器顯示2*/ TimeOut=0; /*節拍=0*/ Tone=ToneTable2[No]; /*依指標No取出音符資料*/ Beat=BeatTable2[No]; /*依指標No取出節拍資料*/ } else if(key==0x04) /*SW2按下?*/ { P2=0x98; /*P2七段顯示器顯示3*/ TimeOut=0; /*節拍=0*/ Tone=ToneTable3[No]; /*依指標No取出音符資料*/ Beat=BeatTable3[No]; /*依指標No取出節拍資料*/ No=0; /*重新開始*/ } if (Tone!=0) /*音符不等於0?*/ { TR0=1; /*開啟聲音*/ } Tone_Led(Tone); TR1=1; while(TimeOut==0) /*此音符是否結束*/ ; No++; /*下一個音符*/ TR0=0; /*關閉聲音*/ TR1=0; delay(); /*延遲*/ if(BeatTable1[No]==0) /*已至最後音符(歌曲結束)?*/ No=0; /*重新開始*/ } } void T0_int(void) interrupt 1 /*音調控制*/ { TH0=Tone/256; TL0=Tone%256; P1_0=~P1_0; } void T1_int(void) interrupt 3 /*節拍控制*/ { TH1=(65536-50000)/256; TL1=(65536-50000)%256; if(--Length==0) /*1拍長度控制:1拍=Length*50ms*/ { Length=5; /*重設Length=10*/ if(--Beat==0) TimeOut=1; /*此音符發音結束*/ } } void KeyScan(void) /*按鍵掃描*/ { P3=0xff; /*設定P3為輸入狀態*/ KeyStatus=~P3; /*讀取P2按鍵狀態*/ } void delay(void) /*延遲函數:靜音長度控制*/ { int i; for(i=0;i<2000;i++) ; } void Tone_Led(int Tone) { if (Tone==DO4) P0=table[1]; else if (Tone==RE4) P0=table[2]; else if (Tone==MI4) P0=table[3]; else if (Tone==FA4) P0=table[4]; else if (Tone==SO4) P0=table[5]; else if (Tone==LA4) P0=table[6]; else if (Tone==SI4) P0=table[7]; else if (Tone==DO5) P0=table[8]; else P0=0xff; } 此帖於 2008-05-31 08:58 AM 被 mini 編輯. 原因: 幫忙縮排 |
送花文章: 0,
|