你好,想问一个关于单片机键盘扫描的问题,我做一个单片机电子琴,下面是我的程序,不知道哪里错了???

#include <reg52.h>
uchar code music_pu[]={64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217};
sbit music=P2^3;
uint i,j,count2;
uchar temp,sth0,stl0,key;
//*******中断名称:time0
//*******功能:实现蜂鸣器的输出,谱出曲调
void time0() interrupt 1 using 2
{
TH0=sth0;
TL0=stl0;
music=~music;
}
//*******子程序名称:void dislay
//*******功能:延时,检查按键是否有效
void dislay()
{
uint ii,jj;
for (ii=25;ii>0;ii--)
{
for(jj=200;jj>0;jj--);
}
}
//*******子程序名称:void keybord_scan
//*******功能:对键盘按键进行扫描
void keybord_scan()
{
P3=0xfe; //第一行扫描
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
dislay();
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xde:
key=1; break;
case 0xee:
key=2;break;
case 0xbe:
key=3; break;
case 0x7e:
key=4; break;
}
return1();
// music=~music;
P0=led_music[key];
sth0=music_pu[key]/256;
stl0=music_pu[key]%256;
TR0=1;
}
else
TR0=0;
}
P3=0xfd; //第二行扫描
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
dislay();
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xdd:
key=5; break;
case 0xed:
key=6;break;
case 0xbd:
key=7; break;
case 0x7d:
key=8; break;
}
return1();
// music=~music;
P0=led_music[key];
sth0=music_pu[key]/256;
stl0=music_pu[key]%256;
TR0=1;
}
else
TR0=0;
}

P3=0xf7; //第三行扫描
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
dislay();
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xd7:
key=9; break;
case 0xe7:
key=10;break;
case 0xb7:
key=11; break;
case 0x77:
key=12; break;
}
return1();
// music=~music;
P0=led_music[key];
sth0=music_pu[key]/256;
stl0=music_pu[key]%256;
TR0=1;
}
else TR0=0;
}
P3=0xfb; //第四行扫描
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
dislay();
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xdb:
return_pu(); break;
case 0xeb:
music_box2;break;
case 0xbb:
next_music;break;
}}
}
P0=led_music[key];
}
//*********主函数
//*********功能:主函数,实现对各个子程序的统一控制
void main()
{
count2=1;
TMOD=0x01;
TH0=0;
TL0=0;
EA=1;
ET0=1;
key=0;
music=1;
while(1)
{

TR0=0;
keybord_scan();
}
}

uchar code music_pu[]={64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217};
可以把里面的音符数每一个间用逗号隔开,延时适当调整一下,再试试看
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-30
请问是编译有错,还是电子琴没实现功能,键盘扫描没什么问题追问

编译没错,电子琴出现的音与我设的音不一样,并且一直叫,一点也不像音调

相似回答