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

来源:百度知道 编辑:UC知道 时间:2024/05/23 19:25:35
我的目的就是想用两个按钮来控制四位数码管闪烁和正常显示,可下面程序我按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];

f(P3_6==0) //按下后,数码管闪烁
{
delay(10);
while(!P3_7);
flag=0;
}

这个地方你是不是写错了?应该是查询while(!P3_6);吧?
另外,你在中断里面等待flag==1是不行的,因为你采用查询方式,而且是在主程序里面查询,因此,在中断里面等待是不行的,程序可能会在这个地方进入死循环

当然有问题了,什么是中断你了解了吗???中断里面可以调用其他函数吗???

这程序写的够乱得
在中断里的操作尽量是置标志位
像你写的那两个函数 应该放在主循环里

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

if(P3_6==0) //按下后,数码管闪烁
{
delay(10);
while(!P3_7); ?????????????????????????????????????????????????????????????????????
flag=0;
}
if(P3_7==0) //按下后正常显示
{
delay(10);
while(!P3_7);
flag=1;
}

在中断里调用的函数需要申明为重载入函数
具体网上有很多例子