📄 ds1302_m16.c
字号:
//////////////////////////////////////////////////////////////////////////////////////////////
//
//
// DS1302 RTC
//
//
///////////////////////////////////////////////////////////////////////////////////////////////
//;"---------------------------------------------------------------------------
//;" Convert Hex value to BCD value
//;"---------------------------------------------------------------------------
UBYTE HexToBCD(UBYTE bt) // dec:23/10= 2,3 2*16+3
{
UBYTE i;
i=(bt/10);bt=bt-i*10;bt=i*16+bt;
return bt;
}
//;"---------------------------------------------------------------------------
//;" Convert ACC BCD value to Hex Num
//;"---------------------------------------------------------------------------
UBYTE BCDToHex(UBYTE bt)
{
UBYTE i;
i=bt/16;i*=10;i+=bt&0xf;
return i;
}
void DS1302_Start(void)
{
ds1302_dat = 1;
ds1302_clk = 0;
ds1302_rst = 0;
__nop;__nop;__nop;__nop;
ds1302_rst = 1;
__nop;__nop;__nop;__nop;
}
void DS1302_Stop(void)
{
ds1302_rst = 0;
__nop;__nop;__nop;__nop;
ds1302_clk = 1;
ds1302_dat = 1;
}
void DS1302_SendByte(unsigned char bt)
{
unsigned char i;
ds1302_dir_dat=1;
for (i=0; i<8; i++)
{
if (bt & 0x1) ds1302_dat = 1; // send each bit, LSB first
else ds1302_dat = 0;
bt = bt >> 1;
ds1302_clk = 1;
__nop;
ds1302_clk = 0;
}
}
UBYTE DS1302_GetByte()
{
unsigned char i;
unsigned char bt=0;
ds1302_dir_dat=0;
ds1302_dat = 1;
for (i=0; i<8; i++)
{
bt = bt >> 1;
if (ds1302_dat == 1) bt|=0x80;
ds1302_clk = 1;
__nop;
ds1302_clk = 0;
}
return bt;
}
unsigned char ReadRTC_Byte(unsigned char address)
{
unsigned char ACC;
rtc_busy=1;
DS1302_Start();
ACC = address;
ACC &=31; //max address 31.
ACC <<= 1;
ACC |= 0x81;
DS1302_SendByte(ACC);
ACC=DS1302_GetByte();
DS1302_Stop();
rtc_busy=0;
return ACC;
}
void WriteRTC_Byte(unsigned char address,unsigned char number)
{
unsigned char ACC;
rtc_busy=1;
DS1302_Start();
ACC = address;
ACC &=31; //max address 31.
ACC <<= 1;
ACC |= 0x80;
DS1302_SendByte(ACC);
ACC = number;
DS1302_SendByte(ACC);
DS1302_Stop();
rtc_busy=0;
}
void DS1302_EnableWP(void)
{
WriteRTC_Byte(7,0);
}
void DS1302_DisableWP(void)
{
WriteRTC_Byte(7,0x80);
}
void DS1302_init(void)
{
unsigned char ACC;
rtc_busy=1;
ds1302_dir_clk=1;
ds1302_dir_dat=1;
ds1302_dir_rst=1;
WriteRTC_Byte(8,0);
WriteRTC_Byte(7,0);
ACC=ReadRTC_Byte(0);
ACC&=127;
WriteRTC_Byte(0,ACC);
rtc_busy=0;
}
unsigned char ReadSec(void)
{
return BCDToHex(ReadRTC_Byte(0));
}
unsigned char ReadMin(void)
{
return BCDToHex(ReadRTC_Byte(1));
}
unsigned char ReadHr(void)
{
return BCDToHex(ReadRTC_Byte(2));
}
unsigned char ReadDate(void)
{
return BCDToHex(ReadRTC_Byte(3));
}
unsigned char ReadMonth(void)
{
return BCDToHex(ReadRTC_Byte(4));
}
unsigned char ReadDay(void)
{
return ReadRTC_Byte(5);
}
unsigned char ReadYear(void)
{
return BCDToHex(ReadRTC_Byte(6));
}
void WriteSec(unsigned char number)
{
WriteRTC_Byte(0,HexToBCD(number));
}
void WriteMin(unsigned char number)
{
WriteRTC_Byte(1,HexToBCD(number));
}
void WriteHr(unsigned char number)
{
WriteRTC_Byte(2,HexToBCD(number));
}
void WriteDate(unsigned char number)
{
WriteRTC_Byte(3,HexToBCD(number));
}
void WriteMonth(unsigned char number)
{
WriteRTC_Byte(4,HexToBCD(number));
}
void WriteDay(unsigned char number)
{
WriteRTC_Byte(5,number);
}
void WriteYear(unsigned char number)
{
WriteRTC_Byte(6,HexToBCD(number));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -