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

📄 复件 clock.c

📁 ami8563 clock source code
💻 C
字号:
//--------------------i2c.h-------------------------------------------------------
//#############################################################################
#include "main.h"
BYTE data i2c_data;
void I2C_init(void);
void I2C_start(void);
bit I2c_clock(void);
void I2C_ack(void);
void I2C_stop(void);
BYTE I2C_receive(void);
bit I2C_send(BYTE i2c_temp_data);

bit I2C_write_address(BYTE i2c_we_dev_add,BYTE i2c_in_add);
bit I2C_read_byte(BYTE i2c_we_dev_add,BYTE i2c_rd_dev_add,BYTE i2c_in_add);
bit I2C_write_byte(BYTE i2c_we_dev_add,BYTE i2c_in_add,BYTE i2c_temp_data);

bit I2C_read_block(BYTE i2c_we_dev_add,
                   BYTE i2c_rd_dev_add,
                   BYTE i2c_in_add,
                   BYTE * i2c_rambuf,
                   BYTE block);
                   
bit I2C_write_block(BYTE i2c_we_dev_add,BYTE i2c_in_add,BYTE * i2c_rambuf,BYTE block);
//-----------------------------i2c.c-------------------------------------------------
//##################################################################################
#include "i2c.h"
extern void delay(void);
void I2C_init(void)
{
    SCL=LOW;
    I2C_stop();
}

//----------------------------------------------
void I2C_start(void)
{
    SCL=HIGH;
    delay();
    SDA=LOW;
    delay();
    SCL=LOW;
    delay();
}

//----------------------------------------
bit I2C_clock(void)
{
    bit sample;
    SCL=HIGH;
    delay();
    sample=SDA;
    SCL=LOW;
    delay();
    return(sample);
}

//-------------------------------------------
void I2C_ack(void)
{
    SDA=LOW; /* output a ACK */
    I2C_clock();
    SDA=HIGH;
}   

//------------------------------------------
void I2C_stop(void)
{
    SDA=LOW;
    delay();
    SCL=HIGH;
    delay();
    SDA=HIGH;
    delay();
    SCL=LOW;
    delay();
}

//--------------------------------------------
bit I2C_send(BYTE i2c_temp_data)
{
    register BYTE i;
    for(i=0;i<8;i++)
    {
        SDA=(bit)(i2c_temp_data & 0x80);
        i2c_temp_data=i2c_temp_data<<1;
        I2C_clock();
    }
    SDA=HIGH; /* read ACK if ACK=0 then ask=OK */
    return (~I2C_clock());  //when SDA LOW ,return 1.
}
  
//-----------------------------------------------
BYTE I2C_receive(void)
{
    BYTE data i2c_temp_data=0;
    register BYTE i;
    for(i=0;i<8;i++)
    {
        i2c_temp_data *= 2;
        if(I2C_clock())
            i2c_temp_data++;
    }
    return (i2c_temp_data);
}

//-----------------------------------------------------
bit I2C_write_address(BYTE i2c_we_dev_add,BYTE i2c_in_add)
{
    I2C_start();
    if(I2C_send(i2c_we_dev_add))
        return(I2C_send(i2c_in_add));
    else
        return (FALSE);
}

//---------------------------------------------------------
bit I2C_read_byte(BYTE i2c_we_dev_add,BYTE i2c_rd_dev_add,BYTE i2c_in_add)
{
    if(I2C_write_address(i2c_we_dev_add,i2c_in_add))  
    {
        I2C_start();
        if(I2C_send(i2c_rd_dev_add))   //we--write, rd--read
        {
            i2c_data=I2C_receive();
            I2C_ack(); /* output a ACK */
            I2C_stop();
            return (TRUE);
        }
        else
        {
            I2C_stop();
            return (FALSE);
        }
    }
    else
    {
        I2C_stop();
        return (FALSE);
    }
}

//------------------------------------------------------------
bit I2C_write_byte(BYTE i2c_we_dev_add,BYTE i2c_in_add,BYTE i2c_temp_data)
{
    if(I2C_write_address(i2c_we_dev_add,i2c_in_add))
    {
        if(I2C_send(i2c_temp_data))
        {
            I2C_stop();
            return (TRUE);
        }
        else
        {
            I2C_stop();
            return (FALSE);
        }
    }
    else
    {
        I2C_stop();
        return (FALSE);
    }
}    

//----------------------------------------------------------------------
bit I2C_read_block(BYTE i2c_we_dev_add,BYTE i2c_rd_dev_add,BYTE i2c_in_add,BYTE * i2c_rambuf,BYTE block)
{
    register BYTE i;
    if(I2C_write_address(i2c_we_dev_add,i2c_in_add))
    {
        I2C_start();
        if(I2C_send(i2c_rd_dev_add))
        {
            for(i=0;i<block;i++)
            {
            *(i2c_rambuf+i)=I2C_receive();
            if(i!=block)
            I2C_ack(); /* output a ACK */
            else
            I2C_stop();
            }
            return (TRUE);
        }
        else
        {
            I2C_stop();
            return (FALSE);
        }
    }
    else
    {
        I2C_stop();
        return (FALSE);
    }
}

//-------------------------------------------------------------------------------
bit I2C_write_block(BYTE i2c_we_dev_add,BYTE i2c_in_add,BYTE * i2c_rambuf,BYTE block)
{
    register BYTE i;
    BYTE data i2c_temp_data;
    if(I2C_write_address(i2c_we_dev_add,i2c_in_add))
    {
        for(i=0;i<block;i++)
        {
            i2c_temp_data=*(i2c_rambuf+i);
            if(~I2C_send(i2c_temp_data))
            {
                I2C_stop();
                return (FALSE);
            }
        }
        I2C_stop();
        return (TRUE);
    }
    else
    {
        I2C_stop();
        return (FALSE);
    }
}

//----------------------ami8563.h---------------------------------------------------------------
//#########################################################################################
#include "main.h"
struct clk_ami8563 {         // bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
       BYTE control_1;       // test 0    stop 0    testc 0   0    0
       BYTE control_2;       // 0    0    0    ti/tp af   tf  aie  tie
       BYTE second;          // vl   ( 0...59 sec )
       BYTE minute;          // _    ( 0...59 min )
       BYTE hour;            // _    _    ( 0...23 hour )
       BYTE day;             // _    _    ( 1...31 day )
       BYTE week;            // _    _    _    _     _   ( 0..6 week )
       BYTE month;           // c    _    _    ( 1...12 month )
       BYTE year;            // ( 00..99 year )
       BYTE minute_alarm;    // ae   ( 0...59 min alarm )
       BYTE hour_alarm;      // ae   _    ( 0...23 hour alarm )
       BYTE day_alarm;       // ae   _    ( 1...31 day alarm )
       BYTE week_alarm;      // ae   _    _    _    _    (0.6 week alarm)
       BYTE clk_out;         // fe   _    _    _    _   _    fd1  fd0
       BYTE t_controll;      // te   _    _    _    _   _    td1  td0
       BYTE t_value;         // ( value )
};
struct clk_ami8563 data clk;
BYTE data TEMP_RAMBUF[BLOCK_SIZE];
bit AMI8563_init(void);
void TIME_dis(void);
//---------------ami8563.c-----------------------------------------------------------------
#include "ami8563.h"
//extern bit f_t_dis;
extern BYTE data i2c_data;
extern void delayms(BYTE ms);
extern bit I2C_read_byte(  BYTE i2c_we_dev_add,BYTE i2c_rd_dev_add,BYTE i2c_in_add);
extern bit I2C_write_byte( BYTE i2c_we_dev_add,BYTE i2c_in_add,BYTE i2c_temp_data);

extern bit I2C_read_block( BYTE i2c_we_dev_add,
                           BYTE i2c_rd_dev_add,
                           BYTE i2c_in_add,
                           BYTE* i2c_rambuf,
                           BYTE block);
                           
