#include?<AT89X51.H>
unsigned?char?temp;
unsigned?char?key;
unsigned?char?i,j;
unsigned?char?STH0;
unsigned?char?STL0;
unsigned?int?code?tab[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178};
void?main(void)
{
TMOD=0x01;
ET0=1;
EA=1;
while(1)
{
P3=0xff;?//將P3口取出
P3_4=0;//使P3_4為低電平,這樣可以判斷第壹豎排有沒有鍵按下
temp=P3;
temp=temp?&?0x0f;?
if?(temp!=0x0f)//有鍵按下
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);//延時
temp=P3;
temp=temp?&?0x0f;
if?(temp!=0x0f)//再判斷是否有鍵按下
{
temp=P3;
temp=temp?&?0x0f;
switch(temp)//判斷是哪個鍵按下
{
case?0x0e:
key=0;
break;
case?0x0d:
key=1;
break;
case?0x0b:
key=2;
break;
case?0x07:
key=3;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;?//找出鍵對應的頻率的時間,作為定時器中斷初始值
STL0=tab[key]%256;
TR0=1;
temp=temp?&?0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp?&?0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_5=0;?//跟上面差不多,現在是判斷第二排的按鍵
temp=P3;
temp=temp?&?0x0f;
if?(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp?&?0x0f;
if?(temp!=0x0f)
{
temp=P3;
temp=temp?&?0x0f;
switch(temp)
{
case?0x0e:
key=4;
break;
case?0x0d:
key=5;
break;
case?0x0b:
key=6;
break;
case?0x07:
key=7;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp?&?0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp?&?0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp?&?0x0f;
if?(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp?&?0x0f;
if?(temp!=0x0f)
{
temp=P3;
temp=temp?&?0x0f;
switch(temp)
{
case?0x0e:
key=8;
break;
case?0x0d:
key=9;
break;
case?0x0b:
key=10;
break;
case?0x07:
key=11;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp?&?0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp?&?0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp?&?0x0f;
if?(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp?&?0x0f;
if?(temp!=0x0f)
{
temp=P3;
temp=temp?&?0x0f;
switch(temp)
{
case?0x0e:
key=12;
break;
case?0x0d:
key=13;
break;
case?0x0b:
key=14;
break;
case?0x07:
key=15;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp?&?0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp?&?0x0f;
}
TR0=0;
}
}
}
}
void?t0(void)?interrupt?1?using?0
{
TH0=STH0;
TL0=STL0;
P1_0=~P1_0;
}
妳自己看下程序吧,我也不願意註釋。?這個是能發出16個音符聲音的