📄 i2c.c
字号:
#include <REGX52.H>
#include"pr/twj.h"
#define SDA1 P1 |= 0x04 //p1.2
#define SDA0 P1 &= 0xFb
#define SCLK1 P1 |= 0x02 //p1.1
#define SCLK0 P1 &= 0xFd
//
char houre,minute,day,month,year;
void delay(x)
{ BYTE i=0,j;
i=x;
i++;
j=i;
j++;
i=j;
}
void I_start(void)
{
SDA1;
delay(1);
SCLK1;
delay(1);
SDA0;
delay(1);
SCLK0;
delay(1);
}
void I_stop(void)
{
SDA0;
delay(1);
SCLK1;
delay(1);
SDA1;
delay(1);
}
void I_ack(void)
{
SDA0;
delay(1);
SCLK1;
delay(1);
SCLK0;
delay(1);
}
void N_ack(void)
{
SDA1;
delay(1);
SCLK1;
delay(1);
SCLK0;
delay(1);
}
void I_send(BYTE m)
{
BYTE i=8;
do{
SCLK0;
delay(1);
if((m&0x80)==0x80)
SDA1;
else
SDA0;
delay(1);
SCLK1;
m=m<<1;
delay(1);
i--;
}while(i);
SCLK0;
}
BYTE I_receive(void)
{
BYTE x=0,i=8;
BYTE k;
SDA1;
delay(1);
do{
SCLK0;
delay(1);
SCLK1;
SDA1;
delay(10);
k = P1;
if((k&0x04)==0x04) //if(SDA==1)
x = x|0x01;
if(i>1)
x = x<<1;
i--;
}while(i);
SCLK0;
return x;
}
/*****************************************************
时间的读和改
******************************************************/
void time_wr(BYTE x,BYTE bData) // 5控制寄存器
{ //WR1;RD1;
I_start();
I_send(0xA0);
I_ack();
switch(x)//x0:秒, 1分 2时 3日 4月 5年
{
//case 0:I_send(0x02); break;
case 3:I_send(0x03); break;
case 4:I_send(0x04); break;
default:
{
I_send(x);
break;
}
}
I_ack();
I_send(bData);
I_ack();
I_stop();
}
BYTE time_rd(BYTE x)//x0:分 1时 2日 3月 4年
{
BYTE bData;
I_start();
I_send(0xA0);
I_ack();
switch(x)
{
//case 0:I_send(0x02);break;//x0:秒, 1分 2时 3日 4月 5年
case 3:I_send(0x03);break;
case 4:I_send(0x04);break;
default:
{
I_send(x);
break;
}
}
I_ack();
I_start();
I_send(0xA1);
I_ack();
bData = I_receive();
N_ack();
I_stop();
return bData;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -