发布网友 发布时间:2022-08-21 03:35
共2个回答
热心网友 时间:2023-11-17 08:57
楼主按照你的程序进行了修改,可以完成要求
错误之处
1。 、、//下面是ds1302的驱动程序
这里不应该有、号,可能是笔误
2。在读函数之中
uchar read_add(uchar add)
{
uchar i=0,temp=0;
ce=0;
sclk=0;
ce=1;
for(i=0;i<8;i++)
{
io=add&0x01;
sclk=0;
sclk=1;
add>>=1;
}
for(i=0;i<8;i++)
{
sclk=1;
sclk=0;
if(io)
{
temp|=0x01<<i;
}
//这里少了括号
//这个括号应该是结束for循环的
ce=0;
temp=temp/16*10+temp%16;
return temp;
} //这个括号位置错误,应该在上面
}
3。读函数的寄存器地址错误
display(1,3,tabb[read_add(0x84)/10]); //应该为0x85
display(1,4,tabb[read_add(0x84)%10]);//同上
display(1,5,':');
display(1,6,tabb[read_add(0x82)/10]);//应该为0x83
display(1,7,tabb[read_add(0x82)%10]);//同上
display(1,8,':');
display(1,9,tabb[read_add(0x80)/10]);//应该为0x81
display(1,10,tabb[read_add(0x80)%10]);//同上
以下是调试过的程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tabb[]={'0','1','2','3','4','5','6','7','8','9'};
sbit rs=P2^ 6;
sbit rw=P2^5;
sbit lcde=P2^7;
sbit sclk=P3^6;
sbit io=P3^4;
sbit ce=P3^5;
//下面是1602的驱动程序
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com,bit i)
{
rs=i;
P0=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void lcd1602init()
{ rw=0;
write_com(0x01,0);
write_com(0x02,0);
write_com(0x06,0);
write_com(0x0c,0);
write_com(0x38,0);
}
void display(uchar x,uchar y,uchar date)
{
x&=0x01;
y&=0x0f;
if(x)
{
y+=0x40;
}
y+=0x80;
write_com(y,0);
write_com(date,1);
}
//下面是ds1302的驱动程序
void write_add(uchar add,uchar date)
{
uchar i;
ce=0;
sclk=0;
ce=1;
for(i=0;i<8;i++)
{
io=add&0x01;
sclk=0;
sclk=1;
add>>=1;
}
for(i=0;i<8;i++)
{
io=date&0x01;
sclk=0;
sclk=1;
date>>=1;
}
ce=0;
}
uchar read_add(uchar add)
{
uchar i=0,temp=0;
ce=1;
for(i=0;i<8;i++)
{
io=add&0x01;
sclk=0;
sclk=1;
add>>=1;
}
for(i=0;i<8;i++)
{
sclk=1;
sclk=0;
if(io)
{
temp|=0x01<<i;
}
}
ce=0;
temp=temp/16*10+temp%16;
return temp;
}
void ds1302init()
{
ce=0;
write_add(0x8e,0x00);
write_add(0x84,0x00);
write_add(0x8c,0x10);
write_add(0x88,0x08);
write_add(0x86,0x01);
write_add(0x84,0x21);
write_add(0x82,0x41);
write_add(0x80,0x00);
write_add(0x8a,0x07);
write_add(0x90,0xa5);
write_add(0x8e,0x80);
}
void main()
{
uchar temp=0;
lcd1602init();
ds1302init();
while(1)
{
display(0,0,'2');
display(0,1,'0');
delay(1);
display(0,2,tabb[read_add(0x8d)/10]); //这里显示年
delay(1);
display(0,3,tabb[read_add(0x8d)%10]);
display(0,4,'-');
delay(1);
display(0,5,tabb[read_add(0x89)/10]); //月
delay(1);
display(0,6,tabb[read_add(0x89)%10]);
display(0,7,'-');
delay(1);
display(0,8,tabb[read_add(0x87)/10]); //日
delay(1);
display(0,9,tabb[read_add(0x87)%10]);
display(0,11,'D');
display(0,12,'a');
display(0,13,'y');
display(0,14,':');
delay(1);
display(0,15,tabb[read_add(0x8b)%10]); ///星期
display(1,0,'S');
display(1,1,'C');
display(1,2,'F');
delay(1);
display(1,3,tabb[read_add(0x85)/10]);
delay(1);
display(1,4,tabb[read_add(0x85)%10]);
delay(1);
display(1,5,':');
display(1,6,tabb[read_add(0x83)/10]);
delay(1);
display(1,7,tabb[read_add(0x83)%10]);
display(1,8,':');
delay(1);
display(1,9,tabb[read_add(0x81)/10]);
delay(1);
display(1,10,tabb[read_add(0x81)%10]);
}
}
热心网友 时间:2023-11-17 08:57
我这有1302,和1602的初始化以及设置的一些函数,把你邮箱给我,我给你发过去看看应该能解决问题