📄 i2c.lst
字号:
157 BYTE_NUMBER = 2;
158 COMMAND = (CLOCK3530_ADDRESS_INT1 | WRITE);
159 I2CDataBuff = (unsigned char*)&Int1;
160 STA = 1; // Start transfer
161 }
162 */
163 #include "INTRINS.H"
164
165 unsigned char revolve(unsigned char val)
166 {
167 1 char i;
168 1 unsigned char val1=0;
169 1 for (i=0;i<8;i++)
170 1 {
171 2 if (val&0x1)
172 2 val1++;
173 2 val1=_crol_(val1,1);
174 2 val=_cror_(val,1);
175 2 }
176 1 val1=_cror_(val1,1);
177 1 return val1;
178 1 }
179
C51 COMPILER V6.23a I2C 12/20/2002 12:46:27 PAGE 4
180 /*-- 文字: 时 --*/
181
182 char code Shi[]=
183 {
184 0x00,0x00,0xFC,0x44,0x44,0xFC,0x00,0x08,0x48,0x88,0x08,0xFF,0x08,0x08,0x08,0x00,
185 0x00,0x00,0x1F,0x04,0x04,0x0F,0x00,0x00,0x00,0x11,0x20,0x1F,0x00,0x00,0x00,0x00,
186 };
187
188 /*-- 文字: 钟 --*/
189 char code Zhong[]=
190 {
191 0x00,0x60,0x38,0xE7,0x24,0x24,0x04,0x00,0xF8,0x88,0x88,0xFF,0x88,0x88,0xF8,0x00,
192 0x00,0x01,0x01,0x3F,0x11,0x09,0x01,0x00,0x01,0x00,0x00,0x3F,0x00,0x00,0x01,0x00,
193 };
194
195
196 void LCD_WriteHZ(char x,char y,char *Dot);
197 void LCD_DispChar(char x,char y,char ch); //128*64 取值x=0-128 y=0-8
198 void InitLCD(void);
199 void Delay1ms(unsigned char T);
200
201 void TestI2C (void)
202 {
203 1 unsigned char var ;
204 1 WDTCN = 0xde; // disable watchdog timer
205 1 WDTCN = 0xad;
206 1
207 1 OSCICN |= 0x03; // Set internal oscillator to highest setting
208 1 // (16 MHz)
209 1
210 1 XBR0 |= 0x07; // Route SMBus to GPIO pins through crossbar
211 1 XBR2 |= 0x44; // Enable crossbar and weak pull-ups
212 1
213 1 P0MDOUT |= 0x1D;
214 1 P1MDOUT |= 0x01;
215 1
216 1 SMB0CN = 0x44; // Enable SMBus with ACKs on acknowledge cycle
217 1 SMB0CR = -80; // SMBus clock rate = 100kHz.
218 1
219 1 EIE1 |= 2; // SMBus interrupt enable
220 1 EA = 1; // Global interrupt enable
221 1
222 1 SM_BUSY = 0; // Free SMBus for first transfer.
223 1
224 1 // SetRealClockINT1(0x8000);
225 1 var = GetRealClockStatus();
226 1 ResetRealClock();
227 1 var = GetRealClockStatus();
228 1 SetRealClockStatus(0xc2);
229 1 var = GetRealClockStatus();
230 1 GetRealClock();
231 1 RealTime.RT.Year=0x02;
232 1 RealTime.RT.Month=0x12;
233 1 RealTime.RT.Day=0x010;
234 1 RealTime.RT.Week=0x05;
235 1 RealTime.RT.Hour=0x11;
236 1 RealTime.RT.Minute=0x59;
237 1 RealTime.RT.Second=0x57;
238 1 SetRealClock();
239 1 GetRealClock();
240 1 InitLCD();
241 1 LCD_WriteHZ(0,0,Shi);
C51 COMPILER V6.23a I2C 12/20/2002 12:46:27 PAGE 5
242 1 LCD_WriteHZ(16,0,Zhong);
243 1 //在0,2处显示00:00:00
244 1 LCD_DispChar(0,2,0); //128*64 取值x=0-128 y=0-8
245 1 LCD_DispChar(8,2,0);
246 1 LCD_DispChar(16,2,10);
247 1 LCD_DispChar(24,2,0);
248 1 LCD_DispChar(32,2,0);
249 1 LCD_DispChar(40,2,0xa);
250 1 LCD_DispChar(48,2,0);
251 1 LCD_DispChar(56,2,0);
252 1 //在0,4处显示02/01/01
253 1 LCD_DispChar(0,4,0); //128*64 取值x=0-128 y=0-8
254 1 LCD_DispChar(8,4,2);
255 1 LCD_DispChar(16,4,0xb);
256 1 LCD_DispChar(24,4,0);
257 1 LCD_DispChar(32,4,1);
258 1 LCD_DispChar(40,4,0xb);
259 1 LCD_DispChar(48,4,0);
260 1 LCD_DispChar(56,4,1);
261 1 for (;;)
262 1 {
263 2 GetRealClock();
264 2
265 2 LCD_DispChar(0,2,(RealTime.RT.Hour>>4)&0x03);//(RealTime.RT.Hour>>4)&0x0f); //128*64 取值x=0-128 y=0-8
266 2 LCD_DispChar(8,2,RealTime.RT.Hour&0x0f);
267 2 LCD_DispChar(24,2,(RealTime.RT.Minute>>4)&0x0f);
268 2 LCD_DispChar(32,2,RealTime.RT.Minute&0x0f);
269 2 LCD_DispChar(48,2,(RealTime.RT.Second>>4)&0x0f);
270 2 LCD_DispChar(56,2,RealTime.RT.Second&0x0f);
271 2 //在0,4处显示02/01/01
272 2 LCD_DispChar(0,4,(RealTime.RT.Year>>4)&0x0f);
273 2 LCD_DispChar(8,4,RealTime.RT.Year&0x0f);
274 2 LCD_DispChar(24,4,(RealTime.RT.Month>>4)&0x0f);
275 2 LCD_DispChar(32,4,RealTime.RT.Month&0x0f);
276 2 LCD_DispChar(48,4,(RealTime.RT.Day>>4)&0x0f);
277 2 LCD_DispChar(56,4,RealTime.RT.Day&0x0f);
278 2 Delay1ms(100);
279 2 }
280 1 }
281
282
283 //------------------------------------------------------------------------------------
284 // Interrupt Service Routine
285 //------------------------------------------------------------------------------------
286 void SMBUS_ISR (void) interrupt 7
287 {
288 1 switch (SMB0STA)
289 1 { // SMBus 状态码SMB0STA 寄存器
290 2 // 主发送器/接收器起始条件已发送
291 2 case SMB_START:
292 2 SMB0DAT = COMMAND ; // 装入要访问的从器件的地址
293 2 STA = 0; // 手动清除START 位
294 2 break;
295 2 //主发送器/接收器重复起始条件已发送
296 2 // 该状态只应在读操作期间出现在存储器地址已发送并得到确认之后 ?
297 2 case SMB_RP_START:
298 2 SMB0DAT = COMMAND; // COMMAND 中应保持从地址 + R.
299 2 STA = 0;
300 2 break;
301 2 // 主发送器从地址 + WRITE 已发送收到ACK
302 2 case SMB_MTADDACK:
303 2 // 主发送器数据字节已发送收到ACK
C51 COMPILER V6.23a I2C 12/20/2002 12:46:27 PAGE 6
304 2 case SMB_MTDBACK:
305 2 if (BYTE_NUMBER)
306 2 {
307 3 SMB0DAT = revolve(*I2CDataBuff); // If R/W=WRITE, load byte to write.
308 3 I2CDataBuff++;
309 3 BYTE_NUMBER--;
310 3 }
311 2 else
312 2 {
313 3 STO = 1; SM_BUSY = 0; // Free SMBus
314 3 }
315 2 break;
316 2 // 主发送器从地址 + WRITE 已发送收到NACK
317 2 // 从器件不应答发送STOP + START 重试
318 2 case SMB_MTADDNACK:
319 2 STO = 1; STA = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -