史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2008-05-30, 09:34 PM   #1
winds2004
註冊會員
榮譽勳章

勳章總數
UID - 301820
在線等級: 級別:0 | 在線時長:0小時 | 升級還需:5小時
註冊日期: 2008-05-29
文章: 2
精華: 0
現金: 2 金幣
資產: 2 金幣
Thumbs down 討論 - 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 編輯. 原因: 幫忙縮排
winds2004 目前離線  
送花文章: 0, 收花文章: 0 篇, 收花: 0 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 06:37 AM


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


SEO by vBSEO 3.6.1