extern bit I2C_write_block(BYTE i2c_we_dev_add,
                           BYTE i2c_in_add,
                           BYTE* i2c_rambuf,BYTE block);

//-------------------------------------------------------------
bit AMI8563_init(void)
{
     BYTE data i=0; // bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
     clk.control_1=0x00; // test 0 stop 0 testc 0 0 0
     clk.control_2=0x00; // 0 0 0 ti/tp af tf aie tie
     clk.second=0x00; // vl ( 0...59 sec )
     clk.minute=0x00; // _ ( 0...59 min )
     clk.hour=0x00; // _ _ ( 0...23 hour )
     clk.day=0x01; // _ _ ( 1...31 day )
     clk.week=0x06; // _ _ _ _ _ ( 0..6 week )
     clk.month=0x01; // c _ _ ( 1...12 month )
     clk.year=0x00; // ( 00..99 year )
     clk.minute_alarm=0x80; // ae ( 0...59 min alarm )
     
     clk.hour_alarm=0x80; // ae _ ( 0...23 hour alarm )
     clk.day_alarm=0x80; // ae _ ( 1...31 day alarm )
     clk.week_alarm=0x80; // ae _ _ _ _ (0.6 week alarm)
     clk.clk_out=0x00; // fe _ _ _ _ _ fd1 fd0
     clk.t_controll=0x00; // te _ _ _ _ _ td1 td0
     clk.t_value=0x00; // ( value )
//set to 2000,1,1,00:00:00,week 6,clk_out 1Hz
     TEMP_RAMBUF[i++]=clk.control_1;
     TEMP_RAMBUF[i++]=clk.control_2;
     TEMP_RAMBUF[i++]=clk.second;
     TEMP_RAMBUF[i++]=clk.minute;
     TEMP_RAMBUF[i++]=clk.hour;
     TEMP_RAMBUF[i++]=clk.day;
     TEMP_RAMBUF[i++]=clk.week;
     TEMP_RAMBUF[i++]=clk.month;
     TEMP_RAMBUF[i++]=clk.year;
     TEMP_RAMBUF[i++]=clk.minute_alarm;
     TEMP_RAMBUF[i++]=clk.hour_alarm;
     TEMP_RAMBUF[i++]=clk.day_alarm;
     TEMP_RAMBUF[i++]=clk.week_alarm;
     TEMP_RAMBUF[i++]=clk.clk_out;
     TEMP_RAMBUF[i++]=clk.t_controll;
     TEMP_RAMBUF[i++]=clk.t_value;
     if(I2C_write_block(AMI8563_WRITE_ADD,0,TEMP_RAMBUF,BLOCK_SIZE))
     {
         delayms(50);
         if(I2C_read_block(AMI8563_WRITE_ADD,AMI8563_READ_ADD,2,TEMP_RAMBUF,7))
         {
             if(~(bit)(TEMP_RAMBUF[0]&0x80)) /* if ami8563 $02^vl=0 then clock is ok */
             return (TRUE);
         }
         return (FALSE);
     }
     else
         return (FALSE);
}
void TIME_dis(void)
{
    BYTE data i=0;
    // if(f_t_dis==TRUE)
    // {
    // f_t_dis=FALSE;
    if(I2C_read_block(AMI8563_WRITE_ADD,AMI8563_READ_ADD,2,TEMP_RAMBUF,7))
    {
        if(~(bit)(TEMP_RAMBUF[0]&0x80)) /* if ami8563 $02^vl=0 then clock is ok */
        {
            clk.second=TEMP_RAMBUF[i++]&0x7f;
            clk.minute=TEMP_RAMBUF[i++]&0x7f;
            clk.hour=TEMP_RAMBUF[i++]&0x3f;
            clk.day=TEMP_RAMBUF[i++]&0x3f;
            clk.week=TEMP_RAMBUF[i++]&0x07;
            clk.month=TEMP_RAMBUF[i++]&0x1f;
            clk.year=TEMP_RAMBUF[i++];
        }
    }
// }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -