EEPROM 24c02 [I2C代码封装-保存实现流水灯]

发布者:RadiantEnergy最新更新时间:2017-01-15 来源: eefocus关键字:EEPROM  24c02  流水灯 手机看文章 扫描二维码
随时随地手机看文章

这里把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);               //发送数据

203     if(ack==0)return(0);

204     Stop_I2c();                 //结束总线

205     return(1);

206 }

207 */

208 /*----------------------------------------------------------------

209 向有子地址器件发送多字节数据函数               

210 函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  

211 功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件

212 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。

213 如果返回1表示操作成功,否则操作有误。

214 注意:    使用前必须已结束总线。

215 ----------------------------------------------------------------*/

216 bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)

217 {

218     unsigned char i;

219     for(i=0;i

220     { 

221         Start_I2c();               //启动总线

222         SendByte(sla);             //发送器件地址

223         if(ack==0)return(0);

224         SendByte(suba);            //发送器件子地址

225         if(ack==0)return(0); 

226         

227         SendByte(*s);            //发送数据

228         

229         if(ack==0)return(0);

230         Stop_I2c();                  //结束总线

231         DelayMs(2);               //必须延时等待芯片内部自动处理数据完毕

232         s++;

233         suba++;

234     } 

235     return(1);

236 }

237 

238 /*----------------------------------------------------------------

239 向无子地址器件读字节数据函数               

240 函数原型: bit  IRcvByte(unsigned char sla,ucahr *c);  

241 功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地

242 址sla,返回值在c.

243 如果返回1表示操作成功,否则操作有误。

244 注意:    使用前必须已结束总线。

245 ----------------------------------------------------------------*/

246 /*bit IRcvByte(unsigned char sla,unsigned char *c)

247 {

248     Start_I2c();                //启动总线

249     SendByte(sla+1);            //发送器件地址

250     if(ack==0)return(0);

251     *c=RcvByte();               //读取数据

252     NoAck_I2c();              //发送非就答位

253     Stop_I2c();               //结束总线

254     return(1);

255 }

256 */

257 /*----------------------------------------------------------------

258 向有子地址器件读取多字节数据函数               

259 函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  

260 功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件

261 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。

262 如果返回1表示操作成功,否则操作有误。

263 注意:    使用前必须已结束总线。

264 ----------------------------------------------------------------*/

265 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)

266 {

267     unsigned char i;

268     

269     Start_I2c();               //启动总线

270     SendByte(sla);             //发送器件地址

271     if(ack==0)return(0);

272     SendByte(suba);            //发送器件子地址

273     if(ack==0)return(0);

274     

275     Start_I2c();

276     SendByte(sla+1);

277     if(ack==0)return(0);

278     

279     for(i=0;i

280     { 

281         *s=RcvByte();              //发送数据

282         Ack_I2c();                //发送就答位 

283         s++;

284     } 

285     *s=RcvByte();

286     NoAck_I2c();                 //发送非应位

287     Stop_I2c();                    //结束总线

288     return(1);

289 }


>_<:i2c.h



 1 /*-----------------------------------------------

 2   名称:IIC协议 头文件

 3 ------------------------------------------------*/  

 4 #ifndef __I2C_H__

 5 #define __I2C_H__           

 6 #include          //头文件的包含

 7 #include

 8 #define  _Nop()  _nop_()        //定义空指令

 9 /*-----------------------------------------------

10  uS延时函数,含有输入参数 unsigned char t,无返回值

11  unsigned char 是定义无符号字符变量,其值的范围是

12  0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

13  长度如下 T=tx2+5 uS 

14 ------------------------------------------------*/

15 void DelayUs2x(unsigned char t);

16 /*------------------------------------------------

17  mS延时函数,含有输入参数 unsigned char t,无返回值

18  unsigned char 是定义无符号字符变量,其值的范围是

19  0~255 这里使用晶振12M,精确延时请使用汇编

20 ------------------------------------------------*/

21 void DelayMs(unsigned char t);

22 /*------------------------------------------------

23                     启动总线

24 ------------------------------------------------*/

25 void Start_I2c();

26 /*------------------------------------------------

27                     结束总线

28 ------------------------------------------------*/

29 void Stop_I2c();

30 /*----------------------------------------------------------------

31                  字节数据传送函数               

32 函数原型: void  SendByte(unsigned char c);

33 功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对

34      此状态位进行操作.(不应答或非应答都使ack=0 假)     

35      发送数据正常,ack=1; ack=0表示被控器无应答或损坏。

36 ------------------------------------------------------------------*/

37 void  SendByte(unsigned char c);

38 /*----------------------------------------------------------------

39                  字节数据传送函数               

40 函数原型: unsigned char  RcvByte();

41 功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),

42      发完后请用应答函数。  

43 ------------------------------------------------------------------*/    

44 unsigned char  RcvByte();

45 /*----------------------------------------------------------------

46                      应答子函数

47 原型:  void Ack_I2c(void);

48 ----------------------------------------------------------------*/

49 void Ack_I2c(void);

50 /*----------------------------------------------------------------

51                      非应答子函数

52 原型:  void NoAck_I2c(void);

53 ----------------------------------------------------------------*/

54 void NoAck_I2c(void);

55 /*----------------------------------------------------------------

56                     向无子地址器件发送字节数据函数               

57 函数原型: bit  ISendByte(unsigned char sla,ucahr c);  

58 功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.

59            如果返回1表示操作成功,否则操作有误。

60 注意:    使用前必须已结束总线。

61 ----------------------------------------------------------------*/

62 bit ISendByte(unsigned char sla,unsigned char c);

63 

64 /*----------------------------------------------------------------

65                     向有子地址器件发送多字节数据函数               

66 函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  

67 功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件

68           地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。

69            如果返回1表示操作成功,否则操作有误。

70 注意:    使用前必须已结束总线。

71 ----------------------------------------------------------------*/

72 bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);

