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

📄 lcd drive.c

📁 proteus实例集锦
💻 C
📖 第 1 页 / 共 2 页
字号:

/***********************************************
   I2C总线读一个字节,即接收一个字节数据
   接收结束后需要发送一个应答位acknowledge
***********************************************/

uchar I2C_receive()
     {
      uchar a,receive_data;
      for(a=0;a<8;a++)
         {
          receive_data=receive_data<<1;
          if(I2C_clock())
           {
            receive_data++;
           }; 
         };
 //I2C_ACK();
      return(receive_data);
      }


 DS1621_start()
   {
	do
	{
     I2C_start();
	 }
    while(I2C_send(0x90));//发送数据完地址字节的数据时,检测从机的应答位        
	if(I2C_send(0xee)==0)
	  {
	   I2C_stop();
	   return 1;
	   }
    else
	  return 0;			        
	  }

 DS1621_stop()
   {
    do
	{
	 I2C_start();
	 //I2C_send(0x90);
	 }
	while(I2C_send(0x90));
	if(I2C_send(0x22)==0)
     {
	  I2C_stop();
	  return 1;
	  }
	else
	  return 0;	    
	}

char read_count_remain()
      {
	   char temp_remain=0;
	   do
	   	{
	     I2C_start();
	     }
	   while(I2C_send(0x90));//是否应答
	   if(I2C_send(0xa8)==0)
	     {
		  I2C_start();
	      if(I2C_send(0x91)==0)
	        {
			temp_remain=I2C_receive();
			I2C_NACK();
		    I2C_stop();
			return temp_remain;
			}
		  else
		    return 0;
	      }
		else
		  return 0;
	   }
char read_count_c()
      {
	   char temp_c=0;
	   do
	   	{
	     I2C_start();
	     }
	   while(I2C_send(0x90));//是否应答
	   if(I2C_send(0xa9)==0)
	     {
		  I2C_start();
	      if(I2C_send(0x91)==0)
	        {
			temp_c=I2C_receive();
			I2C_NACK();
		    I2C_stop();
			return temp_c;
			}
		  else
		    return 0;
	      }
		else
		  return 0;
	   }
bit read_temperature(char *point1)
   {
	do
	{
	I2C_start();
	}
	while(I2C_send(0x90));
    if(I2C_send(0xaa)==0)
	  {
	   do{
	     I2C_start();
	     }
	     while(I2C_send(0x91));
	   (*point1)=I2C_receive();
	   I2C_ACK();
	   (*(point1+1))=I2C_receive();
	   I2C_NACK();
	   I2C_stop();
	   return 1;
	   }
	else
	return 0;
	}

 DS1621_state()
   {
	do
	{
	 I2C_start();
	 }
	while(I2C_send(0x90));
	if(I2C_send(0xac)==0)
      {
	   do
		{
	     I2C_start();
		}
	   while(I2C_send(0x90));
	   if(I2C_send(0x00)==0)
	   //if(I2C_send(0x01)==0)
		 {
		 I2C_stop();
		 return 1;
		  }
	   else
	   return 0;
		}
	else
	  return 0;	    
	}

 DS1621_th()
   {
	 
    }
 DS1621_tl()
   {
	 
    }
 DS1621_init()
   {
	while(DS1621_stop()==0)
	{};
	while(DS1621_state()==0)
	{};
	DS1621_th();
	DS1621_tl();
	}

