readtime.h

来自「这是一个用STC单片机作的,带液晶显示屏的万年历程序,并有串行接收部份,大家一定」· C头文件 代码 · 共 133 行

H
133
字号
//#include"52.h"

//=====读写时钟芯片地址========
#define READ 0xa3
#define WRITE 0xa2

sbit SDA = P1^5;
sbit SCL = P1^6;

				 
word code monthday[12] = {31, 28, 31, 30, 31, 30,		//每月天数
                      31, 31, 30, 31, 30, 31};
                      
  
void delay_iic(void)
{
	byte i;

	for(i = 0; i < 5; i++);
}

void I_start(void)
{
	SDA = 1;
	SCL = 1;
	delay_iic();
	SDA = 0;
	delay_iic();
	SCL = 0;
}

void I_stop(void)
{
	SDA = 0;
	SCL = 1;
	delay_iic();
	SDA = 1;
}

byte I_WaitAck(void)
{
	bit ack;

	SDA = 1;
	delay_iic();
	SCL = 1;
	delay_iic();
	ack = SDA;
	SCL = 0;

	if(ack) return 0;
	else return 1;
}

void I_Ack(void)
{
	SDA = 1;
	delay_iic();
	SCL = 1;
	delay_iic();
	SCL = 0;
	delay_iic();
	SDA = 0;
}

void I_send(byte i_data)
{
	byte i;

	for(i = 0; i < 8; i++)
	{
		SDA = (bit)(i_data & 0x80);
		i_data = i_data << 1;
		SCL = 1;
		delay_iic();
		SCL = 0;
	}
	SDA = 1;
}

byte I_receive(void)
{
	byte i;
	byte i_data = 0;
	bit rdata;
	
	SDA = 1;

	for(i = 0; i < 8; i++)
	{	
		SCL = 1;
		i_data *= 2;
		rdata = SDA;
		if(rdata) i_data++;
		SCL = 0;
	}
	return i_data;
}

void I_Write(byte address, byte i_data)
{
	I_start();
	I_send(WRITE);
	I_WaitAck();
	I_send(address);
	I_WaitAck();
	I_send(i_data);
	I_WaitAck();
	I_stop();
}

byte I_Read(byte address)
{
	byte i_data;

	I_start();
	I_send(WRITE);
	I_WaitAck();
	I_send(address);
	I_WaitAck();

	I_start();
	I_send(READ);
	I_WaitAck();
	i_data = I_receive();
	I_Ack();
	I_stop();
	
	return i_data;
}


⌨️ 快捷键说明

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