史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   C語言音樂程式 疑問 (http://forum.slime.com.tw/thread230573.html)

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;
}



所有時間均為台北時間。現在的時間是 10:02 AM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1