#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp;
uchar key;
uchar i,j;
uchar STH0;
uchar STL0;
sbit beer=P1^0;
sbit P34=P3^4;sbit P35=P3^5;
sbit P36=P3^6;sbit P37=P3^7;
uint code tab[]={64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178}; //音符表
/**********************主函数*******************/
void main(void)
{
TMOD=0x01; //设置定时器为工作方式1,16位定时/计数器模式
ET0=1; //打开定时器0
EA=1; //允许所有中断
while(1)
{
P3=0xff;
P34=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=0;break;
case 0x0d: key=1;break;
case 0x0b: key=2;break;
case 0x07: key=3;break;
}
temp=P3;
beer=~beer;
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1; //开定时器0
temp=temp&0x0f;
while(temp!=0x0f)
{temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
P3=0xff;
P35=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;
beer=~beer;
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1; //开定时器0
temp=temp&0x0f;
while(temp!=0x0f)
{temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
P3=0xff;
P36=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;
beer=~beer;
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1; //开定时器0
temp=temp&0x0f;
while(temp!=0x0f)
{temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
P3=0xff;
P37=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;
beer=~beer;
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1; //开定时器0
temp=temp&0x0f;
while(temp!=0x0f)
{temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
}
}
/*****************定时器T0中断服务函数*********************/
void to(void) interrupt 1 using 0
{
TH0=STH0;TL0=STL0;
beer=~beer;//产生方波
}