⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302_m16.c

📁 ds1302 timekeeper code for renesas M16c...I coded and optimized time keeping and ram usage function.
💻 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 + -