⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zlg7290.lst

📁 周立功的zlg7290键盘和LED驱动芯片的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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 + -