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

📄 display.c

📁 温度传感器DS18B20测温+显示+键盘
💻 C
字号:
//cs1=0,cs2=1选左
#include <reg51.h>
#include <intrins.h>
sbit   P10 = P1^0;
sbit   P11 = P1^1;
sbit   P12 = P1^2;
sbit   P13 = P1^3;
sbit   P14 = P1^4;
sbit   P15 = P1^5;
sbit   P16 = P1^6;
sbit   P17 = P1^7; 
sbit button1=P0^0;
sbit button2=P0^1;
sbit button3=P0^2;
sbit button4=P0^3;
sbit DataPortDS1820 = P1^6; 
#define button P0;
#define LCD_DATA P2
#define LCD_RS P10
#define LCD_RW P11
#define LCD_E  P12
#define LCD_CS1  P13
#define LCD_CS2  P14
#define LCD_RST  P15
#define SELECTCS 0

char code wen[]=   //温
{0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00, 
0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00,



};
char code du[]=	 //度
{
0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,
0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,
};
char code  shuzi[10][16]=
{										//
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},//0
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//1
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},	 //2
{0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00},		//3
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},//4
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},//5
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},//6
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},//7
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},//8
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}//9
};
char code Han[]=
{ 0x10,0x60,0x01,0x86,0x60,0x04,0x1C,0xE4,0x04,0x04,0x04,0xE4,0x1C,0x04,0x00,0x00,
0x04,0x04,0x7E,0x01,0x40,0x20,0x20,0x10,0x0B,0x04,0x0B,0x10,0x30,0x60,0x20,0x00,
/*0x00,0x10,0x61,0x06,0xC0,0x30,0x02,0x3E,0xC2,0x02,0x82,0x62,0x1F,0x02,0x00,0x00,
0x00,0x02,0x02,0x3F,0x20,0x20,0x10,0x08,0x05,0x02,0x05,0x08,0x10,0x30,0x10,0x00,	*/
}; 
/*--  文字:  字  --*/
char code Zi[]=
{
0x00,0x00,0x10,0x0C,0x14,0x14,0x14,0x15,0xD6,0x54,0x34,0x14,0x14,0x8C,0x00,0x00,
0x00,0x01,0x01,0x01,0x01,0x01,0x11,0x21,0x1F,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
};
void LCD_Check_Busy1(void)
  {
   while(1)
	{
	  LCD_E = 0;
	  LCD_RS = 0;
	  LCD_RW = 1;
	  LCD_DATA = 0xff;
	  LCD_E = 1;
	  if(!(LCD_DATA&0X80)) break;
     }
   LCD_E = 0;
  }
void LCD_Check_Busy2(void)
  {
   while(1)
	{
	  LCD_E = 0;
	  LCD_RS = 0;
	  LCD_RW = 1;
	  LCD_DATA = 0xff;
	  LCD_E = 1;
	  if(!(LCD_DATA&0X80)) break;
     }
   LCD_E = 0;
  }
  void LCD_SELECT1(void)
  {
  LCD_CS1=0;
  LCD_CS2=1;
  }
  void LCD_SELECT2(void)
  {
  LCD_CS1=1;
  LCD_CS2=0;
  }
  void LCD_WriteCommand1(char ch) 
{	LCD_SELECT1();
	LCD_Check_Busy1(); //判断LCD是否处于忙状态
 
	LCD_RW=0;
	LCD_RS=0;
	LCD_DATA=ch;
	LCD_E=1;
	LCD_E=0;
 
}
void LCD_WriteCommand2(char ch)	
{
	LCD_SELECT2();
	LCD_Check_Busy2();
	LCD_RW=0;
	LCD_RS=0;
	LCD_DATA=ch;
	LCD_E=1;
	LCD_E=0;
 
}
void LCD_WriteData1(char ch)	
{
LCD_SELECT1();
	LCD_Check_Busy1();
	LCD_RW=0;
	LCD_RS=1;
	LCD_DATA=ch;
	LCD_E=1;
	LCD_E=0;

}
void LCD_WriteData2(char ch)
{
LCD_SELECT2();
	LCD_Check_Busy2();
	LCD_RW=0;
	LCD_RS=1;
	LCD_DATA=ch;
	LCD_E=1;
	LCD_E=0;

}

void Delay1ms(unsigned char T)
{
  unsigned char i,j;
  for(i=0;i<T;i++)
	for(j=0;j<250;j++)
	_nop_();_nop_();_nop_();
}
void Delay1s(unsigned char T)
{
	while (T)
	{
		Delay1ms(200);
		Delay1ms(200);
		Delay1ms(200);
		Delay1ms(200);
		Delay1ms(200);
		T--;
	}
}
void LCD_WriteHZ(char x,char y,char *Dot) 
{
char i;
	for (i=0;i<32;i++)
	{
		if ((x+i%16)<64) //横向坐标小于64时在左屏显示汉字
		{
			LCD_WriteCommand1(0xB8+y+i/16);
			LCD_WriteCommand1(0x40+x+i%16);
			LCD_WriteData1(Dot[i]);
		}
		else             //横向坐标大于64时在右屏显示汉字
		{
			LCD_WriteCommand2(0xB8+y+i/16);
			LCD_WriteCommand2(0x40+x-64+i%16);
			LCD_WriteData2(Dot[i]);
		}
	}
}
void LCD_WriteSZ(char x,char y,char *Dot) 
{
char i;
	for (i=0;i<16;i++)
	{
		if ((x+i%8)<64) //横向坐标小于64时在左屏显示汉字
		{
			LCD_WriteCommand1(0xB8+y+i/8);
			LCD_WriteCommand1(0x40+x+i%8);
			LCD_WriteData1(Dot[i]);
		}
		else             //横向坐标大于64时在右屏显示汉字
		{
			LCD_WriteCommand2(0xB8+y+i/8);
			LCD_WriteCommand2(0x40+x-64+i%8);
			LCD_WriteData2(Dot[i]);
		}
	}
}
void DispBmp(char *buf)	//显示一幅位图
{
int i,j;
	for (j=0;j<8;j++)			//显示位图
	{
		LCD_WriteCommand1(0xB8+j);	
		LCD_WriteCommand1(0x40);
		for (i=0;i<64;i++)
			LCD_WriteData1(buf[(j*2)*64+i]);
		LCD_WriteCommand2(0xB8+j);	
		LCD_WriteCommand2(0x40);
		for (i=0;i<64;i++)
			LCD_WriteData2(buf[(j*2+1)*64+i]);
	}
}
void InitLCD(void)	
{
	char i,j;
	LCD_RST=0;
	Delay1ms(2);
	LCD_RST=1;
	LCD_WriteCommand1(0xc0);	
	LCD_WriteCommand2(0xc0);
	LCD_WriteCommand1(0x3f);  	//开显示
	LCD_WriteCommand2(0x3f);
	for (j=0;j<8;j++)			//清屏
	{
		LCD_WriteCommand1(0xB8+j);	//清左半屏
		LCD_WriteCommand1(0x40);
		for (i=0;i<64;i++)
			LCD_WriteData1(0x00);
		LCD_WriteCommand2(0xB8+j);	//清右半屏
		LCD_WriteCommand2(0x40);
		for (i=0;i<64;i++)
			LCD_WriteData2(0x00);
	}
}