73 /*----------------------------------------------------------------

74                     向无子地址器件读字节数据函数               

75 函数原型: bit  IRcvByte(unsigned char sla,ucahr *c);  

76 功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地

77           址sla,返回值在c.

78            如果返回1表示操作成功,否则操作有误。

79 注意:    使用前必须已结束总线。

80 ----------------------------------------------------------------*/

81 bit IRcvByte(unsigned char sla,unsigned char *c);

82 /*----------------------------------------------------------------

83                     向有子地址器件读取多字节数据函数               

84 函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  

85 功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件

86           地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。

87            如果返回1表示操作成功,否则操作有误。

88 注意:    使用前必须已结束总线。

89 ----------------------------------------------------------------*/

90 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);

91 #endif


>_<:下面是main函数中如何调用封装好的函数来实现流水灯的效果的:

>_<:流水灯8个的连线这里用的是P1



 1 /*-----------------------------------------------

 2 名称:IIC协议 24c02存储花样灯程序

 3 内容:将表格内容写入24c02,然后批量删除这些数据,

 4 并从24c02中读取数据并显示

 5 ------------------------------------------------*/  

 6 #include                

 7 #include "i2c.h"

 8 /*------------------------------------------------

 9 花样灯表格

10 ------------------------------------------------*/

11 unsigned char      dat[]={0x7f,0xbf,0xdf,0xef,

12 0xf7,0xfb,0xfd,0xfe,

13 0xff,0xff,0x00,0x00,

14 0x55,0x55,0xaa,0xaa

15 };//ram允许情况可以无限添加

16 /*------------------------------------------------

17   主函数

18 ------------------------------------------------*/

19 main()

20 {

21     //bit flag;

22     unsigned char i;

23     ISendStr(0xae,80,dat,16);            //写入24c02

24     DelayMs(1);                          //写入后必须延时等待24c02内部

25     //烧录数据处理完毕方可继续其他操作

26     for(i=0;i<16;i++)                    //清除数据

27         dat[i]=0;

28     IRcvStr(0xae,80,dat,16);             //从24c02读出数据 

29     while(1)

30     {

31         for(i=0;i<16;i++)              //查表

32         {

33             DelayMs(200);

34             P1=dat[i];

35         }

36     }

37 }


 


关键字:EEPROM  24c02  流水灯 引用地址:EEPROM 24c02 [I2C代码封装-保存实现流水灯]

上一篇:SPI nRF24L01 无线简单程序 1
下一篇:EEPROM 24c02 [读取存储多字节]

推荐阅读最新更新时间:2024-03-16 15:30

