请问uchar disp[8]为什么 把8去掉(即就是uchar disp[]) 程序就会错误,时钟停止住,显示11 11 11。
程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sck=P3^6;
sbit io=P3^4;
sbit rst=P3^5;
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//DS1302的设置读地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//DS1302的设置写地址
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
//数码管1-9,第10个是'-'
uchar settime[]={11,8,1,1,15,50,50};//年月日周时分秒
uchar disp[8];
/******************************************************************/
/* 声明区 */
/******************************************************************/
void ds1302_write_byte(uchar add);
void ds1302_write(uchar adress,uchar date);
void read(void);
uchar read_ds1302(uchar adress);
void set_ds1302(void);
void process_ds1302(void);
void dispaly(void);
void delay(uchar a)//延时函数1ms
{
uchar i,j;
for(i=a;i>0;i--)
for(j=120;j>0;j--);
}
/******************************************************************/
/* 写一个字节 */
/******************************************************************/
void ds1302_write_byte(uchar add)
{
uchar i;
for(i=0;i<8;i++)
{
sck=0;
io=add&0x01;
add=add>>1;
sck=1;
}
}
/******************************************************************/
/* 写入DS1302 */
/******************************************************************/
void ds1302_write(uchar adress,uchar date)
{
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
ds1302_write_byte(adress);
ds1302_write_byte(date);
rst=0;
io=1;
sck=1;
}
/******************************************************************/
/* 读出DS1302数据 */
/******************************************************************/
uchar read_ds1302(uchar adress)
{
uchar i,temp;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
ds1302_write_byte(adress);
for(i=0;i<8;i++)
{
if(io)
temp=temp|0x80;
sck=0;
_nop_();
temp>>=1;
sck=1;
_nop_();
}
rst=0;
_nop_();
sck=0;;
_nop_();
sck=1;
io=1;
return temp;
}
/******************************************************************/
/* 设置初始值 */
/******************************************************************/
void set_ds1302()
{
uchar i,temp;
for(i=0;i<7;i++) //BCD码处理
{
temp=settime[i]/10;
settime[i]=settime[i]%10;
settime[i]=settime[i]+temp*16;
}
ds1302_write(0x8e,0x00); //¹Øµôд±£»¤
for(i=0;i<7;i++)
{
ds1302_write(write_add[i],settime[i]);
}
ds1302_write(0x8e,0x80); //¹Øµôд±£»¤
}
/******************************************************************/
/* 读时钟数据 */
/******************************************************************/
void read()
{
uchar i;
for(i=0;i<7;i++)
{
settime[i]=read_ds1302(read_add[i]);
}
}
void process_ds1302(void)
{
disp[0]=settime[6]%16;
disp[1]=settime[6]/16;
disp[2]=10;
disp[3]=settime[5]%16;
disp[4]=settime[5]/16;
disp[5]=10;
disp[6]=settime[4]%16;
disp[7]=settime[4]/16;
}
/******************************************************************/
/* 显示函数(通过数码管) */
/******************************************************************/
void display()
{
P0=table[disp[0]];
P1=0X7F;
delay(10);
P0=table[disp[1]];
P1=0xbf;
delay(10);
P0=table[10];
P1=0xdf;
delay(10);
P0=table[disp[3]];
P1=0Xef;
delay(10);
P0=table[disp[4]];
P1=0xf7;
delay(10);
P0=table[10];
P1=0xfb;
delay(10);
P0=table[disp[6]];
P1=0Xfd;
delay(10);
P0=table[disp[7]];
P1=0xfe;
delay(10);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
void main()
{
set_ds1302();
while(1)
{
read();
process_ds1302();
display();
}
}
麻烦大家了,在这里我先谢谢了。 |