51單片機 EEPROM 24c02 I2C代碼封裝保存實現(xiàn)流水燈
>_<:i2c.c
本文引用地址:http://www.ex-cimer.com/article/201611/318336.htm1 /*--2 名稱:IIC協(xié)議 3 內(nèi)容:函數(shù)是采用軟件延時的方法產(chǎn)生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延時函數(shù),含有輸入?yún)?shù) 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延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值23 unsigned char 是定義無符號字符變量,其值的范圍是24 0~255 這里使用晶振12M,精確延時請使用匯編25 */26 void DelayMs(unsigned char t)27 {28 while(t--)29 {30 //大致延時1mS31 DelayUs2x(245);32 DelayUs2x(245);33 }34 }35 /*36 啟動總線37 */38 void Start_I2c()39 {40 SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號41 _Nop();42 SCL=1;43 _Nop(); //起始條件建立時間大于4.7us,延時44 _Nop();45 _Nop();46 _Nop();47 _Nop(); 48 SDA=0; //發(fā)送起始信號49 _Nop(); //起始條件鎖定時間大于4μ50 _Nop();51 _Nop();52 _Nop();53 _Nop(); 54 SCL=0; //鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)55 _Nop();56 _Nop();57 }58 /*59 結(jié)束總線60 */61 void Stop_I2c()62 {63 SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號64 _Nop(); //發(fā)送結(jié)束條件的時鐘信號65 SCL=1; //結(jié)束條件建立時間大于4μ66 _Nop();67 _Nop();68 _Nop();69 _Nop();70 _Nop();71 SDA=1; //發(fā)送I2C總線結(jié)束信號72 _Nop();73 _Nop();74 _Nop();75 _Nop();76 }77 /*-78 字節(jié)數(shù)據(jù)傳送函數(shù) 79 函數(shù)原型: void SendByte(unsigned char c);80 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應答,并對81 此狀態(tài)位進行操作.(不應答或非應答都使ack=0 假) 82 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應答或損壞。83 */84 void SendByte(unsigned char c)85 {86 unsigned char BitCnt;87 for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數(shù)據(jù)長度為8位88 {89 if((c<
>_<:i2c.h
1 /*--2 名稱:IIC協(xié)議 頭文件3 */ 4 #ifndef __I2C_H__5 #define __I2C_H__ 6 #include//頭文件的包含7 #include 8 #define _Nop() _nop_() //定義空指令9 /*--10 uS延時函數(shù),含有輸入?yún)?shù) 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延時函數(shù),含有輸入?yún)?shù) 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 結(jié)束總線28 */29 void Stop_I2c();30 /*-31 字節(jié)數(shù)據(jù)傳送函數(shù) 32 函數(shù)原型: void SendByte(unsigned char c);33 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應答,并對34 此狀態(tài)位進行操作.(不應答或非應答都使ack=0 假) 35 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應答或損壞。36 */37 void SendByte(unsigned char c);38 /*-39 字節(jié)數(shù)據(jù)傳送函數(shù) 40 函數(shù)原型: unsigned char RcvByte();41 功能: 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應答信號),42 發(fā)完后請用應答函數(shù)。 43 */ 44 unsigned char RcvByte();45 /*-46 應答子函數(shù)47 原型: void Ack_I2c(void);48 -*/49 void Ack_I2c(void);50 /*-51 非應答子函數(shù)52 原型: void NoAck_I2c(void);53 -*/54 void NoAck_I2c(void);55 /*-56 向無子地址器件發(fā)送字節(jié)數(shù)據(jù)函數(shù) 57 函數(shù)原型: bit ISendByte(unsigned char sla,ucahr c); 58 功能: 從啟動總線到發(fā)送地址,數(shù)據(jù),結(jié)束總線的全過程,從器件地址sla.59 如果返回1表示操作成功,否則操作有誤。60 注意: 使用前必須已結(jié)束總線。61 -*/62 bit ISendByte(unsigned char sla,unsigned char c);63 64 /*-65 向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)函數(shù) 66 函數(shù)原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); 67 功能: 從啟動總線到發(fā)送地址,子地址,數(shù)據(jù),結(jié)束總線的全過程,從器件68 地址sla,子地址suba,發(fā)送內(nèi)容是s指向的內(nèi)容,發(fā)送no個字節(jié)。69 如果返回1表示操作成功,否則操作有誤。70 注意: 使用前必須已結(jié)束總線。71 -*/72 bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);73 /*-74 向無子地址器件讀字節(jié)數(shù)據(jù)函數(shù) 75 函數(shù)原型: bit IRcvByte(unsigned char sla,ucahr *c); 76 功能: 從啟動總線到發(fā)送地址,讀數(shù)據(jù),結(jié)束總線的全過程,從器件地77 址sla,返回值在c.78 如果返回1表示操作成功,否則操作有誤。79 注意: 使用前必須已結(jié)束總線。80 -*/81 bit IRcvByte(unsigned char sla,unsigned char *c);82 /*-83 向有子地址器件讀取多字節(jié)數(shù)據(jù)函數(shù) 84 函數(shù)原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); 85 功能: 從啟動總線到發(fā)送地址,子地址,讀數(shù)據(jù),結(jié)束總線的全過程,從器件86 地址sla,子地址suba,讀出的內(nèi)容放入s指向的存儲區(qū),讀no個字節(jié)。87 如果返回1表示操作成功,否則操作有誤。88 注意: 使用前必須已結(jié)束總線。89 -*/90 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);91 #endif
>_<:下面是main函數(shù)中如何調(diào)用封裝好的函數(shù)來實現(xiàn)流水燈的效果的:
>_<:流水燈8個的連線這里用的是P1
1 /*--2 名稱:IIC協(xié)議 24c02存儲花樣燈程序3 內(nèi)容:將表格內(nèi)容寫入24c02,然后批量刪除這些數(shù)據(jù),4 并從24c02中讀取數(shù)據(jù)并顯示5 */ 6 #include7 #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,0xaa15 };//ram允許情況可以無限添加16 /*17 主函數(shù)18 */19 main()20 {21 //bit flag;22 unsigned char i;23 ISendStr(0xae,80,dat,16); //寫入24c0224 DelayMs(1); //寫入后必須延時等待24c02內(nèi)部25 //燒錄數(shù)據(jù)處理完畢方可繼續(xù)其他操作26 for(i=0;i<16;i++) //清除數(shù)據(jù)27 dat[i]=0;28 IRcvStr(0xae,80,dat,16); //從24c02讀出數(shù)據(jù) 29 while(1)30 {31 for(i=0;i<16;i++) //查表32 {33 DelayMs(200);34 P1=dat[i];35 }36 }37 }
評論