|
//-------------------------------------------------
//名稱:可演奏的電子琴
//-------------------------------------------------
//說明:矩陣鍵盤模擬演奏電子琴,數碼管顯示按鍵號
//-------------------------------------------------
#include<reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//共陽數碼管編碼
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
//0123456789ABCDEF
uint code music[]={64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65085,65110,65157,65178};
//音符 頻率HZ 簡譜(T值)
//低 3 M 330 64021
//低 4 FA 349 64103
//低 5 SO 392 64260
//低 6 LA 440 64400
//低 7 SI 494 64524
//中 1 DO 523 64580
//中 2 RE 587 64684
//中 3 M 659 64777
//中 4 FA 698 64820
//中 5 SO 784 64898
//中 6 LA 880 64968
//中 7 SI 988 65030
//高 1 DO 1046 65058
//高 2 RE 1175 65110
//高 3 M 1318 65157
//高 4 FA 1397 65178
sbit BEEP = P2^1; //蜂鳴器
uchar KeyNO; //按鍵序號
//-----------------------------------------------------------------------
//延時
//-------------------------------------------------------------------------
void delayms(unsigned int t)//延時1ms程序
{
unsigned int i,j;
for(i=0;i<t;i++)//循環語句
for(j=0;j<120;j++)//循環語句
;
}
//鍵盤矩陣掃描子程序
void Keys_Scan()
{ uchar Tmp,key;
//高四位置0,放入四行
P1 = 0x0f; //P1輸出0x0f
delayms(1); //延時1ms
Tmp = P1 ^ 0x0f;//讀取P1
switch(Tmp)
{
case 1: key = 0; break;//鍵值為0
case 2: key = 1; break;//鍵值為1
case 4: key = 2; break;//鍵值為2
case 8: key = 3; break;//鍵值為3
default: return; //無鍵按下
}
P1 = 0xf0; //P1輸出0xF0
delayms(1); //延時1ms
Tmp = P1 >> 4 ^ 0x0f;//讀取P1
switch(Tmp)
{
case 1: key += 0; break;//鍵值+0
case 2: key += 4; break;//鍵值+4
case 4: key += 8; break;//鍵值+8
case 8: key += 12;break;//鍵值+12
default: return;//無鍵按下
}
KeyNO=key; //獲取鍵值
}
//--------------key---------------------------------------
void Play_Tone() interrupt 1
{
TH0 = music[KeyNO]/256; //不同的按鍵 產生不同的頻率聲音
TL0 = music[KeyNO]%256; //不同的按鍵 產生不同的頻率聲音
BEEP=~BEEP; //蜂鳴器取反,輸出音樂
}
void main()
{ P0 = 0xBF; //初始顯示'-'
TMOD=0x01; //設置定時器0 16定時模式
IE=0x82; //開中斷
while(1)
{
P1=0xF0; //輸出
if(P1!=0xF0) //有鍵按下
{
Keys_Scan(); //掃描鍵盤
P0= tab[KeyNO]; //顯示按鍵
TR0=1; //啟動定時器,根據按鍵發音
}
else
{
TR0=0;
} //關定時器 停止播放
delayms(2); //延時2ms
}
}
|
|