ds1302+1602 时钟问题 ,求解!!!

2019-07-16 06:47发布

ds1302时钟问题          当时间通过按键调到9以后,1602上就开始显示这些字符“:;《 = 》?”    时间走动时但又不会显示这些字符   ,还有就是键盘调试之后时间不能写入ds1302     求高手解决 !本人将感激不尽!!!!
  程序如下 :
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit lcden=P3^4;
sbit DS1302_CLK = P3^2;
sbit DS1302_IO  = P2^4;
sbit DS1302_RST = P3^3;
sbit rs=P3^5;
sbit rw=P3^6;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit rd=P3^7;
int shi,fen,miao,week,day,month,year;
uchar flag,s1num;
uchar data table[]={" 2011-08-17  THU"};
uchar data table1[]={"    :  :  "};
void delayms(uint x)
{
uint a,b;
for(a=x;a>0;a--)
    for(b=110;b>0;b--);
}
/*********************1602液晶初始化*********************************/
void write_com(uchar com)        //写操作
{
rs=0;
rw=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_date(uchar date)       //写数据
{
rs=1;
rw=0;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
delayms(5);
}

/*****************************************************************************
函数功能:向DS1302送一字节数据子程序
入口参数:
出口参数:
*****************************************************************************/
  void InputByte(uchar byte1)
{
char i;
for(i=8;i>0;i--)
{
  DS1302_IO=(bit)(byte1&0x01);
  DS1302_CLK=1;
  _nop_();
  DS1302_CLK=0;
  byte1>>=1;
}
return ;
}
/*****************************************************************************
函数功能:读DS1302一个字节子程序
入口参数:
出口参数:
*****************************************************************************/
unsigned char OutputByte(void)  
{
uchar i;
unsigned ucdat=0;
for(i=8;i>0;i--)
{
  DS1302_IO=1;
  ucdat>>=1;
  if(DS1302_IO)ucdat|=0x80;
  DS1302_CLK=1;
  _nop_();
  DS1302_CLK=0;
  }
  return(ucdat);
}
/*****************************************************************************
函数功能:向DS1302某地址写一字节数据子程序
入口参数:addr,TDat
出口参数:
*****************************************************************************/
void write_ds1302(uchar addr,uchar TDat)
{
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
  InputByte(addr);
_nop_();
InputByte(TDat);
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
}
/*****************************************************************************
函数功能:读DS1302地址子程序
入口参数:add
出口参数:timedata
*****************************************************************************/
uchar read_ds1302(uchar addr)
{
uchar timedata;
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
InputByte(addr);
timedata=OutputByte();
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
return(timedata);
}
void initial_ds1302()
{
write_ds1302(0x8e,0x00);  //写保护寄存器,在对时钟或RAM写前WP一定要为0
write_ds1302(0x8c,00);  //年
write_ds1302(0x88,00);  //月
write_ds1302(0x86,00);  //日
write_ds1302(0x8A,00);  //星期
write_ds1302(0x84,0x17);  //时
write_ds1302(0x82,0x18);  //分
write_ds1302(0x80,0x00);  //秒
write_ds1302(0x8e,0x80);  //写保护寄存器
}
/***********************写时分秒************************************/
void write_sfm(uchar add,uchar date)     
{
uchar shi,ge;
shi=date/16;
ge=date%16;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
/*****************************************************************************
函数功能:读DS1302时间子程序
入口参数:
出口参数:全局变量(second,minute,hour,week,day,month,year)
*****************************************************************************/
void read_time()
{
if(flag==0)
{
miao=read_ds1302(0x81);  //秒寄存器
  write_sfm(8,miao);
fen=read_ds1302(0x83);  //分
  write_sfm(5,fen);
shi=read_ds1302(0x85);   //时
  write_sfm(2,shi);
week=read_ds1302(0x8B);   //星期
day=read_ds1302(0x87);   //日
month=read_ds1302(0x89);  //月
year=read_ds1302(0x8d);   //年
}
}
/*******************总初始化************************/                  
void init()
{
  uchar num;
  dula=0;
  wela=0;
  lcden=0;
  initial_ds1302();
  write_com(0x38);
  write_com(0x0c);
  write_com(0x06);
  write_com(0x01);
  write_com(0x80);
for(num=0;num<16;num++)
{
   write_date(table[num]);
   delayms(5);
}
      write_com(0x80+0x40);
for(num=0;num<10;num++)
{
   write_date(table1[num]);
   delayms(5);
}
}
/*************************独立键盘****************************************/
void keyscan()              
{
  rd=0;
  if(s1==0)
  {
   delayms(5);
   if(s1==0)
     {
   s1num++;          //区分时分秒的功能
  while(!s1);
   if(s1num==1)        //对秒操作
   {
    flag=1;
    write_com(0x0f);
    write_com(0x80+0x40+9);
   }
   if(s1num==2)        //对分操作
  {
     write_com(0x80+0x40+6);
  }
   if(s1num==3)       //对时操作
  {
  write_com(0x80+0x40+3);
  }
    if(s1num==4)       //停止操作
  {
  s1num=0;
write_com(0x0c);  
write_ds1302(0x84,shi);  //时
write_ds1302(0x82,fen);  //分
write_ds1302(0x80,miao); //秒
   flag=0;
  }  
  }  
  }
  if(s1num!=0)      
{
    if(s2==0)       //增加时间
  {
   delayms(5);
    if(s2==0)
    {
      while(!s2);
   if(s1num==1)
   {
    miao++;
    if(miao==60)   
      miao=0;
      write_sfm(8,miao);
      write_com(0x80+0x40+9);        
   }
     if(s1num==2)
   {
    fen++;
    if(fen==60)   
      fen=0;
      write_sfm(5,fen);
      write_com(0x80+0x40+6);
      
   }
      if(s1num==3)
   {
    shi++;
    if(shi==24)   
      shi=0;
      write_sfm(2,shi);
      write_com(0x80+0x40+3);
         
   }
    }
  }
  if(s3==0)          //减小时间
  {
   delayms(5);
  if(s3==0)
  {
   while(!s3);
    if(s1num==1)
   {
    miao--;
    if(miao==-1)
    miao=59;
    write_sfm(8,miao);
    write_com(0x80+0x40+9);
   
   }
   if(s1num==2)
   {
    fen--;
    if(fen==-1)
    fen=59;
    write_sfm(5,fen);
    write_com(0x80+0x40+6);
   
   }
    if(s1num==3)
   {
    shi--;
    if(shi==-1)
    shi=23;
    write_sfm(2,shi);
    write_com(0x80+0x40+3);
   
   }
  }
  }
}
}

/********************主函数************************/
void main()
{
init();
while(1)
{
   keyscan();
   read_time();
}
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。