在数码管动态显示中,延时时间长了数码管不能正确显示,咋回事呢?
程序如下:
/*******************-*******************
数码管显示1
2012年5月12日
**************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code d1[] = {0xf9,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0}; //字码0-7 数码管共阳
uchar code d2[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/********************************************************/
void delay(void) //延时
{
uchar i,j;
for(i = 0 ; i < 1; i++)
for(j = 0 ; j < 600 ; j++); //时间调短,可以显示出0-7,如果长了就能显示一个了(现在就只有一个数码管显示)
}
/*****************************************************/
void main()
{
uchar i;
P0 = 0xff;
P2 = 0xff;
while(1)
{
for(i = 0 ; i < 8 ; i++) //循环点亮
{
P0 = d1;
P2 = d2;
delay();
P0=0xff;
}
}
}
当延时时间长了就不能正确显示:0-7了,只有一个数码管亮,不知道是咋回事。求好心人给帮忙看看,谢谢。
//////////////////////////////////////////////////////////////////////////
//程序功能:万年历显示
//晶振大小:6MHZ
//////////////////////////////////////////////////////////////////////////
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit start_test = P3^0;
sbit start_add = P3^1;
sbit w0 = P1^0;
sbit w1 = P1^1;
sbit w2 = P1^2;
sbit w3 = P1^3;
sbit w4 = P1^4;
sbit c0 = P2^0;
sbit c1 = P2^1;
uint year,month,day,hour,min,sec,time,ge,shi,bai,qian,s_year,s_day,s_time,c_time,m_once,m_time;
uchar code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
///////////////////////P1延时函数/////////////////////////////////////////
void delay()
{
uint x = 0;
for(x=0;x<500;x++);
}
/////////////////////////数据处理/////////////////////////////////////////
void chuli()
{
if(sec%12 < 4)
{
qian=hour/10;
bai=hour%10;
shi=min/10;
ge=min%10;
}
else if(sec%12 < 8)
{
qian=year/1000;
bai=year/100%10;
shi=year%100/10;
ge=year%10;
}
else
{
qian=month/10;
bai=month%10;
shi=day/10;
ge=day%10;
}
}
/////////////////////////消影处理/////////////////////////////////////////////
void xiaoyin()
{
delay();
}
/////////////////////////显示函数/////////////////////////////////////////////
void display()
{
/////////ge///////////////
w0 = 1; w1 = 1; w2 = 1;w3 = 1;
P0=tab[ge];
w0 = 0; w1 = 1; w2 = 1;w3 = 1;
xiaoyin();
/////////shi//////////////
w0 = 1; w1 = 1; w2 = 1;w3 = 1;
P0=tab[shi];
w0 = 1; w1 = 0; w2 = 1;w3 = 1;
//bit_select = bit_select << 1 + 1;
xiaoyin();
/////////bai//////////////
w0 = 1; w1 = 1; w2 = 1;w3 = 1;
P0=tab[bai];
w0 = 1; w1 = 1; w2 = 0;w3 = 1;
xiaoyin();
/////////qian/////////////
w0 = 1; w1 = 1; w2 = 1;w3 = 1;
P0=tab[qian];
w0 = 1; w1 = 1; w2 = 1;w3 = 0;
xiaoyin();
w0 = 1; w1 = 1; w2 = 1;w3 = 1;
}
//////////////////////////中断定时////////////////////////////////////////////
void timer0() interrupt 1
{
TH0=(65536-50000)>>8;
TL0=65536-50000;
time ++;
s_time++;
c_time++;
m_time++;
}
//////////////////////////判断闰年////////////////////////////////////////////
int leap (int year)
{
if(year%4==0&&year%100!=0||year%400==0)
return 1;
else
return 0;
}
///////////////////////////判断月//////////////////////////////////////////////
void days_month ()
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
s_day = 31;
if(month==4||month==6||month==9||month==11)
s_day = 30;
if(month==2&&leap(year)==1)
s_day = 29;
else
s_day = 28;
}
///////////////////////////计算日月年///////////////////////////////////////////
void s_date()
{
days_month();
if (month == 12&&day == s_day)
{
month = 0;
year++;
if (day == s_day&&hour == 24)
{
day = 0;
month++;
}
}
}
//////////////////////////gai///////////////////////////////////////////////////
void date_display()
{
if(c1==0 && c_time <1)
{
c_time = 0;
if(c0 == 0)
{
day++;
}
}
if(c1==0 && c_time <4)
{
c_time = 0;
if(c0 == 0)
{
month++;
}
}
if(c1==0 && c_time >4)
{
c_time = 0;
if(c0 == 0)
{
year++;
}
}
}
//////////////////////////主函数////////////////////////////////////////////////
void main()
{
m_time = 0;
m_once = 0;
ge = 0;
shi = 0;
sec = 0;
min = 0;
hour = 0;
time = 0;
s_time = 0;
c_time = 0;
day = 18;
month = 05;
year = 2012;
//////////////中断定时初始化////////////////
TMOD=0x01;
TH0=(65536-50000)>>8;
TL0=65536-50000;
EA=1;
ET0=1;
TR0=1;
///////////////////////////////////////////
while(1)
{
if(start_test == 0)
{
while (m_once < 5)
{
if(time==10)
{
time = 0;
m_once++;
}
if(start_add == 0)
{
m_time = 0;
if(m_time <10)
{
hour++;
}
}
}
}
if(c1 == 0)
{
date_display();
}
else
{
display();
}
if(s_time ==5)
{
s_time = 0;
w4 = ~w4;
}
if(time==10)
{
time = 0;
sec++;
if (sec == 60)
{
sec = 0;
min++;
if (min == 60)
{
min = 0;
hour++;
if (hour == 24)
{
hour = 0;
day++;
}
}
}
chuli();
s_date();
}
}
}
这个看下啊,可以显示年,月,日,小时,分钟
你做的是静态显示吧 动态显示不需要定义两个参数表 d1和d2给你显示静态和动态0——99的例子你可以看下
#include<reg52.h>
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x6d,0x7d,0x07,0x7f,0x6f};
sbit sw2=P1^0;
voide delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{ uchar i=j=0;
while(1){
p0=table;
p0=table[j];
if(sw2==0)
{
delay(10);
while(!sw2);
j++;
if(j>9)
{
j=0;
i++;
if(i>9)
{
i=0;
j=0;
}
}
}
}
}
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |