谁能解答这个奇怪的问题?
时间:10-02
整理:3721RD
点击:
用protues仿真,第一天可以实现部分功能,第二天调试时原可以实现的功能都不行了,非常奇怪?还有P2口始终全为高电平,是不是延时太短,分辨不来?但是把延时调长,也不行?为什么?
#include <reg51.h>
char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf} ;
sbit k1=P3^2;
sbit k2=P3^3;
char sec100,min,sec,hour;
void delay(int k)
{
int m,n;
for(m=0;m<k;m++)
{for(n=0;n<120;n++) ; }
}
char buffer[8];
void dsy_handle()
{
buffer[7]=hour/10;
buffer[6]=hour%10;
buffer[5]=16;
buffer[4]=min/10;
buffer[3]=min%10;
buffer[2]=16;
buffer[1]=sec/10;
buffer[0]=sec%10;
}
char display()
{
P2=0x80;
P0=tab[buffer[0]];
delay(5);
P2=0x40;
P0=tab[buffer[1]];
delay(5);
P2=0x20;
P0=tab[buffer[2]];
delay(5);
P2=0x10;
P0=tab[buffer[3]];
delay(5);
P2=0x08;
P0=tab[buffer[4]];
delay(5);
P2=0x04;
P0=tab[buffer[5]];
delay(5);
P2=0x02;
P0=tab[buffer[6]];
delay(5);
if(hour>9)
{
P2=0x01;
}
else
{
P2=0x00;
}
P0=tab[buffer[7]];
delay(2);
}
void INC_hour()
{
hour++;
if(hour>23)
{hour=0;}
}
void INC_min()
{
min++;
if(min>59)
{min=0;
INC_hour();
}
}
void INC_sec()
{
sec++;
if(sec>59)
{sec=0;
INC_min();}
}
void int0 () interrupt 0
{
delay(150);
if(INT0==0)
{INC_hour();}
}
void int1 () interrupt 2
{
delay(150);
if(INT1==0)
{INC_min(); }
}
void time0() interrupt 1
{
TH0=0xDC;
TL0=0x00;
sec100++;
if(sec100>=100)
{sec100=0;
INC_sec();}
}
void init ()
{
TMOD=0x01;
TH0=0xDC;
TL0=0x00;
TR0=1;
ET0=1;
IT0=0;
EX0=1;
EX1=1;
IT1=0;
EA=1;
}
void main ()
{
init ();
P0=0xff;
P2=0x00;
hour=9;
min=58;
sec=0;
sec100=0;
while (1)
{
dsy_handle();
display();
}
}
![](../imgqa/ele/mcu/mcu-3721rd.com-3966853zup3perfc.jpg)