« PICのお勉強(23) C言語編 RB0/INT外部割り込み | トップページ | PICのお勉強(25) C言語編 7セグメントLEDを使ってみる »

2012年6月16日 (土)

PICのお勉強(24) C言語編 電子オルガン

20120616 PIC16F84Aを使って簡易電子オルガンを作ってみました。この本に載ってたやつのパクリですが(^^;)
ソースはこれ→lesson24.c
 RB0~RB7にタクトスイッチをつないでキーボードとし,RA0にスピーカーをつなぎました。
本来,RB0~RB7のスイッチにはプルアップ抵抗が必要ですが,16F84Aが持つプルアップ機能を有効にすることで外部につなぐ抵抗を省くことができます。これは便利(・∀・)
20120615 プルアップ機能を有効にするには,OPTIONレジスタのビット7を0にすればよいので, OPTION = 0x7F; と書いてやります。
 プログラムのメイン部分は,switch-case文で,RB0~RB7のスイッチが押されると,始めに定義したbuzzerという関数でスピーカーを鳴らしています。
 例えば「ド」の音は,255μs間スピーカーをONにし,255μs間OFFにして,周期510μsの音を作っています。この周期が長いと低い音,短いと高い音となるわけです。

/************************************
16F84A  HI-TECH C v.9.83
電子オルガン
************************************/

#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 10000000 //10MHz
__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

void buzzer_(unsigned short int t)
{
unsigned short int i;
PORTA = 0x01; //RA0をON
for (i = 0; i < t; i++)
__delay_us(1);
PORTA = 0x00; //RA0をOFF
for (i = 0; i < t; i++)
__delay_us(1);
}

void main(void)
{
TRISA = 0x00; //RA0~RA4は出力
TRISB = 0xFF; //RB0~RB7は入力
OPTION = 0x7F; //プルアップ有効
PORTA = 0x00;
PORTB = 0xFF;

while (1)
{
switch (PORTB)
{
case 0xFE : buzzer_(255); break; //ド
case 0xFD : buzzer_(226); break; //レ
case 0xFB : buzzer_(201); break; //ミ
case 0xF7 : buzzer_(191); break; //ファ
case 0xEF : buzzer_(170); break; //ソ
case 0xDF : buzzer_(151); break; //ラ
case 0xBF : buzzer_(134); break; //シ
case 0x7F : buzzer_(127); break; //ド
default : break;
}
}
}

|

« PICのお勉強(23) C言語編 RB0/INT外部割り込み | トップページ | PICのお勉強(25) C言語編 7セグメントLEDを使ってみる »

PICマイコン」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/26930/54973586

この記事へのトラックバック一覧です: PICのお勉強(24) C言語編 電子オルガン:

« PICのお勉強(23) C言語編 RB0/INT外部割り込み | トップページ | PICのお勉強(25) C言語編 7セグメントLEDを使ってみる »