新唐N76E003+GPRS 内部EEPROM读取故障排除手记
设计目的 将数组写入N76E003的eeprom中,然后再下次开机时读取。 出现问题 数据写入后再次读取,发现读取数据错误。通过断点跟踪调试,发现有如下错误,例如:上次写入是00 01 读取后编程了01 00。 分析问题 如下图代码所示,程序逻辑是: 1、从4700H开始读,每次读取8个字节,一共读取16次。 2、比较每一次取出的值,找到最大的那个值,即为最新值。 如果写入4700H地址的值是00 01 当block这个变量是0-7时,读取地址是4700H+(block 3) 问题就出在这里,程序原意是4700H+(block*8)即4700H+(block 3),由于手残写错了符号,造成的结果是在16次读
[单片机]
单片机电子时钟和led流水灯的结合(仿真+程序)
这是一个基于定时器的电子时钟,以前总是觉得数码管和LED挺简单的,谁知道组合起来还是有些困难的,但还是一一的解决了程序中的bug,新手也可以借鉴一下,感觉还挺有趣的。如果发现程序中有什么bug可以回帖相互探讨一下。 单片机源程序如下: #include reg52.H #include intrins.H #define uchar unsigned char #define uint unsigned int uchar code huayang1 ={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf};
[单片机]
单片机电子时钟和led<font color='red'>流水灯</font>的结合(仿真+程序)
STM8L读写EEPROM(24LC64)
使用24LC64(24XX64)是低功耗应用的EEPROM,存储容量 8K byte(64K bit),IIC 最大时钟频率400 KHz(24FC64达到1MHz),低功耗CMOS技术:工作电流 1 mA(典型)、 待机电流 1 μ A(典型),32字节的页写缓冲器,超过100万擦/写周期,数据保存 200年。 24C02只有8字节的页写缓冲器,操作的地址只有8位,而24LC64操作的地址包含高8位和低8位。两者的数据手册去区别如下: 1、AT24C02页写时序: 2、24LC64页写时序: STM8L的程序设计如下: (1)数据的页写操作: (2)数据的连续读取:
[单片机]
STM8L读写<font color='red'>EEPROM</font>(24LC64)
Linux-2.6.32.2内核在mini2440上的移植(十二)---移植I2C EEPROM驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 【1】在内核中配置I2C 驱动 Linux-2.6.32.2 对S2C2440 的I
[单片机]
stm32 i2c eeprom 24C02
电路图 举例 #define i2c_scl PBout(10) #define i2c_sda PBout(11) #define i2c_ack PBin(11) void I2C_init() { GPIO_InitTypeDef gpio10 = { GPIO_Pin_10, GPIO_Speed_50MHz, GPIO_Mode_Out_PP }; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //时钟使能 GPIO_Init(GPIOB, &gpio10); } void I2
[单片机]
stm32 i2c <font color='red'>eeprom</font> <font color='red'>24C02</font>
8个花样流水灯c程序
#include reg52.h #define uchar unsigned char #define uint unsigned int void delay(uint t)//延时函数 { uint x,y; for(x=t;x 0;x--) for(y=110;y 0;y--); } void main()//主函数 { uchar temp,i; while(1) { temp=0x01; //8盏灯单个亮向左移 for(i=0;i 8;i++) { P2=~temp; delay(50); temp =1; } temp=0x80; for(i=0;i 8;i++)//8盏
[单片机]
TQ210裸机编程(2)——LED流水灯
两个文件start.S和led.c start.S .global _start @声明一个全局的标号 _start: bl main @跳转到C函数去执行 halt: b halt @死循环 led.c #define GPC0CON *((volatile unsigned int *)0xE0200060) #define GPC0DAT *((volatile unsigned int *)0xE0200064) void delay(volatile unsigned int t) { volatile unsigned int t2 = 0xFFFF; while (t--) for (; t2; t2--); }
[单片机]
STC单片机EEPROM的读写程序
汇编语言写的,依据stc单片机官方提供的资料,测试ok,另外还有c语言的大家可到论坛去找。 stc的eeprom 功能还是不错的,可以简化我们的外围电路,但是缺点是是有就那就是写入速度太慢了,只能按扇区的写,不能字节写. 下面是代码 AUXR1 EQU 0A2H ISPDATA EQU 0E2H ISPADDRH EQU 0E3H ISPADDRL EQU 0E4H ISPCMD EQU 0E5H ISPTRIG EQU 0E6H ISPCONTR EQU 0E7H ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV AUXR1,#0 INC AUXR1 MOV DPTR,#2000H ACA
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved