求大神 看看 我这里哪个出错了??

想实现的功能是通过按键控制数码管显示数字,和喇叭发1~7个音节,但程序却不能使他发声····求大神检查······出现的问题是在不加声音时,键盘能正常被扫描,控制数码管显... 想实现的功能是通过按键控制数码管显示数字,和喇叭发1~7个音节,
但程序却不能使他发声····求大神检查······出现的问题是 在不加声音时,键盘能正常被扫描,控制数码管显示数字,,加上时钟后 不但不能发声 而且使键盘控制数码管 还出现了错误!!!

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS1 = P3^2;//数码管端口
sbit LED = P3^7;//led灯端口
sbit speak= P2^0;
uint t,num,i,a,temp;
uchar code tube[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管
uchar code Tab_Pl[7]={65058,65110,65157,65178,65217,65252,65285};//音节
void delay(uint x) //延迟
{
while(x--)
{
for(t=0;t<60;t++);
}
}

uchar key()//扫描按键
{
P1=0xdf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xde: return 1;
break;
case 0xdd: return 2;
break;
case 0xdb: return 3;
break;
case 0xd7: return 4;
break;
}
if(temp!=0xf0)
{
P1=0xdf;
temp=P1;
temp=temp&0x0f;
}
}

P1=0xbf;
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xbe: return 5;
break;
case 0xbd: return 6;
break;
case 0xbb: return 7;
break;

}
while(temp!=0xf0)
{
P1=0xbf;
temp=P1;
temp=temp&0x0f;
}
}
}
void display(uint aa)//判断按键 显示数码管数字
{
DS1=0;
P0=tube[aa];
delay(10);
DS1=1;

}
void music()//我感觉出错就在这//判断按键 实现发声
{
uchar a = key();

if(a==1|a==2|a==3|a==4|a==5|a==6|a==7)
{
display(key());
LED=0;
speak=0;
TMOD=0x01;
TH0=Tab_Pl[a]/256;
TL0=Tab_Pl[a]%256;
ET0=1;
TR0=1;
EA=1;

}
else
{
EA=0;
LED=1;
}
}

void main()
{

while(1)
{

music();

}

}
timer0()interrupt 1//中断程序
{
TH0=Tab_Pl[a]/256;
TL0=Tab_Pl[a]%256;
speak = ~speak ;
}
展开
 我来答
做而论道
高能答主

2013-07-27 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
……
uchar code Tab_Pl[7]={65058,65110,65157,65178,65217,65252,65285};//音节
//应为整型

uchar TH_0, TL_0; //加两个变量
//---------------------------------------------
uchar key()//扫描按键
{
……
……
return 0; //没有按键,返回0
}
//---------------------------------------------

void display(uint aa)//判断按键 显示数码管数字
{
DS1 = 0;
P0 = tube[aa];
delay(10);
DS1 = 1;
}
//---------------------------------------------
void main()
{
uchar a;

TMOD = 0x01;
ET0 = 1;
TR0 = 0;
EA = 1;

while(1) {

a = key(); //a=1~7, 0 代表松开

if(a > 0 && a < 8) {
TH_0 = Tab_Pl[a] / 256;
TL_0 = Tab_Pl[a] % 256;
TH0 = TH_0;
TL0 = TL_0;
TR0 = 1;

LED = 0;
display(a);

while(key() > 0); //等待释放,此期间发音
}
else {
TR0 = 0;
LED = 1;
}

// music();
}
//---------------------------------------------
}
timer0()interrupt 1//中断程序
{
TH0 = TH_0;
TL0 = TL_0;
speak = ~speak ;
}
//---------------------------------------------

试试看。
=========================
另外:if(a==1|a==2|a==3|a==4|a==5|a==6|a==7)
应为:if(a==1||a==2||a==3||a==4||a==5||a==6||a==7)
更多追问追答
追问
谢谢 大神!!!!问题基本上解决了···但只是按下的一瞬间发音,我想实现的是按键不松持续发音····还有能告诉我 我的错误在哪吗···
追答
上面的程序,应该就是:按键不松,就持续发音的。

……
TR0 = 1; //开始发音
LED = 0;
display(a);
while(key() > 0); //等待释放,此期间发音

//按键不松,就在这一行,不停的循环,此期间,应该连续发音。

}
……
敬醉巧05J
2013-07-27 · TA获得超过568个赞
知道小有建树答主
回答量:641
采纳率:0%
帮助的人:173万
展开全部
uchar a = key();

if(a==1|a==2|a==3|a==4|a==5|a==6|a==7)
{
display(key());
改成

uchar a;
EA=0;
a = key();
EA=1;

if(a==1|a==2|a==3|a==4|a==5|a==6|a==7)
{
display(a);
追问
谢谢 那么晚 还回答我的问题,能解释下 问什么这样做就能解决问题 还有我是怎么错的 万分感谢

今天板子 放在实验室了 明天去尝试一下 再次感谢
追答
你先去实验室试过了告诉我个结果呗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式