📄 zlg7290.lst
字号:
259 for ( i=0; i<SubMod; i++ )
260 {
261 I2C_Write(a[i]);
262 if ( I2C_GetAck() )
263 {
264 I2C_Stop();
265 return 1;
266 }
267 }
268 //发送数据
269 do
270 {
271 I2C_Write(*dat++);
272 if ( I2C_GetAck() ) break;
273 } while ( --Size != 0 );
274 //发送完毕,停止I2C总线,并返回结果
275 I2C_Stop();
276 if ( Size == 0 )
277 {
278 return 0;
279 }
280 else
281 {
282 return 1;
283 }
284 }
285
286 /*
287 函数:I2C_Gets()
288 功能:I2C总线综合接收函数,从从机接收多个字节的数据
289 参数:
290 SlaveAddr:从机地址(7位纯地址,不含读写位)
291 SubAddr:从机的子地址
292 SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
293 *dat:保存接收到的数据
294 Size:数据的字节数
295 返回:
296 0:接收成功
297 1:在接收过程中出现异常
298 说明:
299 本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
300 当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
301 */
302 bit I2C_Gets(unsigned char SlaveAddr,unsigned int SubAddr,unsigned char SubMod,uchar *dat,unsigned int Siz
C51 COMPILER V6.12 ZLG7290 07/01/2008 10:48:12 PAGE 6
-e)
303 {
*** WARNING C235 IN LINE 303 OF .\ZLG7290.C: parameter 5: different types
304 1
305 1 unsigned char i;
306 1 uchar a[3];
307 1 if (Size==0)return 0;
308 1 a[0]=(SlaveAddr<<1);
309 1
310 1 if (SubMod >2 )SubMod = 2;
311 1
312 1 if ( SubMod != 0 )
313 1 {
314 2
315 2 if (SubMod==1)
316 2 {
317 3 a[1]=(uchar)(SubAddr);
318 3 }
319 2 else
320 2 {
321 3 a[1]=(uchar)(SubAddr >>8);
322 3 a[2]=(uchar)(SubAddr);
323 3 }
324 2
325 2 SubMod++;
326 2 I2C_Start();
327 2 for ( i=0; i<SubMod; i++ )
328 2 {
329 3 I2C_Write(a[i]);
330 3 if (I2C_GetAck())
331 3 {
332 4 I2C_Stop();
333 4 return 1;
334 4 }
335 3 }
336 2 }
337 1
338 1 I2C_Start();
339 1 I2C_Write(a[0]+1);
340 1 if ( I2C_GetAck() )
341 1 {
342 2 I2C_Stop();
343 2 return 1;
344 2 }
345 1 //接收数据
346 1 for (;;)
347 1 {
348 2 *dat++ = I2C_Read();
349 2 if (--Size==0 )
350 2 {
351 3 I2C_PutAck(1);
352 3 break;
353 3 }
354 2 I2C_PutAck(0);
355 2 }
356 1 //接收完毕,停止I2C总线,并返回结果
357 1 I2C_Stop();
358 1 return 0;
359 1 }
360
361 /*
362 函数:ZLG7290_ReadReg()
C51 COMPILER V6.12 ZLG7290 07/01/2008 10:48:12 PAGE 7
363 功能:从ZLG7290的某个内部寄存器读出数据
364 参数:
365 RegAddr:ZLG7290的内部寄存器地址
366 *dat:保存读出的数据
367 返回:
368 0:正常
369 1:访问ZLG7290时出现异常
370 */
371 bit ZLG7290_ReadReg(unsigned char RegAddr, uchar *dat)
372 {
373 1 bit b;
374 1 b=I2C_Gets(ZLG7290_I2C_ADDR,RegAddr,1,dat,1);
375 1 return b;
376 1 }
377
378
379
380 /*------------------初始化-----------------*/
381 void init_lcd (void)
382 {
383 1 wr_lcd (comm,0x30); /*30---基本指令动作*/
384 1 wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
385 1 wr_lcd (comm,0x06); /*光标的移动方向*/
386 1 wr_lcd (comm,0x0c); /*开显示,关游标*/
387 1 }
388 /*---------------显示汉字或字符----------------*/
389 void chn_disp (uchar code *chn,uchar j,uchar ad)
390 {
*** WARNING C236 IN LINE 390 OF .\ZLG7290.C: '_chn_disp': different length of parameter lists
391 1 uchar i=0;
392 1 wr_lcd(comm,0x30);
393 1 if(j==0) wr_lcd(comm,(0x80+ad));
394 1 else wr_lcd(comm,(0x90+ad));
395 1 while((chn[i]!='\0')&&(i<(16-ad)))
396 1 {
397 2 wr_lcd(dat1,chn[i]);
398 2 i++;
399 2 }
400 1 }
401 /*--------------清DDRAM------------------*/
402 void clrram (void)
403 {
404 1 wr_lcd (comm,0x30);
405 1 wr_lcd (comm,0x01);
406 1 }
407 /*---------------------------------------*/
408 void wr_lcd (uchar dat_comm,uchar content)
409 {
410 1 chk_busy ();
411 1 if(dat_comm)
412 1 {
413 2 rs=1; //data
414 2 rw=0; //write
415 2 }
416 1 else
417 1 {
418 2 rs=0; //command
419 2 rw=0; //write
420 2 }
421 1 P0=content; //output data or comm
422 1 e=1;
423 1
C51 COMPILER V6.12 ZLG7290 07/01/2008 10:48:12 PAGE 8
424 1 e=0;
425 1 }
426
427 void chk_busy (void)
428 {
429 1 P0=0xff;
430 1 rs=0;
431 1 rw=1;
432 1 e =1;
433 1 while(busy==1);
434 1 e =0;
435 1 }
436 /*---------------------------------------*/
437 void delay (uint us) //delay time
438 {
439 1 while(us--);
440 1 }
441
442
443 /*void delay1 (uint ms)
444 {
445 uint i,j;
446 for(i=0;i<ms;i++)
447 for(j=0;j<15;j++)
448 delay(1);
449 }
450 /*******************************************************************
451 函数:INT0_SVC()
452 功能:ZLG7290 键盘中断服务程序
453 说明:中断触发方式选择负边沿触发,因此不必等待中断请求信号恢复为高电平
454 ********************************************************************/
455 void INT0_SVC() interrupt 0 using 1
456 {
457 1 flagint0=1;
458 1 }
459 /*------------------主程序--------------------*/
460 void main()
461 {
462 1 unsigned char key;
463 1 uchar *p;
464 1 uchar i=0;
465 1 init_lcd();
466 1 chn_disp(tab1,0,0);
467 1 delay(1000);
468 1 EA=0;
469 1 IT0=1;
470 1 IE0=1;
471 1 EX0=1;
472 1 SCON=0x50;//串行方式2
473 1 TMOD=0x20;
474 1 TH1=0xd8;
475 1 TL1=0xd8;
476 1 EA=1;
477 1 for(;;)
478 1 {
479 2
480 2 if(flagint0==1)
481 2 {
482 3 flagint0=0;
483 3 TR1=1;
484 3
485 3 ZLG7290_ReadReg(ZLG7290_Key,&key);
C51 COMPILER V6.12 ZLG7290 07/01/2008 10:48:12 PAGE 9
486 3 switch(key)
487 3 {
488 4 case 5:
489 4 case 6:
490 4 case 7:
491 4 case 8:p[i]=key+43;wr_lcd(dat1,p[i]);delay(100);p++;break;
492 4 case 13:
493 4 case 14:
494 4 case 15:
495 4 case 16:p[i]=key+39;wr_lcd(dat1,p[i]);delay(100);p++;break;
496 4 case 21:
497 4 case 22:p[i]=key+35;wr_lcd(dat1,p[i]);delay(100);p++;break;
498 4 case 23:p[i]='.';wr_lcd (dat1,p[i]);delay(100);p++;break;
499 4 case 29:EA=0;break;
500 4 case 30:init_lcd();chn_disp(tab1,0,0);delay(1000);break;
501 4 case 31:clrram();break;
502 4 }
503 3 }
504 2 i++;
505 2 }
506 1
507 1 }
508
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 750 ----
CONSTANT SIZE = 18 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 24
IDATA SIZE = ---- ----
BIT SIZE = 1 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 2 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -