📄 无调时.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;
#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;
uchar DateString[9];
uchar TimeString[9];
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
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);
}
void Datechange()
{
DateString[0]=Year/10+0x30;
DateString[1]=Year%10+0x30;
DateString[2]='-';
DateString[3]=Month/10+'0';
DateString[4]=Month%10+'0';
DateString[5]='-';
DateString[6]=Day/10+'0';
DateString[7]=Day%10+'0';
DateString[8]='\0';
}
void Timechange()
{
TimeString[0]=Hour/10+'0';
TimeString[1]=Hour%10+'0';
TimeString[2]=':';
TimeString[3]=Minute/10+'0';
TimeString[4]=Minute%10+'0';
TimeString[5]=':';
TimeString[6]=Second/10+'0';
TimeString[7]=Second%10+'0';
TimeString[8]='\0';
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
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 display()
{
uchar num;
write_com(0x81);
write_data(0x32);
write_data(0x30);
for(num=0;num<9;num++)
{
write_data(DateString[num]);
delay(5);
}
write_com(0x80+0x44);
for(num=0;num<9;num++)
{
write_data(TimeString[num]);
delay(5);
}
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 lcd_init()
{
uchar num;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x81);
}
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();
while(1)
{
gettime();
Datechange();
Timechange();
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -