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

📄 xing.h

📁 protues仿真基于DS1820多点粮食监控,液晶显示检测到的温度
💻 H
📖 第 1 页 / 共 2 页
字号:
unsigned char code four[16]={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};//4
unsigned char code five[16]={0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};//5
unsigned char code six[16]={0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};//6
unsigned char code seven[16]={0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};//7
unsigned char code eight[16]={0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};//8
unsigned char code nine[16]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};//9
unsigned char code point[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00};//小数点
unsigned char code maohao[16]={0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};//冒号

uchar code black[32]={
/*黑屏[16*16]下半列排*/
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
};
unsigned char code clear[32]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};



void CheckState()		//状态检查,LCD是否忙?
{
  // uint32 dat;
   LCD_RS=0;
   LCD_RW=1;
   data_IO=( data_IO& 0x00) | 0x00;
   //RS=0;
  // RW=1;
  while(P1&0x80)
   {
   	  
      //Dataport=0x00;
      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);
}

⌨️ 快捷键说明

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