📄 ds1302.c
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^3;
sbit lcdrs=P2^4;
sbit reset=P2^5;
sbit io=P2^6;
sbit scl=P2^7;
sbit s1=P1^3;
sbit s2=P1^5;
sbit s3=P1^7;
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
char Second,Minute,Hour,Week,Day,Month,Year,flag;
uchar code table1[]="20 - - ";
uchar code table2[]=" : : ";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
///////////////DS1302//////////////////////////////////////////////////////////////////
void write_byte(uchar date) //实时时钟写入一字节(内部函数)
{
uchar i,j;
j=date;
scl=0;
for(i=8;i>0;i--)
{
j=j>>1;
io=CY; //相当于汇编中的 RRC
scl=1;
scl=0;
}
}
uchar read_byte() //实时时钟读取一字节(内部函数)
{
uchar i,j;
for(i=8;i>0;i--)
{
j=j>>1;
if(io==1)
j|=0x80; //相当于汇编中的 RRC
scl=1;
scl=0;
}
return(j);
}
void write1302(uchar addr,uchar date) //addr: DS1302地址, date 要写的数据
{
reset=0;
scl=0;
reset=1;
write_byte(addr);
write_byte(date); // 写1Byte数据
scl=1;
reset=0;
}
uchar read1302(uchar addr) //读取DS1302某地址的数据
{
uchar date;
reset=0;
scl=0;
reset=1;
write_byte(addr|0x01); // 地址,命令
date=read_byte(); // 读1Byte数据
scl=1;
reset=0;
return(date);
}
void gettime()
{
uchar value;
value=read1302(DS1302_SECOND);
Second=((value&0x70)>>4)*10+(value&0x0F);
value=read1302(DS1302_MINUTE);
Minute=((value&0x70)>>4)*10+(value&0x0F);
value=read1302(DS1302_HOUR);
Hour=((value&0x70)>>4)*10+(value&0x0F);
value=read1302(DS1302_DAY);
Day=((value&0x70)>>4)*10+(value&0x0F);
value=read1302(DS1302_WEEK);
Week=((value&0x70)>>4)*10+(value&0x0F);
value=read1302(DS1302_MONTH);
Month=((value&0x70)>>4)*10+(value&0x0F);
value=read1302(DS1302_YEAR);
Year=((value&0x70)>>4)*10+(value&0x0F);
}
///////////1602显示部分////////////////////////////////////////////////////////////////////////////////////
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
lcden=0;
}
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_nyr(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_week(uchar Week)
{
write_com(0x80+12);
switch(Week)
{
case 1: write_data('M');
delay(5);
write_data('O');
delay(5);
write_data('N');
break;
case 2: write_data('T');
delay(5);
write_data('H');
delay(5);
write_data('U');
break;
case 3: write_data('W');
delay(5);
write_data('E');
delay(5);
write_data('D');
break;
case 4: write_data('T');
delay(5);
write_data('H');
delay(5);
write_data('U');
break;
case 5: write_data('F');
delay(5);
write_data('R');
delay(5);
write_data('I');
break;
case 6: write_data('S');
delay(5);
write_data('A');
delay(5);
write_data('T');
break;
case 7: write_data('S');
delay(5);
write_data('U');
delay(5);
write_data('N');
break;
}
}
void display()
{
write_sfm(10,Second);
write_sfm(7,Minute);
write_sfm(4,Hour);
write_week(Week);
write_nyr(3,Year);
write_nyr(6,Month);
write_nyr(9,Day);
}
///////////扫描键盘////////////////////////////////////////////////////////////////////////////////////
void keyscan()
{
uchar s1num;
if(s1==0)
{
delay(5);
if(s1==0)
{
s1num++;
flag=1;
while(!s1);
switch(s1num)
{
case 1:write_com(0x80+0x40+10);
write_com(0x0f);
break;
case 2:write_com(0x80+0x40+7);
break;
case 3:write_com(0x80+0x40+4);
break;
case 4:write_com(0x80+12);
break;
case 5:write_com(0x80+9);
break;
case 6:write_com(0x80+6);
break;
case 7:write_com(0x80+3);
break;
case 8:s1num=0;
write_com(0x0c);
flag=0;
write1302(0x8e,0x00);
write1302(0x80,((Second/10)<<4|(Second%10)));
write1302(0x82,((Minute/10)<<4|(Minute%10)));
write1302(0x84,((Hour/10)<<4|(Hour%10)));
write1302(0x86,((Day/10)<<4|(Day%10)));
write1302(0x88,((Month/10)<<4|(Month%10)));
write1302(0x8c,((Year/10)<<4|(Year%10)));
write1302(0x8a,((Week/10)<<4|(Week%10)));
break;
}
}
}
if(s1num!=0)
{
if(s2==0);
{
delay(5);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
Second++;
if(Second==60)
Second=0;
write_sfm(10,Second);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
Minute++;
if(Minute==60)
Minute=0;
write_sfm(7,Minute);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
Hour++;
if(Hour==24)
Hour=0;
write_sfm(4,Hour);
write_com(0x80+0x40+4);
}
if(s1num==4)
{
Week++;
if(Week==8)
Week=1;
write_week(Week);
write_com(0x80+12);
}
if(s1num==5)
{
Day++;
if(Day==32)
Day=1;
write_nyr(9,Day);
write_com(0x80+9);
}
if(s1num==6)
{
Month++;
if(Month==13)
Month=1;
write_nyr(6,Month);
write_com(0x80+6);
}
if(s1num==7)
{
Year++;
if(Year==100)
Year=0;
write_nyr(3,Year);
write_com(0x80+3);
}
}
}
if(s3==0);
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
Second--;
if(Second==-1)
Second=59;
write_sfm(10,Second);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
Minute--;
if(Minute==-1)
Minute=59;
write_sfm(7,Minute);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
Hour--;
if(Hour==-1)
Hour=23;
write_sfm(4,Hour);
write_com(0x80+0x40+4);
}
if(s1num==4)
{
Week--;
if(Week==0)
Week=7;
write_week(Week);
write_com(0x80+12);
}
if(s1num==5)
{
Day--;
if(Day==0)
Day=31;
write_nyr(9,Day);
write_com(0x80+9);
}
if(s1num==6)
{
Month--;
if(Month==0)
Month=12;
write_nyr(6,Month);
write_com(0x80+6);
}
if(s1num==7)
{
Year--;
if(Year==-1)
Year=99;
write_nyr(3,Year);
write_com(0x80+3);
}
}
}
}
}
////////////////初始化和主函数部分//////////////////////////////////////////////////////////////////////////////
void lcd_init()
{
uchar num;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x81);
for(num=0;num<10;num++)
{
write_data(table1[num]);
delay(5);
}
write_com(0x80+0x40+4);
for(num=0;num<8;num++)
{
write_data(table2[num]);
delay(5);
}
}
void init1302()
{
write1302(0x8e,0x00);
write1302(0x80,((50/10)<<4|(50%10))); //根据写秒寄存器命令字,写入秒的初始值
write1302(0x82,((59/10)<<4|(59%10))); //根据写分寄存器命令字,写入分的初值
write1302(0x84,((12/10)<<4|(12%10)));
write1302(0x86,((29/10)<<4|(29%10)));
write1302(0x88,((2/10)<<4|(2%10)));
write1302(0x8c,((12/10)<<4|(12%10)));
write1302(0x8a,((4/10)<<4|(4%10)));
}
void main()
{
lcd_init();
init1302();
gettime();
display();
while(1)
{
keyscan();
if(flag==0)
{
gettime();
display();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -