winds2004 |
2008-05-30 09:34 PM |
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;
}
|