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

📄 zhouyi.c

📁 protues仿真基于DS1820多点粮食监控,液晶显示检测到的温度
💻 C
📖 第 1 页 / 共 2 页
字号:
      LCD_E=1;
      //DelayNS(1);
	  	
	  
      LCD_E=0;
     
      //dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)
     }
	 	
    
      //while(1);
      
}




void SendCommandToLCD(uchar  command)	   //写命令到LCD中
{
    CheckState();
    
    LCD_RS=0;	 //向LCD发送命令
    LCD_RW=0;
    data_IO=(data_IO & 0x00) | command;	 //command :命令
    LCD_E=1;
    LCD_E=0;
  
}

void SetLine(uchar  page)	//设置页 0xb8是页的首地址
{
  page=0xb8|page; //1011 1xxx		 0<=page<=7 设定页地址--X 0-7,8行为一页64/8=8,共8页
  SendCommandToLCD(page);
}


void SetStartLine(uchar  idata startline) 	   //设定显示开始行,0xc0是行的首地址
{
  startline=0xc0|startline; //1100 0000
  SendCommandToLCD(startline); //设置从哪行开始:0--63,一般从0 行开始显示
 }

void SetColumn(uchar  idata column)	//设定列地址--Y 0-63 ,0x40是列的首地址
{
  column=column &0x3f; //column最大值为64,越出 0=<column<=63
  column= 0x40|column; //01xx xxxx
  SendCommandToLCD(column);
}


 

void SetOnOff(uchar  idata onoff)	   //开关显示,0x3f是开显示,0x3e是关显示
{
	onoff=0x3e|onoff; //0011 111x,onoff只能为0或者1
	SendCommandToLCD(onoff);
}


void WriteByte(uchar  idata dat)	//写显示数据
{
   CheckState();
   LCD_RS=1;
   LCD_RW=0;
   data_IO=(data_IO & 0x00) | dat;	//dat:显示数据
   LCD_E=1;
   LCD_E=0;
  }	
	


void SelectScreen(uchar  idata screen)	  //选择屏幕screen: 0-全屏,1-左屏,2-右屏
{ 						 
   switch(screen)
   { case 0: cs1=0;//全屏
            // _nop_(); _nop_(); _nop_(); 
             cs2=0; 
            // _nop_(); _nop_(); _nop_(); 
             break; 
     case 1: cs1=0;//左屏
            // _nop_(); _nop_(); _nop_(); 
             cs2=1;
             //_nop_(); _nop_(); _nop_(); 
             break;
     case 2: cs1=1;//右屏
            // _nop_(); _nop_(); _nop_(); 
             cs2=0;
             //_nop_(); _nop_(); _nop_(); 
             break;
   }
}


void ClearScreen(uchar  idata screen)	  //清屏screen: 0-全屏,1-左屏,2-右
{ 	
     uchar  idata i,j;
     SelectScreen(screen);
     
	 for(i=0;i<8;i++)	 //控制页数0-7,共8页
	 {
	        SetLine(i);
			SetColumn(0);
              for(j=0;j<64;j++)	   //控制列数0-63,共64列
			  	{
                  WriteByte(0x00); //写点内容,列地址自动加1
                }
     }
					 
}
	
	
void InitLCD() 	  //初始化LCD
{ 

	CheckState();

	SelectScreen(0);
	SetOnOff(0); //关显示

	SelectScreen(0);
	SetOnOff(1); //开显示

	SelectScreen(0);
	ClearScreen(0);//清屏

	SetStartLine(0); //开始行:0

}


void WriteChinese(uchar  ss,uchar  page,uchar  column,uchar menu,uchar  hz[])
{
	uchar  i;			  //选屏参数,pagr选页参数,column选列参数,number选第几汉字输出,menu为菜单选项 	
	SelectScreen(ss);
	column=16*column;	//汉字是16X16的,每隔16列扫描 
	column=column&0x3f;

	SetLine(page);	//写上半页
	SetColumn(column); //控制列
	if(menu==1)
		for(i=0;i<16;i++)  //控制16列的数据输出
		{
		//WriteByte(Hzk[i+32*number]); //i+32*number汉字的前16个数据输出
		WriteByte(0xff-hz[i]);
		}
	else
		for(i=0;i<16;i++)  //控制16列的数据输出
		{
		//WriteByte(Hzk[i+32*number]); //i+32*number汉字的前16个数据输出
		WriteByte(hz[i]);
		}

	SetLine(page+1);		 //写下半页
	SetColumn(column);	   //控制列
	if(menu==1)
 	   for(i=0;i<16;i++)	  //控制16列的数据输出
		{
		//WriteByte(Hzk[i+32*number+16]);	//i+32*number+16汉字的后16个数据输出
		WriteByte(0xff-hz[i+16]);
		}
	 else
		for(i=0;i<16;i++)	  //控制16列的数据输出
		{
		//WriteByte(Hzk[i+32*number+16]);	//i+32*number+16汉字的后16个数据输出
		WriteByte(hz[i+16]);
		}
} 

void WriteDigit(uchar ss,uchar page,uchar column,uchar digit[])
{
  	uchar  i;			  //选屏参数,pagr选页参数,column选列参数,number选第几汉字输出	
	SelectScreen(ss);
	column=8*column;	//数字是8X16的,每隔8列扫描 
	column=column&0x3f;

	SetLine(page);	//写上半页
	SetColumn(column); //控制列
	for(i=0;i<8;i++)  //控制16列的数据输出
	{
	//WriteByte(Hzk[i+32*number]); //i+32*number汉字的前16个数据输出
	WriteByte(digit[i]);
	}

	SetLine(page+1);		 //写下半页
	SetColumn(column);	   //控制列
    for(i=0;i<8;i++)	  //控制16列的数据输出
	{
	//WriteByte(Hzk[i+32*number+16]);	//i+32*number+16汉字的后16个数据输出
	WriteByte(digit[i+8]);
  	 }
} 




void delay(int num)//延时函数
{
	while(num--) ;
}


Init_DS18B20(void)//初始化ds1820
{
	unsigned char x=0;
	DQ = 1;    //DQ复位
	delay(8);  //稍做延时
	DQ = 0;    //单片机将DQ拉低
	delay(80); //精确延时 大于 480us
	DQ = 1;    //拉高总线
	delay(14);
	x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
	delay(20);
}


ReadOneChar(void)//读一个字节
{
	unsigned char i=0;
	unsigned char dat = 0;
	for (i=8;i>0;i--)
	{
		DQ = 0; // 给脉冲信号
		dat>>=1;
		DQ = 1; // 给脉冲信号
		if(DQ)
		dat|=0x80;
		delay(4);
	}
	return(dat);
}


WriteOneChar(unsigned char dat)//写一个字节
{
	unsigned char i=0;
	for (i=8; i>0; i--)
	{
		DQ = 0;
		DQ = dat&0x01;
		delay(5);
		DQ = 1;
		dat>>=1;
	}
}


unsigned char *ReadTemperature(void)//读取温度
{
	unsigned char a=0;
	unsigned char b=0;
	unsigned char Temper[2]={0};
	
	//unsigned int t=0;
	float tt=0;
	Init_DS18B20();
	WriteOneChar(0xCC); // 跳过读序号列号的操作
	WriteOneChar(0x44); // 启动温度转换
	Init_DS18B20();
	WriteOneChar(0xCC); //跳过读序号列号的操作
	WriteOneChar(0xBE); //读取温度寄存器
	a=ReadOneChar();	//数据位 
	b=ReadOneChar();   //负数标志位b为0温度为正,b为0xff,温度为负 
	//t=a;
	//t<<=8;为什么要移动8位???
//	t=t|a;
	//tt=t*0.0625;
	//t= tt*10+0.5; //放大10倍输出并四舍五入
	a=a*0.5;
	Temper[0]=a;
	Temper[1]=b;
	return(Temper);
}
	
 

main()
{
               uchar j=0,key=0,PressSign=1;
   			   InitLCD();
			   ClearScreen(0);//清屏
			   SetStartLine(0);
	 //for(j=0;;j++)
		//{
			//SetStartLine(j); 
			WriteChinese(LiftHalf,Page0,0,MenuOff,liang);
			WriteChinese(LiftHalf,Page0,1,MenuOff,ku);
			WriteChinese(LiftHalf,Page0,2,MenuOff,jian); 
			WriteChinese(LiftHalf,Page0,3,MenuOff,kong);

			WriteChinese(RightHalf,Page0,0,MenuOff,xi);
			WriteChinese(RightHalf,Page0,1,MenuOff,tong);
			//WriteChinese(RightHalf,Page0,2,MenuOn,lu);
			//WriteChinese(RightHalf,Page0,2,yong);
			//WriteChinese(RightHalf,Page0,3,yuan3);

			WriteChinese(LiftHalf,Page2,0,MenuOff,di);
			WriteChinese(LiftHalf,Page2,1,MenuOff,cone);
			WriteChinese(LiftHalf,Page2,2,MenuOff,dian);
			WriteChinese(LiftHalf,Page2,3,MenuOff,wen);

			WriteChinese(RightHalf,Page2,0,MenuOff,du);
			//WriteDigit(RightHalf,Page2,2,maohao);
			WriteChinese(RightHalf,Page2,3,MenuOff,TemperatureSign);
		
			//SetStartLine(j); 
			WriteChinese(LiftHalf,Page4,0,MenuOff,huang);
			WriteChinese(LiftHalf,Page4,1,MenuOff,shi);
			WriteChinese(LiftHalf,Page4,2,MenuOff,li); 
			WriteChinese(LiftHalf,Page4,3,MenuOff,gong);

			//SetStartLine(j);
			WriteChinese(RightHalf,Page4,0,MenuOff,xue);
			WriteChinese(RightHalf,Page4,1,MenuOff,yuan4);
			WriteChinese(RightHalf,Page4,2,MenuOff,zhou);
			WriteChinese(RightHalf,Page4,3,MenuOff,yi);

		   //}
	 /*while(1)
	 	{
			if(P0^0==1)
			   {void delay();
				if(P0^0==1)
				{key++;PressSign=1;
				   if(key==5)
				   		{
							key=1;
						}
				}
			 while(P0^0==1);
			   }
		   	
		}*/

  while(1)//主循环
 	{ unsigned char *Temper;
	unsigned char a=0,b=0,c=0,f=0,i=0;
  
	Temper=ReadTemperature();//读温度
	i=Temper[0];
	a=i/100;
	WriteDigit(RightHalf,Page2,3,zero+a*16);
	b=i/10-a*10;
	WriteDigit(RightHalf,Page2,4,zero+b*16);
	c=i-a*100-b*10;
	WriteDigit(RightHalf,Page2,5,zero+c*16);
	if(Temper[1]==0)
		WriteDigit(RightHalf,Page6,6,zero);
	else
	    WriteDigit(RightHalf,Page6,6,zero+1*16);
	DelayNS(200);
	}
}


⌨️ 快捷键说明

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