EEPROM 24c02 [讀取存儲(chǔ)多字節(jié)]
先將數(shù)據(jù)存進(jìn)去,然后再讀出來顯示在數(shù)碼管上。
除了代碼里定義的連線外還要把p0連接到8位數(shù)碼管的8針上。
1 /*-----------------------------------------------
2 名稱:IIC協(xié)議 EEPROM24c02
3 內(nèi)容:此程序用于檢測EEPROM性能,測試方法如下:寫入24c02一些數(shù)據(jù),然后在內(nèi)存中清除這些數(shù)據(jù),
4 掉電后主內(nèi)存將失去這些信息,然后從24c02中調(diào)入這些數(shù)據(jù)??词欠衽c寫入的相同。
5 函數(shù)是采用軟件延時(shí)的方法產(chǎn)生SCL脈沖,固對高晶振頻率要作 一定的修改....(本例是1us機(jī)器
6 周期,即晶振頻率要小于12MHZ)
7 ------------------------------------------------*/
8 #include
9 #include
10
11 #define _Nop() _nop_() //定義空指令
12
13 // 常,變量定義區(qū)
14 unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
15 0x77,0x7c,0x39,0x5e,0x79,0x71};// 顯示段碼值0~F
16 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應(yīng)相應(yīng)的數(shù)碼管點(diǎn)亮,即位碼
17
18 sbit LATCH1=P2^2;
19 sbit LATCH2=P2^3;
20
21 sbit SDA=P2^1; //模擬I2C數(shù)據(jù)傳送位
22 sbit SCL=P2^0; //模擬I2C時(shí)鐘控制位
23
24 bit ack; //應(yīng)答標(biāo)志位
25
26 void DelayUs2x(unsigned char t);//函數(shù)聲明
27 void DelayMs(unsigned char t);
28 /*------------------------------------------------
29 uS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
30 unsigned char 是定義無符號字符變量,其值的范圍是
31 0~255 這里使用晶振12M,精確延時(shí)請使用匯編,大致延時(shí)
32 長度如下 T=tx2+5 uS
33 ------------------------------------------------*/
34 void DelayUs2x(unsigned char t)
35 {
36 while(--t);
37 }
38 /*------------------------------------------------
39 mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
40 unsigned char 是定義無符號字符變量,其值的范圍是
41 0~255 這里使用晶振12M,精確延時(shí)請使用匯編
42 ------------------------------------------------*/
43 void DelayMs(unsigned char t)
44 {
45
46 while(t--)
47 {
48 //大致延時(shí)1mS
49 DelayUs2x(245);
50 DelayUs2x(245);
51 }
52 }
53 /*------------------------------------------------
54 啟動(dòng)總線
55 ------------------------------------------------*/
56 void Start_I2c()
57 {
58 SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號
59 _Nop();
60 SCL=1;
61 _Nop(); //起始條件建立時(shí)間大于4.7us,延時(shí)
62 _Nop();
63 _Nop();
64 _Nop();
65 _Nop();
66 SDA=0; //發(fā)送起始信號
67 _Nop(); //起始條件鎖定時(shí)間大于4μ
68 _Nop();
69 _Nop();
70 _Nop();
71 _Nop();
72 SCL=0; //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
73 _Nop();
74 _Nop();
75 }
76 /*------------------------------------------------
77 結(jié)束總線
78 ------------------------------------------------*/
79 void Stop_I2c()
80 {
81 SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號
82 _Nop(); //發(fā)送結(jié)束條件的時(shí)鐘信號
83 SCL=1; //結(jié)束條件建立時(shí)間大于4μ
84 _Nop();
85 _Nop();
86 _Nop();
87 _Nop();
88 _Nop();
89 SDA=1; //發(fā)送I2C總線結(jié)束信號
90 _Nop();
91 _Nop();
92 _Nop();
93 _Nop();
94 }
95 /*----------------------------------------------------------------
96 字節(jié)數(shù)據(jù)傳送函數(shù)
97 函數(shù)原型: void SendByte(unsigned char c);
98 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
99 此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0 假)
100 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
101 ------------------------------------------------------------------*/
102 void SendByte(unsigned char c)
103 {
104 unsigned char BitCnt;
105
106 for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數(shù)據(jù)長度為8位
107 {
108 if((c< 109 else SDA=0; 110 _Nop(); 111 SCL=1; //置時(shí)鐘線為高,通知被控器開始接收數(shù)據(jù)位 112 _Nop(); 113 _Nop(); //保證時(shí)鐘高電平周期大于4μ 114 _Nop(); 115 _Nop(); 116 _Nop(); 117 SCL=0; 118 } 119 _Nop(); 120 _Nop(); 121 SDA=1; //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位 122 _Nop(); 123 _Nop(); 124 SCL=1; 125 _Nop(); 126 _Nop(); 127 _Nop(); 128 if(SDA==1)ack=0; 129 else ack=1; //判斷是否接收到應(yīng)答信號 130 SCL=0; 131 _Nop(); 132 _Nop(); 133 } 134 /*---------------------------------------------------------------- 135 字節(jié)數(shù)據(jù)傳送函數(shù) 136 函數(shù)原型: unsigned char RcvByte(); 137 功能: 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號), 138 發(fā)完后請用應(yīng)答函數(shù)。 139 ------------------------------------------------------------------*/ 140 unsigned char RcvByte() 141 { 142 unsigned char retc; 143 unsigned char BitCnt; 144 145 retc=0; 146 SDA=1; //置數(shù)據(jù)線為輸入方式 147 for(BitCnt=0;BitCnt<8;BitCnt++) 148 { 149 _Nop(); 150 SCL=0; //置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位 151 _Nop(); 152 _Nop(); //時(shí)鐘低電平周期大于4.7us 153 _Nop(); 154 _Nop(); 155 _Nop(); 156 SCL=1; //置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效 157 _Nop(); 158 _Nop(); 159 retc=retc<<1; 160 if(SDA==1)retc=retc+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 161 _Nop(); 162 _Nop(); 163 } 164 SCL=0; 165 _Nop(); 166 _Nop(); 167 return(retc); 168 } 169 /*---------------------------------------------------------------- 170 應(yīng)答子函數(shù) 171 原型: void Ack_I2c(void); 172 ----------------------------------------------------------------*/ 173 void Ack_I2c(void) 174 { 175 SDA=0; 176 _Nop(); 177 _Nop(); 178 _Nop(); 179 SCL=1; 180 _Nop(); 181 _Nop(); //時(shí)鐘低電平周期大于4μ 182 _Nop(); 183 _Nop(); 184 _Nop(); 185 SCL=0; //清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收 186 _Nop(); 187 _Nop(); 188 } 189 /*---------------------------------------------------------------- 190 非應(yīng)答子函數(shù) 191 原型: void NoAck_I2c(void); 192 ----------------------------------------------------------------*/ 193 void NoAck_I2c(void) 194 { 195 SDA=1; 196 _Nop(); 197 _Nop(); 198 _Nop(); 199 SCL=1; 200 _Nop(); 201 _Nop(); //時(shí)鐘低電平周期大于4μ 202 _Nop(); 203 _Nop(); 204 _Nop(); 205 SCL=0; //清時(shí)鐘線