📄 i2c.c
字号:
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
//#define unsigned char uchar
//#define unsigned int uint
#define _Nop() _nop_()
bit ack;
sbit WP=P0^3;
sbit SCL=P0^4;
sbit SDA=P0^5;
sbit JK=P0^0;
void delay();
void start_i2c();
void stop_i2c();
void write_b(uchar);
char read_b();
void ack_i2c(bit a);
bit mcu_write_b(char sla,char c);
bit mcu_write_str(char sla,char suba,char *s,char no);
bit mcu_read_b(char sla,char *c);
bit mcu_read_str(char sla,char suba,char *s,char no);
char i2c_write_[10]={0,1,2,03,4,5,6,7,8,9};
char led_dm[10]={0x3f,0x03,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main()
{
char i2c_rec[10];
char i;
// char *j;
WP=0;//器件不进行写保护//
JK=1;
delay();
delay();
do
{
if(mcu_write_b(0xa0,0x01))
JK=0;
else
JK=1;
delay();
delay();
// JK=0;
/*
if(mcu_write_str(0xa1,0x10,i2c_write_,10))
JK=1;
else
JK=0;
delay();
if(mcu_read_str(0xa0,0x10,i2c_rec,10))
JK=0;
else
JK=1;
delay();
for(i=0;i<10;i++)
{
P2=0x00;
P1=led_dm[i2c_rec[i]];
delay();
delay();
}
*/
}while(JK);
}
void start_i2c()//启动信号
{
SDA=1;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
_Nop();
_Nop();
}
void stop_i2c()//停止信号
{
SDA=0;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
}
void write_b(char c)//发送一个字节到EEPROM
{
char bitcnt;
for(bitcnt=0;bitcnt<8;bitcnt++)
{
if((c<<bitcnt)&0x80)//判断数据位上是"1"还是"0"
SDA=1;
else
SDA=0;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1;
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA=1)ack=0;//判断EEPROM是否回复应答信号
else ack=1;
SCL=0;
_Nop();
_Nop();
_Nop();
}
char read_b()//接受EEPROM发送过来的一个字节
{
char retc;
char bitcnt;
retc=0;
SDA=1;
for(bitcnt=0;bitcnt<8;bitcnt++)
{
_Nop();
SCL=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1;
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}
void ack_i2c(bit a)//发送应答信号或是非应答信号
{
if(a==0)SDA=0;
else SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
_Nop();
_Nop();
}
bit mcu_write_b(char sla,char c)//向i2c器件中送入一字节
{
start_i2c();
write_b(sla);
if(ack==0)return(0);
write_b(c);
if(ack==0)return(0);
stop_i2c();
return(1);
}
bit mcu_write_str(char sla,char suba,char *s,char no)//向i2c器件的指定地址中写入no个数据
{
char i;
start_i2c();
write_b(sla);
if(ack==0)return(0);
write_b(suba);
if(ack==0)return(0);
for(i=0;i<no;i++)
{
write_b(*s);
if(ack==0)return(0);
s++;
}
stop_i2c();
return(1);
}
bit mcu_read_b(char sla,char *c)//接收一个字节
{
start_i2c();
write_b(sla+1);
if(ack==0)return(0);
*c=read_b();
ack_i2c(1);
stop_i2c();
return(1);
}
bit mcu_read_str(char sla,char suba,char *s,char no)//从器件的指定地址中读取no个数据
{
char i;
start_i2c();
write_b(sla);
if(ack==0)return(0);
write_b(suba);
if(ack==0)return(0);
start_i2c();
write_b(sla+1);
if(ack==0)return(0);
for(i=0;i<no-1;i++)
{
*s=read_b();
ack_i2c();
s++;
}
*s=read_b();
ack_i2c(1);
stop_i2c();
return(1);
}
void delay()
{
int i;
for(i=10000;i>0;i--)
{;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -