ds1302+1602 时钟问题 ,求解!
时间:10-02
整理:3721RD
点击:
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();
}
}
程序如下 :
#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();
}
}
不好啊泰伦不清晰