这种低级错误都能犯,悲哀啊。。。
time* t;
get_time(t);
t是个指针,指向未知的内存空间。连数据放在哪都不知道那还写什么程序?前面的代码还用看吗?
time t;
get_time(&t);
这么简单的东西连猪都知道。好好记 ...
sdpz 发表于 2011-4-5 20:41
感谢你的指导,我的程序能用了。不过我发现了一个很奇怪的现象,不知能否解释下?是不是uchar类型数据和uint数据的区别?
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit led1=P0^4;
sbit led2=P0^5;
sbit rst=P2^0;
sbit sclk=P2^1;
sbit io=P2^2;
void delay(uint m)
{
uint i,j;
for(i=m;i>0;i--)
for(j=110;j>0;j--);
}
void display(uint num)
{
uchar ge,shi;
shi=num/10;
ge=num%10;
P0=ge;
led1=1;
led2=0;
delay(10);
led2=1;
P0=shi;
led1=0;
delay(10);
led1=1;
}
typedef struct _time{
uchar sec;
uchar min;
uchar hour;
uchar day;
uchar mon;
uchar year;
}time;
void wr_byte(uchar d)
{
uchar i; //(把这里改为uint i,显示就不正常了。)
ACC=d;
for(i=8;i>0;i--)
{
io=ACC0;
sclk=1;
sclk=0;
ACC=ACC>>1;
io=1;
}
}
uchar rd_byte(void)
{
uchar i; //(这里和上面的现象一样)
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=io;
sclk=1;
sclk=0;
io=1;
}
return(ACC);
}
void write(uchar aadd,uchar adat)
{
rst=0;
sclk=0;
rst=1;
wr_byte(aadd);
wr_byte(adat);
sclk=1;
rst=0;
}
uchar read(uchar aadd)
{
uchar cdat;
rst=0;
sclk=0;
rst=1;
wr_byte(aadd);
cdat=rd_byte();
sclk=1;
rst=0;
return(cdat);
}
void set_time(uchar aadd,uchar val)
{
write(0x8e,0x00);
write(aadd,((val/10)<<4|(val%10)));
}
void get_time(time *tim)
{
uchar rd_dat;
rd_dat=read(0x81);
tim->sec=((rd_dat&0x70)>>4)*10 + (rd_dat&0x0F);
rd_dat=read(0x83);
tim->min=((rd_dat&0x70)>>4)*10 + (rd_dat&0x0F);
rd_dat=read(0x85);
tim->hour=((rd_dat&0x70)>>4)*10 + (rd_dat&0x0F);
rd_dat=read(0x87);
tim->day=((rd_dat&0x70)>>4)*10 + (rd_dat&0x0F);
rd_dat=read(0x89);
tim->mon=((rd_dat&0x70)>>4)*10 + (rd_dat&0x0F);
rd_dat=read(0x8d);
tim->year=((rd_dat&0x70)>>4)*10 + (rd_dat&0x0F);
}
void init(void)
{
uchar sec;
sec=read(0x80);
if(sec&0x80)
set_time(0x80,0);
set_time(0x80,30);
set_time(0x82,59);
set_time(0x84,23);
set_time(0x86,26);
set_time(0x88,5);
set_time(0x8C,7);
}
void main()
{
time t;
init();
get_time(&t);
while(1)
{
display(t.min);
}
} |