EEPROM 24c02 [I2C代码封装-保存实现流水灯]
扫描二维码
随时随地手机看文章
这里把EEPROM 24c02封装起来,今后可以直接调用,其连线方式为:SDA-P2.1;SCL-P2.0;WP-VCC
>_<:i2c.c
1 /*-----------------------------------------------
2 名称:IIC协议
3 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器
4 周期,即晶振频率要小于12MHZ)
5 ------------------------------------------------*/
6 #include "i2c.h"
7 #define _Nop() _nop_() //定义空指令
8 bit ack; //应答标志位
9 sbit SDA=P2^1;
10 sbit SCL=P2^0;
11 /*------------------------------------------------
12 uS延时函数,含有输入参数 unsigned char t,无返回值
13 unsigned char 是定义无符号字符变量,其值的范围是
14 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
15 长度如下 T=tx2+5 uS
16 ------------------------------------------------*/
17 void DelayUs2x(unsigned char t)
18 {
19 while(--t);
20 }
21 /*------------------------------------------------
22 mS延时函数,含有输入参数 unsigned char t,无返回值
23 unsigned char 是定义无符号字符变量,其值的范围是
24 0~255 这里使用晶振12M,精确延时请使用汇编
25 ------------------------------------------------*/
26 void DelayMs(unsigned char t)
27 {
28 while(t--)
29 {
30 //大致延时1mS
31 DelayUs2x(245);
32 DelayUs2x(245);
33 }
34 }
35 /*------------------------------------------------
36 启动总线
37 ------------------------------------------------*/
38 void Start_I2c()
39 {
40 SDA=1; //发送起始条件的数据信号
41 _Nop();
42 SCL=1;
43 _Nop(); //起始条件建立时间大于4.7us,延时
44 _Nop();
45 _Nop();
46 _Nop();
47 _Nop();
48 SDA=0; //发送起始信号
49 _Nop(); //起始条件锁定时间大于4μ
50 _Nop();
51 _Nop();
52 _Nop();
53 _Nop();
54 SCL=0; //钳住I2C总线,准备发送或接收数据
55 _Nop();
56 _Nop();
57 }
58 /*------------------------------------------------
59 结束总线
60 ------------------------------------------------*/
61 void Stop_I2c()
62 {
63 SDA=0; //发送结束条件的数据信号
64 _Nop(); //发送结束条件的时钟信号
65 SCL=1; //结束条件建立时间大于4μ
66 _Nop();
67 _Nop();
68 _Nop();
69 _Nop();
70 _Nop();
71 SDA=1; //发送I2C总线结束信号
72 _Nop();
73 _Nop();
74 _Nop();
75 _Nop();
76 }
77 /*----------------------------------------------------------------
78 字节数据传送函数
79 函数原型: void SendByte(unsigned char c);
80 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
81 此状态位进行操作.(不应答或非应答都使ack=0 假)
82 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
83 ------------------------------------------------------------------*/
84 void SendByte(unsigned char c)
85 {
86 unsigned char BitCnt;
87 for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
88 {
89 if((c< 90 else SDA=0; 91 _Nop(); 92 SCL=1; //置时钟线为高,通知被控器开始接收数据位 93 _Nop(); 94 _Nop(); //保证时钟高电平周期大于4μ 95 _Nop(); 96 _Nop(); 97 _Nop(); 98 SCL=0; 99 } 100 _Nop(); 101 _Nop(); 102 SDA=1; //8位发送完后释放数据线,准备接收应答位 103 _Nop(); 104 _Nop(); 105 SCL=1; 106 _Nop(); 107 _Nop(); 108 _Nop(); 109 if(SDA==1)ack=0; 110 else ack=1; //判断是否接收到应答信号 111 SCL=0; 112 _Nop(); 113 _Nop(); 114 } 115 /*---------------------------------------------------------------- 116 字节数据传送函数 117 函数原型: unsigned char RcvByte(); 118 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 119 发完后请用应答函数。 120 ------------------------------------------------------------------*/ 121 unsigned char RcvByte() 122 { 123 unsigned char retc; 124 unsigned char BitCnt; 125 126 retc=0; 127 SDA=1; //置数据线为输入方式 128 for(BitCnt=0;BitCnt<8;BitCnt++) 129 { 130 _Nop(); 131 SCL=0; //置时钟线为低,准备接收数据位 132 _Nop(); 133 _Nop(); //时钟低电平周期大于4.7us 134 _Nop(); 135 _Nop(); 136 _Nop(); 137 SCL=1; //置时钟线为高使数据线上数据有效 138 _Nop(); 139 _Nop(); 140 retc=retc<<1; 141 if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中 142 _Nop(); 143 _Nop(); 144 } 145 SCL=0; 146 _Nop(); 147 _Nop(); 148 return(retc); 149 } 150 /*---------------------------------------------------------------- 151 应答子函数 152 原型: void Ack_I2c(void); 153 ----------------------------------------------------------------*/ 154 void Ack_I2c(void) 155 { 156 SDA=0; 157 _Nop(); 158 _Nop(); 159 _Nop(); 160 SCL=1; 161 _Nop(); 162 _Nop(); //时钟低电平周期大于4μ 163 _Nop(); 164 _Nop(); 165 _Nop(); 166 SCL=0; //清时钟线,钳住I2C总线以便继续接收 167 _Nop(); 168 _Nop(); 169 } 170 /*---------------------------------------------------------------- 171 非应答子函数 172 原型: void NoAck_I2c(void); 173 ----------------------------------------------------------------*/ 174 void NoAck_I2c(void) 175 { 176 SDA=1; 177 _Nop(); 178 _Nop(); 179 _Nop(); 180 SCL=1; 181 _Nop(); 182 _Nop(); //时钟低电平周期大于4μ 183 _Nop(); 184 _Nop(); 185 _Nop(); 186 SCL=0; //清时钟线,钳住I2C总线以便继续接收 187 _Nop(); 188 _Nop(); 189 } 190 /*---------------------------------------------------------------- 191 向无子地址器件发送字节数据函数 192 函数原型: bit ISendByte(unsigned char sla,ucahr c); 193 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla. 194 如果返回1表示操作成功,否则操作有误。 195 注意: 使用前必须已结束总线。 196 ----------------------------------------------------------------*/ 197 /*bit ISendByte(unsigned char sla,unsigned char c) 198 { 199 Start_I2c(); //启动总线 200 SendByte(sla); //发送器件地址 201 if(ack==0)return(0); 202 SendByte(c); //发送数据 20