SP1

SP1は、スピーカーを用いて音を鳴らすプログラムである。この場を用いて、作成して下さった先輩に感謝。
タイマVを用いてパルス波を発生させ、GRAの値を変えて周波数を変化させることにより、音程を変化させる。

#define LEDCR IO.PCR8
#define LED IO.PDR8.BYTE
#define SWCR IO.PCR1
#define SW IO.PDR1.BYTE
#define SPCR IO.PCR7
#define SP IO.PDR7.BIT.B6

#include <3694.h>

void io_Init();
void timerv_init();
void menu_main();
void wait(unsigned long); 

void all_emit();
void all_flash();
void up_count();
void down_count();
void music0();
void music1();
void soundTest();

void oto(char m,int x);
long z=300000; //基準となる4分音符の長さ(←可変) 

int main(){
 	io_Init(); 
	while(1){
  		menu_main();
	}
	return 0;
}

void wait(unsigned long n){
  while(n--);
}

void io_Init(){
  LEDCR=0xff; //LED
  SWCR=0x00; //Switch
  SPCR=0x40; //Speaker
}

void menu_main(){
  unsigned int m=1;
  while(SW&0x40){
    LED=~m;
    if(!(SW&0x10)){
      if(m<6){
        m++;
        wait(100000);
      }
    }
    if(!(SW&0x20)){
      if(m>1){
        m--;
        wait(100000);
      }
    }
  }
  while(!(SW&0x40)){}
  wait(30000);

  
  switch(m){
    case 1: all_emit();
    case 2: all_flash();
    case 3: up_count();
    case 4: down_count();
    case 5: music0();
    case 6: music1();
    default:  soundTest();
  }
  wait(60000);
} 

void all_emit(){
  while(SW&0x40){
    LED=0x00;
  }
}
void all_flash(){
  while(SW&0x40){
    LED=0x00;
    wait(40000);
    LED=0xff;
    wait(40000);
  }
}
void up_count(){
  unsigned int n=0;
  while(n<0xff){
    LED=~n;
    wait(40000);
    n++;
  }
}
void down_count(){
  unsigned int n=0xff;
  while(n>0){
    LED=~n;
    wait(40000);
    n--;
  }
}

void timerv_init(){
  TV.TCRV0.BYTE|=0x08;  //コンペアマッチAでカウンタクリア
  TV.TCSRV.BYTE|=0x13;  //トグル出力
}

void music0(){
  timerv_init();
  while(1){ //この動作を無限に繰り返す 
    /*---------説明------------- 
    oto('音の高さ',音の長さ) 
    音の高さ 必ずクオーテーション(')で囲むこと! 
    c=ド,d=レ,e=ミ,f=ファ,g=ソ,a=ラ,b=シ,j=ド(オクターブ上) 
    音の長さ 
    4分音符を基準に。 
    注、休符は'k' 
    --------------------------*/ 
    //以下、楽譜(どんどんいじって自分の曲を演奏させてください) 
    //tic=0; 
    int g[44][2]={ //ここで、全部で何音か記述しとかないとダメみたい 
      {'c',8},{'d',8},{'e',8},{'f',8}, 
      {'e',8},{'d',8},{'c',8},{'k',8}, 
      {'e',8},{'f',8},{'g',8},{'a',8}, 
      {'g',8},{'f',8},{'e',8},{'k',8}, 
      {'c',8},       {'k',8},
      {'c',8},       {'k',8},
      {'c',8},       {'k',8}, 
      {'c',8},       {'k',8}, 
      {'c',16},      {'k',32}, 
      {'c',16},      {'k',32}, 
      {'d',16},      {'k',32}, 
      {'d',16},      {'k',32}, 
      {'e',16},      {'k',32}, 
      {'e',16},      {'k',32}, 
      {'f',16},      {'k',32}, 
      {'f',16},      {'k',32}, 
      {'e',4},{'d',4},{'c',4},{'k',8} 
    };  

    int o; 
    for(o=0;o<44;o++){ 
      oto(g[o][0],g[o][1]);
    }
    DI; //割り込み終了 
  }
} 

void music1(){
  timerv_init();
  while(1){ //この動作を無限に繰り返す 
    int g[78][2]={ //ここで、全部で何音か記述しとかないとダメみたい 
      {'f',8},{'k',16},{'f',16},{'k',32},{'f',8},{'k',16},
     {'f',16},{'k',32},{'f',8},{'k',16},{'f',16},{'k',32},
     {'f',8},{'k',16},{'f',16},{'k',32}, //16
     {'g',8},{'k',16},{'f',16},{'k',32},{'e',8},{'k',16},
     {'d',16},{'k',32},{'c',4},{'k',4}, //10
     {'f',8},{'k',16},{'f',16},{'k',32},{'f',4},{'k',16}, //6
     {'f',8},{'k',16},{'f',16},{'k',32},{'f',4},{'k',16}, //6
     {'a',8},{'k',16},{'f',16},{'k',32},{'g',8},{'k',16},
     {'e',16},{'k',32}, {'f',4},{'k',16}, //10
     {'f',8},{'k',16},{'f',16},{'k',32}, {'d',2},{'k',16}, //6
     {'f',8},{'k',16},{'f',16},{'k',32}, {'c',2},{'k',8}, //6
     {'c',8},{'k',16},{'d',16},{'k',32},{'d',8},{'k',16},
     {'d',16},{'k',32}, {'d',8},{'k',16},{'d',16},{'k',16},
     {'e',8},{'k',16},{'f',16},{'k',32},{'g',2},{'k',1}, //18
    }; 
   
    int o; 
    for(o=0;o<78;o++){ 
      oto(g[o][0],g[o][1]);
    }
    DI; //割り込み終了 
  }
}

void oto(char m,int x){ //音関数(音の高さ,音の長さ) 
  switch(m){ 
    case 'c': TV.TCORA=149; LED=~0x01;break; 
    case 'd': TV.TCORA=133; LED=~0x02;break; 
    case 'e': TV.TCORA=119; LED=~0x04;break; 
    case 'f': TV.TCORA=112; LED=~0x08;break; 
    case 'g': TV.TCORA=100; LED=~0x10;break; 
    case 'a': TV.TCORA=89; LED=~0x20;break; 
    case 'b': TV.TCORA=79; LED=~0x40;break; 
    case 'j': TV.TCORA=75; LED=~0x80;break; 
    case 'k': LED=~0x00;break; 
  }
  if(m!='k'){ //休符以外の処理 
    EI; //割り込み許可
    TV.TCRV0.BYTE|=0x03;  //カウンタスタート周期Φ/64
  } 
  unsigned long temp;
  temp=z*4/x; //基準音から音の長さを決める 
  while(temp>0)temp--; //wait文。音の長さを決めてる 
  TV.TCRV0.BYTE&=~0x03; //カウンタストップ
  DI; //割り込み終了 
} 

void soundTest(){
  while(1){
    SP=1;
    wait(200);
    SP=0;
    wait(200);
  }
} 

・プログラムの解説
要望があったら作成予定

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2008年04月29日 00:54
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。