//-=====================================================================
void Delay1us(unsigned char us)  //延时
{
	while (--us) ;//参数为1是延时6US 2时为8US依次递增

}
void Delay15us(void)  
{
	Delay1us(13);                  //延时15秒
}
void Delay10us(void)
{	
	Delay1us(8);
}
bit RstDS1820(void)		//返回0-有设备连接1-无设备连接
{
	unsigned char i;
	bit RstFlag;
	RstFlag=1;	
	DataPortDS1820=0;
	for (i=0;i<40;i++)      	//480us 延时
		Delay15us(); 
	DataPortDS1820=1;
	for(i=0;i<4;i++)			//15us-60us 延时
	{
		Delay15us();
	}
	for (i=0;i<16;i++)			//60us-240us 延时
	{
		Delay15us();
		if (DataPortDS1820==0) RstFlag=0;
	}
	for (i=0;i<16;i++)			//240us
	{
		Delay15us();
	}
	return RstFlag;	
}
void WriteDS1820(unsigned char ch)
{
unsigned char i;
	DataPortDS1820=1;
	Delay1us(1);
	for (i=0;i<8;i++)
	{
		EA=0;
		DataPortDS1820=0;
		Delay15us();
		DataPortDS1820=ch&0x1;
		EA=1;
		Delay15us();Delay15us();Delay15us();
		DataPortDS1820=1;
		ch=ch>>1;
		Delay1us(1);
	}
}
unsigned char ReadDS1820(void)
{
	unsigned char i,ch;
	ch=0;
	DataPortDS1820=1;
	Delay1us(1);
	for (i=0;i<8;i++)
	{
		EA=0;
		DataPortDS1820=0;
		Delay10us();
		DataPortDS1820=1;
		Delay1us(2);
		ch=ch>>1;
		if (DataPortDS1820==1)
		{
			ch=ch+0x80;
		}
		EA=1;
		Delay15us();Delay15us();Delay15us();
	}	
	return ch;
}
void SkipROMCode(void)       //主机发跳过读序列号的操作命令:0xcc
{
//	RstDS1820();
	WriteDS1820(0xcc);
}
void StartADC(void)
{
//	RstDS1820();			//复位
//	WriteDS1820(0xcc);		//广播
	WriteDS1820(0x44);		//启动温度转换转换 12bit700ms
}
unsigned int GetTempValue(void)//读取温度值的程序
{
	unsigned char i,j;        
	unsigned int T;
	
	RstDS1820();
	SkipROMCode();
	WriteDS1820(0xBE);  //发布读取温度值的命令(0xBE)
	i=ReadDS1820();
	j=ReadDS1820();
	StartADC();
	T=i+j*256;
	if (T==0xffff) return 0xffff;
	if (T>0x8000)                      //温度为负号
	{
		T=-T;
		return(0x8000+T*5/8);          //计算温度值
	}
	else                               //温度为正号
		return(T*5/8);
}
void sleep_ms(unsigned int count)      //延时
{
	unsigned char ii,jj;
	for(ii=0;ii<count;ii++)
	{
		for(jj=0;jj<250;jj++)
		_nop_();
	}
}
/*void Init18b20(void)
{
	SkipROMCode();                        //主机发跳过读序列号的操作命令:0xcc
	WriteDS1820(0x44);                    //启动温度转换
} */
//=================================================================================
void oxy(void)
{		unsigned char temp;
	unsigned int w;
        RstDS1820();
		SkipROMCode();
		StartADC();  
		Delay1s(1);
		InitLCD();        //清屏
	    w = GetTempValue();            //读出温度值的原始数据存入W
		Delay1s(1);
		LCD_WriteHZ(0,0,wen);
		LCD_WriteHZ(16,0,du);
		temp = (w%1000)/100;  
		LCD_WriteSZ(32,0,shuzi[temp]);
		temp = (w%100)/10; 
		LCD_WriteSZ(40,0,shuzi[temp]);            //个位
		temp = (w%10);
		LCD_WriteSZ(48,0,shuzi[temp]);                 //小数位	
} 
//===============================================================================
void presskey() interrupt  0 using 0
{
 
 EA=0;
 if(button1==0)
{
 Delay1ms(100);
    if(button1==0)
	oxy();
}
if(button2==0)
 {
 Delay1ms(100);
    if(button2==0)
	oxy();
}
if(button3==0)
 {
 Delay1ms(100);
    if(button3==0)
	oxy();
}
if(button4==0)
 {
 Delay1ms(100);
    if(button4==0)
	oxy();
}
 EA=1;
}


void main (void) 
{   
   InitLCD();
   Delay1ms(1);
   EA=1;
   EX0=1;
   while(1)
	{   	 	    	 
	}

}

⌨️ 快捷键说明

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