📄 i2c.lst
字号:
215 char GetKeyValue(void);
216 void WaitKeyOff(void);
217 extern bit FlashFlag,Flag500ms;
218 extern unsigned char C_1s;
219
220 unsigned char Input(unsigned char x,unsigned char y,unsigned char ch,unsigned char Min,unsigned char Max)
221 {
222 1 char i,temp;
223 1 unsigned char loc,Value;
224 1 C_1s=30;
225 1 loc=x;
226 1 Value=ch%100;
227 1 LCD_DispChar(x,y,ch/16);
228 1 LCD_DispChar(x+1,y,ch%16);
229 1 while (C_1s)
230 1 {
231 2 i=GetKeyValue();
232 2 if (Flag500ms)
233 2 {
234 3 Flag500ms=0;
235 3 if (FlashFlag)
236 3 {
237 4 if (loc==x)
238 4 {
239 5 LCD_DispChar(loc,y,Value/16);
240 5 }
241 4 else
C51 COMPILER V7.02b I2C 12/21/2002 22:32:37 PAGE 5
242 4 {
243 5 LCD_DispChar(loc,y,Value%16);
244 5 }
245 4 }
246 3 else
247 3 {
248 4 if (loc==x)
249 4 {
250 5 LCD_DispChar(loc,y,0xc);
251 5 }
252 4 else
253 4 {
254 5 LCD_DispChar(loc,y,0xc);
255 5 }
256 4 }
257 3 }
258 2 if (i!=-1)
259 2 {
260 3 WaitKeyOff();
261 3 C_1s=30;
262 3 if (i<=9) //按下的是数字键
263 3 {
264 4 if (loc==x)
265 4 {
266 5 temp=Value%16+i*16;
267 5 if ((temp<=Max)&&(temp>=Min)) //输入十位有效
268 5 {
269 6 LCD_DispChar(loc,y,i);loc+=8;
270 6 Value=temp;
271 6 }
272 5 }
273 4 else
274 4 {
275 5 temp=(Value/16)*16+i;
276 5 if ((temp<=Max)&&(temp>=Min)) //输入个位有效
277 5 {
278 6 LCD_DispChar(loc,y,i);loc=x;
279 6 Value=temp;
280 6 }
281 5 }
282 4 }
283 3 if (i==0xf) //按下"F"键
284 3 {
285 4 LCD_DispChar(x,y,Value/16);
286 4 LCD_DispChar(x+1,y,Value%16);
287 4 return Value;
288 4 }
289 3 if (i==0xd) //按下"D"键
290 3 {
291 4 LCD_DispChar(x,y,ch/16);
292 4 LCD_DispChar(x+1,y,ch%16);
293 4 return ch;
294 4 }
295 3 }
296 2 }
297 1 LCD_DispChar(x,y,ch/16);
298 1 LCD_DispChar(x+1,y,ch%16);
299 1 return 0xff;
300 1 }
301
302 void SetTime(void)
303 {
C51 COMPILER V7.02b I2C 12/21/2002 22:32:37 PAGE 6
304 1 char KeyValue;
305 1 char ch;
306 1 for (;;)
307 1 {
308 2 KeyValue=GetKeyValue();
309 2 switch (KeyValue)
310 2 {
311 3 case -1:
312 3 break;
313 3 case 0xf: //"F"键设置时间
314 3 ch=Input(0,2,RealTime.RT.Hour,0,0x23);
315 3 if (ch!=0xff)
316 3 {
317 4 RealTime.RT.Hour=ch;
318 4 }
319 3 ch=Input(24,2,RealTime.RT.Minute,0,0x59);
320 3 if (ch!=0xff)
321 3 {
322 4 RealTime.RT.Minute=ch;
323 4 }
324 3 ch=Input(48,2,RealTime.RT.Second,0,0x59);
325 3 if (ch!=0xff)
326 3 {
327 4 RealTime.RT.Second=ch;
328 4 }
329 3
330 3 ch=Input(0,4,RealTime.RT.Year,0,0x20);
331 3 if (ch!=0xff)
332 3 {
333 4 RealTime.RT.Year=ch;
334 4 }
335 3 ch=Input(24,4,RealTime.RT.Month,0x1,0x12);
336 3 if (ch!=0xff)
337 3 {
338 4 RealTime.RT.Month=ch;
339 4 }
340 3 ch=Input(48,4,RealTime.RT.Day,0x1,0x31);
341 3 if (ch!=0xff)
342 3 {
343 4 RealTime.RT.Day=ch;
344 4 }
345 3 SetRealClock();
346 3 return;
347 3 case 0xd: //"D"键忽略设置
348 3 return;
349 3 default:
350 3 break;
351 3 }
352 2 WaitKeyOff();
353 2 }
354 1 }
355
356 void TestI2C (void)
357 {
358 1 unsigned char var ;
359 1 char KeyValue;
360 1 WDTCN = 0xde; // disable watchdog timer
361 1 WDTCN = 0xad;
362 1
363 1 OSCICN |= 0x03; // Set internal oscillator to highest setting
364 1 // (16 MHz)
365 1
C51 COMPILER V7.02b I2C 12/21/2002 22:32:37 PAGE 7
366 1 XBR0 |= 0x07; // Route SMBus to GPIO pins through crossbar
367 1 XBR2 |= 0x44; // Enable crossbar and weak pull-ups
368 1
369 1 P0MDOUT |= 0x1D;
370 1 P1MDOUT |= 0x01;
371 1
372 1 SMB0CN = 0x44; // Enable SMBus with ACKs on acknowledge cycle
373 1 SMB0CR = -80; // SMBus clock rate = 100kHz.
374 1
375 1 EIE1 |= 2; // SMBus interrupt enable
376 1 EA = 1; // Global interrupt enable
377 1
378 1 SM_BUSY = 0; // Free SMBus for first transfer.
379 1
380 1 // SetRealClockINT1(0x8000);
381 1 var = GetRealClockStatus();
382 1 ResetRealClock();
383 1 var = GetRealClockStatus();
384 1 SetRealClockStatus(0xC2); //24小时制
385 1 var = GetRealClockStatus();
386 1 GetRealClock();
387 1 /* RealTime.RT.Year=0x02;
388 1 RealTime.RT.Month=0x06;
389 1 RealTime.RT.Day=0x05;
390 1 RealTime.RT.Week=0x02;
391 1 RealTime.RT.Hour=0x11;
392 1 RealTime.RT.Minute=0x14;
393 1 RealTime.RT.Second=0x45;
394 1 */ SetRealClock();
395 1 GetRealClock();
396 1 InitLCD();
397 1 LCD_WriteHZ(0,1,Shi);
398 1 LCD_WriteHZ(2,1,Zhong);
399 1 //在0,2处显示00:00:00
400 1 LCD_DispChar(0,2,0); //128*64 取值x=0-128 y=0-8
401 1 LCD_DispChar(8,2,0);
402 1 LCD_DispChar(16,2,0xa);
403 1 LCD_DispChar(24,2,0);
404 1 LCD_DispChar(32,2,0);
405 1 LCD_DispChar(40,2,0xa);
406 1 LCD_DispChar(48,2,0);
407 1 LCD_DispChar(56,2,0);
408 1 //在0,4处显示02/01/01
409 1 LCD_DispChar(0,4,0); //128*64 取值x=0-128 y=0-8
410 1 LCD_DispChar(8,4,2);
411 1 LCD_DispChar(16,4,0xb);
412 1 LCD_DispChar(24,4,0);
413 1 LCD_DispChar(32,4,1);
414 1 LCD_DispChar(40,4,0xb);
415 1 LCD_DispChar(48,4,0);
416 1 LCD_DispChar(56,4,1);
417 1 for (;;)
418 1 {
419 2 KeyValue=GetKeyValue();
420 2 switch (KeyValue)
421 2 {
422 3 case -1:
423 3 break;
424 3 case 0xf: //"F"键设置时间
425 3 {
426 4 LCD_WriteHZ(0,1,xiu);
427 4 LCD_WriteHZ(2,1,gai);
C51 COMPILER V7.02b I2C 12/21/2002 22:32:37 PAGE 8
428 4 LCD_WriteHZ(4,1,Shi);
429 4 LCD_WriteHZ(6,1,Zhong);
430 4 SetTime();
431 4 LCD_WriteHZ(0,1,Shi);
432 4 LCD_WriteHZ(2,1,Zhong);
433 4 LCD_WriteHZ(4,1,Blank);
434 4 LCD_WriteHZ(6,1,Blank);
435 4 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -