51单片机C语言写的数码管显示哪里出问题了?

我的目的就是想用两个按钮来控制四位数码管闪烁和正常显示,可下面程序我按P3.6它就是不闪,但能正常显示,问题该是出在哪里呢?C程序如下:#include"at89x51.... 我的目的就是想用两个按钮来控制四位数码管闪烁和正常显示,可下面程序我按P3.6它就是不闪,但能正常显示,问题该是出在哪里呢?

C程序如下:
#include"at89x51.h"
#define uchar unsigned char
#define uint unsigned int

uint temp;
uchar qian,bai,shi,ge;
uchar display_buf[3];
uint addate[7];
uint ad_team;
uchar flag;
uchar code dis1[] = { 0x28, 0x7E, 0xA2, //数码管显示代码
0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff};

void flash_display();
/*****************************/
void delay(uint ms)
// 延时1MS
{
uchar i;
while(ms--)
for(i=0;i<125;i++);
}
/*****************************/
/* display */
/*****************************/
void display()
//正常显示
{
qian=temp/1000; //2
bai=(temp-qian*1000)/100;
shi=(temp-qian*1000-bai*100)/10;
ge=temp-qian*1000-bai*100-shi*10;

display_buf[0]=dis1[qian];
display_buf[1]=dis1[bai];
display_buf[2]=dis1[shi];
display_buf[3]=dis1[ge];

P1=display_buf[0];
P2_0=0;
delay(2);
P2_0=1;

P1=display_buf[1];
P2_1=0;
delay(2);
P2_1=1;

P1=display_buf[2];
P2_2=0;
delay(2);
P2_2=1;

P1=display_buf[3];
P2_3=0;
delay(2);
P2_3=1;
}
/********************************/
void flash_display()
//数码管闪烁
{
uchar i;
qian=temp/1000; //2
bai=(temp-qian*1000)/100;
shi=(temp-qian*1000-bai*100)/10;
ge=temp-qian*1000-bai*100-shi*10;

display_buf[0]=dis1[qian];
display_buf[1]=dis1[bai];
display_buf[2]=dis1[shi];
display_buf[3]=dis1[ge];

for(i=0;i<50;i++)
{
P1=display_buf[0];
P2_0=0;
delay(2);
P2_0=1;

P1=display_buf[1];
P2_1=0;
delay(2);
P2_1=1;

P1=display_buf[2];
P2_2=0;
delay(2);
P2_2=1;

P1=display_buf[3];
P2_3=0;
delay(2);
P2_3=1;
}
P1=0xff; //关显示
P2=0xff;
delay(250); //延时,形成闪烁效果
delay(250);
delay(250);
}
/**********************************/
main()
//主函数
{
temp=1256; //显示数字
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
EA=1; //开总中断
ET0=1;
TR0=1;
P0=0xff;
flag=1;
while(1)
{
if(P3_6==0) //按下后,数码管闪烁
{
delay(10);
while(!P3_7);
flag=0;
}
if(P3_7==0) //按下后正常显示
{
delay(10);
while(!P3_7);
flag=1;
}
}
}
/************************************/
void timer0() interrupt 1
//定时中断用作显示
{
ET0=0;
TH0=0xd8; //10MS
TL0=0xf0;
display(); //正常显示
if(flag==0)
{
do
{
flash_display(); //数码管显闪烁
}
while(flag==0); //flag等于1时才正常显示
}
ET0=1;
}
但是我调用display能正常显示,我把中断函数里的display跟flash_display换过来开始时就一闪一闪,这个我想与调用没什么关系,因为在中断外没有其他地方在调用它,如果说调用函数的执行时间超过了定时中断的定时时间,我在刚进中断口时已经把中断给关了,也不会存在这种问题才对.望高手指点.
展开
 我来答
up_ella
2008-10-24
知道答主
回答量:32
采纳率:0%
帮助的人:0
展开全部
f(P3_6==0) //按下后,数码管闪烁
{
delay(10);
while(!P3_7);
flag=0;
}

这个地方你是不是写错了?应该是查询while(!P3_6);吧?
另外,你在中断里面等待flag==1是不行的,因为你采用查询方式,而且是在主程序里面查询,因此,在中断里面等待是不行的,程序可能会在这个地方进入死循环
我是若无情
2008-10-24 · 超过23用户采纳过TA的回答
知道答主
回答量:203
采纳率:0%
帮助的人:86.4万
展开全部
当然有问题了,什么是中断你了解了吗???中断里面可以调用其他函数吗???
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
上了北航
2008-10-24 · TA获得超过1010个赞
知道小有建树答主
回答量:583
采纳率:0%
帮助的人:418万
展开全部
这程序写的够乱得
在中断里的操作尽量是置标志位
像你写的那两个函数 应该放在主循环里

其次 按键 你不做防抖处理吗 ?
如果你按住键的话 你要在主循环里不断的给flag 置1 吗 ?
没仔细看

if(P3_6==0) //按下后,数码管闪烁
{
delay(10);
while(!P3_7); ?????????????????????????????????????????????????????????????????????
flag=0;
}
if(P3_7==0) //按下后正常显示
{
delay(10);
while(!P3_7);
flag=1;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wjjsuda
2008-10-24 · TA获得超过422个赞
知道小有建树答主
回答量:966
采纳率:0%
帮助的人:361万
展开全部
在中断里调用的函数需要申明为重载入函数
具体网上有很多例子
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式