📄 han.c
字号:
#include "intrins.h"
#include <LCD.c>
#include <reg51.h>
sbit DS1302_CLK = P1^5; //实时时钟时钟线引脚
sbit DS1302_IO = P1^6; //实时时钟数据线引脚
sbit DS1302_RST = P1^7; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[9];
unsigned char TimeString[9];
#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
void delay_50ms(unsigned int t)
{
unsigned int j;
for(;t>0;t--)
for(j=6245;j>0;j--)
;
}
unsigned char stop=0;//stop ring
void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >> 1;
}
}
unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; //相当于汇编中的 RRC
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}
void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
}
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 读1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}
void DS1302_SetProtect(bit flag) //是否写保护
{
if(flag)
Write1302(0x8E,0x10);
else
Write1302(0x8E,0x00);
}
void DS1302_Set_Time(unsigned char Address, unsigned char Value) // 设置时间函数
{
DS1302_SetProtect(0); //cancel the write protection
Write1302(Address, ((Value/10)<<4 | (Value%10)));
}
void DS1302_GetTime()
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MINUTE);
Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
//Alarm2[1]= Time->Minute;
ReadValue = Read1302(DS1302_HOUR);
Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
// Alarm2[0]= Time->Hour;
ReadValue = Read1302(DS1302_DAY);
Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_WEEK);
Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MONTH);
Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_YEAR);
Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
}
void DateToStr()
{
DateString[0] = Year/10 + '0';
DateString[1] = Year%10 + '0';
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 TimeToStr()
{
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 Initial_DS1302(void)
{
unsigned char Second=Read1302(DS1302_SECOND);
if(Second&0x80)
DS1302_Set_Time(DS1302_SECOND,0);
}
void main()
{
init_lcd ();
Initial_DS1302();
DS1302_Set_Time(DS1302_SECOND,0);
DS1302_Set_Time(DS1302_MINUTE,1);
DS1302_Set_Time(DS1302_HOUR,15);
DS1302_Set_Time(DS1302_WEEK,6);
DS1302_Set_Time(DS1302_DAY,11);
DS1302_Set_Time(DS1302_MONTH,10);
DS1302_Set_Time(DS1302_YEAR,8);
while(1)
{ unsigned char i=0,j=0;
DS1302_GetTime();
TimeToStr();
DateToStr();
coordinate_1602(1,1);
while(DateString[i]!='\0')
{
wr_lcd(dat,DateString[i]);
i++;
}
coordinate_1602(2,1);
while(TimeString[j]!='\0')
{
wr_lcd(dat,TimeString[j]);
j++;
}
delay_50ms(10);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -