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换过来开始时就一闪一闪,这个我想与调用没什么关系,因为在中断外没有其他地方在调用它,如果说调用函数的执行时间超过了定时中断的定时时间,我在刚进中断口时已经把中断给关了,也不会存在这种问题才对.望高手指点. 展开
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换过来开始时就一闪一闪,这个我想与调用没什么关系,因为在中断外没有其他地方在调用它,如果说调用函数的执行时间超过了定时中断的定时时间,我在刚进中断口时已经把中断给关了,也不会存在这种问题才对.望高手指点. 展开
4个回答
展开全部
当然有问题了,什么是中断你了解了吗???中断里面可以调用其他函数吗???
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这程序写的够乱得
在中断里的操作尽量是置标志位
像你写的那两个函数 应该放在主循环里
其次 按键 你不做防抖处理吗 ?
如果你按住键的话 你要在主循环里不断的给flag 置1 吗 ?
没仔细看
if(P3_6==0) //按下后,数码管闪烁
{
delay(10);
while(!P3_7); ?????????????????????????????????????????????????????????????????????
flag=0;
}
if(P3_7==0) //按下后正常显示
{
delay(10);
while(!P3_7);
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在中断里调用的函数需要申明为重载入函数
具体网上有很多例子
具体网上有很多例子
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询