📄 复件 clock.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 + -