基于ds1302的1602液晶问题:我写了一个ds1302的程序,用的是proteus仿真,1602显示。
当我显示字符串的时候,仿真是正常的。可是当我要读回1302的时间的时候,全部都是7?,而且一直都是这个符号,不会改变的。
奇怪的是当我把程序烧到单片机实验板测试的时候,运行又是正常的。
不知道有没有人遇到过同样的问题呢?请各位大侠帮个忙呀
附上程序及仿真文件
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
sbit SCK=P3^6;
sbit SDA=P3^4;
sbit RST = P3^5;
uchar l_tmpdateg[7] ,l_tmpdates[7] ;
unsigned char l_tmpdate[7]={0,20,12,7,3,9,11};//秒分时日月周年08-05-15 12:00:00
unsigned char l_tmpdisplay[8];
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位读写位
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
void Write_Ds1302_byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void Read_RTC( );//read RTC
void Set_RTC( ); //set RTC
void display();
sbit RS = P2^4;//Pin4
sbit RW = P2^5; //Pin5
sbit E = P2^6;//Pi
void delay(int i)
{
int j,k;
for(k=0;k<1;k++)
for(j=0;j<i;j++);
}
void write_com(uchar com)
{
RS=0;
RW=0;
delay(10);
P0=com;
delay(10);
E=1;
delay(10);
E=0;
delay(10);
}
void write_dat(uchar dat)
{
RS=1;
RW=0;
delay(10);
P0=dat;
delay(10);
E=1;
delay(10);
E=0;
delay(10);
}
void init()
{ E=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
init();
Read_RTC( );
write_com(0x80+4);
write_dat(0x30+2);
write_dat(0x30);
display();
while(1)
{
Read_RTC( );
display();
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++) //循环8次 写入数据
{
SCK=0;
SDA=temp&0x01; //每次传输低字节
temp>>=1; //右移一位
SCK=1;
}
}
/****************************************************************************/
void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_(); //启动
Write_Ds1302_Byte(address); //发送地址
Write_Ds1302_Byte(dat); //发送数据
RST=0; //恢复
}
/****************************************************************************/
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++) //循环8次 读取数据
{
if(SDA)
temp|=0x80; //每次传输低字节
SCK=0;
temp>>=1; //右移一位
SCK=1;
}
RST=0;
_nop_(); //以下为DS1302复位的稳定时间
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return (temp); //返回
}
/****************************************************************************/
void Read_RTC( ) //读取 日历
{
unsigned char i,*p;
p=read_rtc_address; //地址传递
for(i=0;i<7;i++) //分7次读取 秒分时日月周年
{
l_tmpdate=Read_Ds1302(*p);
p++;
}
}
/***********************************************************************/
void Set_RTC( ) //设定 日历
{
unsigned char i,*p,tmp;
for(i=0;i<7;i++){ //BCD处理
tmp=l_tmpdate/10;
l_tmpdate=l_tmpdate%10;
l_tmpdate=l_tmpdate+tmp*16;
}
Write_Ds1302(0x8E,0X00);
p=write_rtc_address; //传地址
for(i=0;i<7;i++) //7次写入 秒分时日月周年
{
Write_Ds1302(*p,l_tmpdate);
p++;
}
Write_Ds1302(0x8E,0x80);
}
void display()
{
uchar i;
for(i=0;i<7;i++)
{
l_tmpdates=l_tmpdate/16;
l_tmpdateg=l_tmpdate%16;
}
write_com(0x80+6);
write_dat(0x30+l_tmpdates[6]);
write_dat(0x30+l_tmpdateg[6]);
write_dat(0xb0);
write_dat(0x30+l_tmpdates[4]);
write_dat(0x30+l_tmpdateg[4]);
write_dat(0xb0);
write_dat(0x30+l_tmpdates[3]);
write_dat(0x30+l_tmpdateg[3]);
write_com(0x80+0x40+6);
write_dat(0x30+l_tmpdates[2]);
write_dat(0x30+l_tmpdateg[2]);
write_dat(0x3a);
write_dat(0x30+l_tmpdates[1]);
write_dat(0x30+l_tmpdateg[1]);
write_dat(0x3a);
write_dat(0x30+l_tmpdates[0]);
write_dat(0x30+l_tmpdateg[0]);
}