/****************************************************
       字符为16*16显示,分为两个部分写入32个字节
       前16个字节写入第一页(16*8),后16个字节写入
	   第二页(16*8)
	   左侧写入"欢迎",右侧写入"使用"
*****************************************************/
C_display_L(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
  {
   uchar k;
   C_Pagenum=PAGEADD|C_Pagenum;
   C_Tiernum=TIERADD|C_Tiernum;
   WRCommand_L(C_Pagenum);
   WRCommand_L(C_Tiernum);
   for(k=0;k<16;k++)
      {
       WRdata_L(table2[C_Temp*32+k]);
	     };
   C_Pagenum=C_Pagenum+1;
   WRCommand_L(C_Pagenum);
   WRCommand_L(C_Tiernum);
   for(k=0;k<16;k++)
      {
       WRdata_L(table2[C_Temp*32+k+16]);
	   };
   }

C_display_R(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
  {
   uchar k;
   C_Pagenum=PAGEADD|C_Pagenum;
   C_Tiernum=TIERADD|C_Tiernum;
   WRCommand_R(C_Pagenum);
   WRCommand_R(C_Tiernum);
   for(k=0;k<16;k++)
      {
       WRdata_R(table2[C_Temp*32+k]);
	     };
   C_Pagenum=C_Pagenum+1;
   WRCommand_R(C_Pagenum);
   WRCommand_R(C_Tiernum);
   for(k=0;k<16;k++)
      {
       WRdata_R(table2[C_Temp*32+k+16]);
	     };
  }

/****************************************
   写入西文字符,共11个字符,左侧写入6个
   右侧写入5个,左侧起始从16开始,右侧从
   0开始
*****************************************/

E_Display_L(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)
  {
   uchar k;
   WRCommand_L(PAGEADD|E_Pagenum);
   WRCommand_L(TIERADD|E_Tiernum);
   for(k=0;k<8;k++)
	  {
	   WRdata_L(table1[E_Temp*8+k]);
	   };
   }   
E_Display_R(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)
   {
   uchar k;
   WRCommand_R(PAGEADD|E_Pagenum);
   WRCommand_R(TIERADD|E_Tiernum);
   for(k=0;k<8;k++)
	  {
	   WRdata_R(table1[E_Temp*8+k]);
	   };
   	}

/*********************************
	   清除所有显示RAM内容
**********************************/

CLR_DisplayRAM()
   {
    uchar C_page,i,k;
    for(i=0;i<8;i++)
	   {
	    C_page=PAGEADD|i;//清除起始页为0
	    WRCommand_L(C_page);//清除起始页写入
		WRCommand_L(TIERADD);//清除起始行地址写入
		WRCommand_R(C_page);
		WRCommand_R(TIERADD);
		for(k=0;k<64;k++)
		   {		   	
			WRdata_L(0x00);
			WRdata_R(0x00);//lcm的ram自动加一,只许循环64次即可    
		 	};
		 };
    }

/*********************************
       初始化 设置启使行
**********************************/
void Init_LCD(void)
   {
	CLR_DisplayRAM();//清除所有显示寄存器
	WRCommand_L(DIS_STARADD);
	WRCommand_R(DIS_STARADD);//设置显示起始行地址
	WRCommand_L(0x3f);
	WRCommand_R(0x3f);//开显示
    }
/***************************************
    max1241读转换结果
****************************************/
uint read_max1241()
	 {
	  uint voltage_temp=0;
	  uchar ucloop=12;
	  cs=High;
	  //dout=low;
	  sclk=Low;
	  cs=Low;
      while(dout==0);//EOC信号为高表示转换结束
	  sclk=High;
	  sclk=Low;
      while(ucloop--)
	   {
		sclk=High;//上升沿数据稳定并读出
		voltage_temp<<=1;
	    if(dout==1)
	    voltage_temp+=1;
	    sclk=Low;
		};	 
	  //sclk=low;
	  cs=High;
	  return voltage_temp;
	  }

main()
  {
   uchar a=0,temp=0,b=0,number=0,pagenum=0;
   uchar etable[]={0,0,0,0,0,45,53,60,51,63,61,53,10,69,67,53};//Welcome use
   uchar ttable[]={42,57,61,53,19,10,2,0,0,6,18,1,1,18,0,7};//Time:2006/11/07
   char count_remain=0,count_c=0;
   bit flag=1;
   char temperature_buf[2]={0};
   uchar temperature_display[8]={0};
   //uchar voltage=0; //测试0831时使用
   double voltage=0;
   double temp_buffer=0;
   cs=High;
   sclk=High;
   Init_LCD();
   I2C_init();
   DS1621_init();//初始化
   DS1621_start();//开始温度采集

   /***************************************
   利用开机显示时间(大概三秒)空读一次DS1621
   ***************************************/
   for(b=0;b<2;b++)
      {
      for(number=0;number<20;number++)
	     {
	      //中文显示:欢迎使用液晶模块
     	  pagenum=1;//在第二行开始显示
	      for(a=0;a<4;a++)
	        {
	         C_display_L(pagenum,a*16,a);
	         C_display_R(pagenum,a*16,a+4);
	         }; 
        
		  //英文显示:Welcome use	            
          pagenum=5;//在第六行显示
          for(a=0;a<3;a++)
             {
              E_Display_L(pagenum,(a+5)*8,etable[a+5]);
              };
          for(a=0;a<8;a++)
             { 
              E_Display_R(pagenum,a*8,etable[a+8]);
              };
        
		  //显示制作时间:Time:2006/11/07				
          pagenum=7;//在第八行显示
          for(a=0;a<8;a++)
             {
              E_Display_L(pagenum,a*8,ttable[a]);
              E_Display_R(pagenum,a*8,ttable[a+8]);
              }          
	      Delay_nms(100);
		  };
		  if(flag)
		 	 {
              read_temperature(temperature_buf);//在转到下一个显示界面之前空读一次
			  read_count_remain();
			  read_count_c();
			  DS1621_start();
              flag=0;
   	          };
   	  };  

	WRCommand_L(0x3e);
	WRCommand_R(0x3e);
	CLR_DisplayRAM();  //清除显示ram
	WRCommand_L(0x3f);
	WRCommand_R(0x3f);   
			
    while(1)
	   {
	    while(read_temperature(temperature_buf)==0);//读温度值(两字节有符数),并检测应答位,只使用第一字节
	    count_remain=read_count_remain();//读斜率
		count_c=read_count_c();//读计数器
		temp_buffer = temperature_buf[0] -0.75 + (count_c-count_remain) / (double)count_c;
		DS1621_start();//读完数据后,重新开始一次温度转化

		   	temperature_display[0]=19;
			if(temp_buffer<0)
			  {
			   temperature_display[1]=16;//显示负号
		       temperature_display[2]=(-temp_buffer)/10;//十位
			   temperature_display[3]=((uchar)(-temp_buffer))%10;
			   temperature_display[4]=17;//小数点
			   temperature_display[5]=(int)((-temp_buffer)*10)%10;
			   temperature_display[6]=(int)((-temp_buffer)*100)%10;//小数点后两位
			   }
			else
			  {
			   temperature_display[1]=temp_buffer/100;//百位
		       temperature_display[2]=((uchar)temp_buffer)/10%10;
			   temperature_display[3]=((uchar)temp_buffer)%10;
			   temperature_display[4]=17;
			   temperature_display[5]=((int)(temp_buffer*10))%10;
			   temperature_display[6]=((int)(temp_buffer*100))%10;//小数点后两位
			   }

			// 测试从max1241读出的原始数据
		    /***************************
			//pagenum=3;
	 	    voltage=read_max1241();
		    voltage_display[0]=19;
		    voltage_display[1]= voltage/1000;   
		    voltage_display[2]=(voltage/100)%10;
		    voltage_display[3]=(voltage/10)%10;
                                voltage_display[4]= voltage%10;		  
		    //*******************************/

		//LCD显示第二部分
		for(b=0;b<40;b++)
	       {
		    //*************************
			//更新max1241显示值		    
			voltage=(double)read_max1241();
		    voltage=5000*voltage/4095;
		    voltage_display[0]=19;
		    voltage_display[5]=(uint)voltage %10;//个位
		    voltage_display[2]=17;
		    voltage_display[4]=(uint)(voltage/10)%10;//小数点后1位
		    voltage_display[3]=(uchar)(voltage/100)%10;//小数点后2位
			voltage_display[1]=(uchar)(voltage/1000)%10;//小数点后3位
			//***********************************/
			//显示文字:电压测量		
		    pagenum=2;
		    for(a=0;a<2;a++)
		       C_display_L(pagenum,a*16,a+8);
		    for(a=0;a<2;a++)
		       C_display_L(pagenum,(a+2)*16,a+12);	
		   
		   	//显示文字:温度测量
		    pagenum=5;
		    for(a=0;a<2;a++)
		       C_display_L(pagenum,a*16,a+10);
		    for(a=0;a<2;a++)
		       C_display_L(pagenum,(a+2)*16,a+12);
		    
			//显示1241采样值
			pagenum=3;
		    for(a=0;a<6;a++)
              {
		   	   E_Display_R(pagenum,a*8,voltage_display[a]); 
		       }

			//显示ds1621采样值
			pagenum=6;
		    for(a=0;a<7;a++)
              {
		   	   E_Display_R(pagenum,a*8,temperature_display[a]); 
		       }
          };
	  };	
   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -