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

📄 wendu.c

📁 此为18B20的温度检测以及键盘控制和液晶显示程序.好用.
💻 C
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////
//
//          1602子程序
//函数说明:delay(uchar d)             延时2us程序
//			lcd_wrcmd(uchar cmd)	   写命令子程序
//			lcd_wrdata(uchar lcddata)  写数据子程序
//			lcd_h()                    建立自定义字符库

//Version:  4.11
//说明   : 在Menu的界面支持OK键和快捷键

//Version:  4.2
// 说明  : 加入了TLC5620,当电压大于5V时出现Warning界面
//Time   :  7/10   18:30

	    
//////////////////////////////////////////////////////////////

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define lcd_bus P1
#define key_bus P2
uchar offset=0x80;
uchar d[2]={0x30,0x30};
uchar tem1[3];
uchar tem2[4];
uchar tplsb,tpmsb;
uchar temp1,temp2;

sbit rs=P0^5;
sbit rw=P0^6;
sbit e =P0^7;
sbit DQ=P3^3;
sbit alert=P0^0;	

//sbit rs=P3^2;
//sbit rw=P3^3;
//sbit e =P3^4;
//sbit beep=P3^5;

sbit load=P2^0;
sbit sclk=P2^1;
sbit sdata=P2^2;

				    //年月摄氏度	
uchar code hanzi[]={0x80,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,  
                    0xf,0x9,0xf,0x9,0xf,0x9,0x11,0,  
					0x1C,0x14,0x1C,0x0,0x0,0x0,0x00,0x00,
					0x06,0x08,0x10,0x10,0x10,0x08,0x06,0x00};  
uchar code table[15]={0,0x30,0,0x2e,0x37,0x38,0x39,0,0x34,0x35,0x36,0,0x31,0x32,0x33};   
uchar code num[11]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};   

                	            
/*uchar code str1[]="THE MIN SYSTEM";
uchar code str2[]="the tempreture:";
//uchar code str3[]="INPUT PHASE:";
uchar code str4[]="A: voltage";	 //电压
uchar code str5[]="B: tempreture"; //温度
uchar code str6[]="C: input";    //标定
uchar code str7[]="D: help";
uchar code he[]="*:OK #:UP(clear)";
uchar code am[]="please input:";
//uchar code warn[]="WARNING!!VOLTAGE < 5V";
uchar state=0;*/




/*dac_tlc5620(uchar send_char)
{
        uchar i;
		load=1;
		sclk=1;sdata=0;sclk=0;
		sclk=1;sdata=0;sclk=0;
        sclk=1;sdata=1;sclk=0;

		for(i=0;i<8;i++)
		{
		        sclk=1;
		        if(send_char&0x80) sdata=1;
				else sdata=0;
				sclk=0;
				send_char=send_char<<1;
		}
		load=0;
		load=1;

}

*/

//////////////////////////////////////////
delay(uchar d)
{
        while(--d);
}


/**********判断忙标志,返回的是一个位BF**********/
bit lcd_busy(void)
{
        uchar bflag;     
        rs=0;
        rw=1;
        _nop_();
        e=1;
	    _nop_();
        lcd_bus=0xff;
        bflag=lcd_bus;
        e=0;
        return(bit)(bflag&0x80);    //BF=1 busy   
}



/*********写命令,有两个参数,第一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1:判断;为 0:不判断****************/
void lcd_wrcmd(uchar cmd)
{
        while(lcd_busy());
        lcd_bus=cmd;
        rs=0;
        rw=0;
        _nop_();
        e=1;
        _nop_();
        _nop_();
        e=0; 
}


/************向液晶片写数据***************/
void lcd_wrdata( uchar lcddata)
{
		while(lcd_busy());
        lcd_bus=lcddata;
        rs=1;
        rw=0;
        _nop_();
        e=1;
        _nop_();
        _nop_();
        e=0;
}

/****************初始化***************/
void lcd_ini(void)
{
        lcd_wrcmd(0x38); 
        delay(100);
        lcd_wrcmd(0x0c);
		delay(100);
        lcd_wrcmd(0x06);
		delay(100);
        lcd_wrcmd(0x01);
		delay(100);
}

//////////////////////////////////////////////
//
//	  生成汉字子模函数
//	  当lcd_wrdata(0);显示第一个汉字
//    当lcd_wrdata(1);显示第二个汉字
//
//////////////////////////////////////////////
lcd_h()
{
    uchar i;
    lcd_wrcmd(0x40);
	for(i=0;i<32;i++) lcd_wrdata(hanzi[i]);
}

/*****************读按键***************/
uchar getkey()
{
    uchar keycode=0xff,temp,i;
    key_bus=0x0f;
	temp=key_bus&0x0f; 
	if(temp!=0x0f)              //有键按下
	{
	   // beep=0;
	    key_bus=0x7f;
	    for(i=0;i<4;i++)
		{
			temp=key_bus&0x0f;
            if(temp==0x07)
	        {    
			    keycode=i*4;
				break;
			}
	        else if(temp==0x0b)
			{
	            keycode=i*4+1;
				break;
			}
    	    else if(temp==0x0d)
			{
	            keycode=i*4+2;
				break;
			}
    	    else if(temp==0x0e)
			{
	            keycode=i*4+3;
				break;
			}
			key_bus=(key_bus>>1)|0x80;
		}

	     while((key_bus&0x0f)!=0x0f)   //等待释放
		 {
		     key_bus=0x0f; 
		 }
	//	 beep=1;								             
	    
	 }
	 return keycode;
}	    


welcome()
{
       
       uchar temp,i;
	   lcd_wrcmd(0x0c);
       lcd_wrcmd(0x82);	
	      
       for(i=0;i<14;i++)
	   		lcd_wrdata(str1[i]);
	   lcd_h();
	   lcd_wrcmd(0xc4);
	   lcd_wrdata('2');	lcd_wrdata('0');lcd_wrdata('0');lcd_wrdata('7');
	   lcd_wrdata(0);
	   lcd_wrdata('0');lcd_wrdata('7');
       lcd_wrdata(1);
	   while(1)
	   {	   	      			   		        	               
	       temp=getkey();
	       if(temp!=0xff)    //按任意键跳转
	       {
	           state=1;  
		       lcd_wrcmd(1);
		       break;
	       }
	   }
}
   

/*phase()
{
       uchar i,j,cnt=0;	   
	   lcd_wrcmd(0x0f);
	   lcd_wrcmd(0xc9);
	   lcd_wrdata(2);
       lcd_wrcmd(0x83);
       for(i=0;i<12;i++)lcd_wrdata(str3[i]);
	   lcd_wrcmd(0xc5);
	   while(1)	                 //按键处理

	   { 
	       i=getkey();
	       if(i<10)
	       {	 cnt++;
	  		     if(cnt<=3)
				 {	
				     lcd_wrcmd(0xc5+cnt-1);
			         lcd_wrdata(0x30+i);
			     }		 			 
			     else
				 {
				     cnt=0;					 					 
					 lcd_wrcmd(0xc5);
					 for(j=0;j<=3;j++)
					     lcd_wrdata(' ');
					 lcd_wrcmd(0xc5);
			     }
		    }
		    else if(i==10)
		    {
		         state=1;
				 lcd_wrcmd(0x0c);
				 lcd_wrcmd(1);
				 lcd_wrcmd(0x80);
				 break;
	    	}
		    else if(i==11)
			{
			    cnt=0;					 					 
			    lcd_wrcmd(0xc5);
				for(j=0;j<=3;j++)
			    lcd_wrdata(' ');
			    lcd_wrcmd(0xc5);    
			 }
		}
}



frequency()
{
       uchar i,j,cnt=0;	 // 假如将cnt定义成全局变量,当退出这个界面时,cnt仍然保存原来的值   	  
	   lcd_wrcmd(0x80);	 //会出现光标乱跳的错误
	   lcd_wrcmd(0xce);
	   lcd_wrdata('H');
	   lcd_wrdata('Z');
	   lcd_wrcmd(0x81);
       for(i=0;i<15;i++)lcd_wrdata(str2[i]);
	   lcd_wrcmd(0x0f);
	   lcd_wrcmd(0xc0);
	   while(1)	                 //按键处理
	   { 
	       i=getkey();
	       if(i<10)
	       {	 cnt++;
	  		     if(cnt<=10)
				 {	
				     lcd_wrcmd(0xc0+cnt-1);
			         lcd_wrdata(0x30+i);
			     }		 			 
			     else
				 {
				     cnt=0;					 					 
					 lcd_wrcmd(0xc0);
					 for(j=0;j<=10;j++)
					     lcd_wrdata(' ');
					 lcd_wrcmd(0xc0);
			     }
		    }
		    else if(i==10)
		    {
		         state=1;
				 lcd_wrcmd(0x0c);
				 lcd_wrcmd(1);
				 lcd_wrcmd(0x80);
				 break;
	    	}
		    else if(i==11)
			{
			    cnt=0;					 					 
			    lcd_wrcmd(0xc0);
				for(j=0;j<=10;j++)
			    lcd_wrdata(' ');
			    lcd_wrcmd(0xc0);    
			}
		}

}

warning()
{
    uchar i,ii;
    lcd_wrcmd(1);
	lcd_wrcmd(0x0c);
	lcd_wrcmd(0x83);
	for(i=0;i<9;i++)
	    lcd_wrdata(warn[i]);
	lcd_wrcmd(0xc1);	 
	for(i=0;i<12;i++)
	    lcd_wrdata(warn[i+9]);
	while(1)
	{
	    ii=getkey();
		if(ii!=0xff)
		{
		    lcd_wrcmd(1);
			break;
		    
		}

	}
}


uchar dac_convert(uchar *amp)
{
    uint v;
	v=amp[2]*100+amp[1]*10+amp[0];
	if(v<500)
	{
	     v=32*v;
	     dac_tlc5620(v/100);
		 return 0;
	 }
	 else
	 {
	     return 1;
	 }
	    
}


amplitude()
{
     uchar i,ii;
	 uchar amp[3],t=0;
	 lcd_wrcmd(0x80);
	 for(i=0;i<16;i++)
	     lcd_wrdata(am[i]);
	 lcd_wrcmd(0xcc);
	 lcd_wrdata('V');
	 lcd_wrcmd(0xc8);
	 lcd_wrdata('.'); 
	 lcd_wrcmd(0x0f);            //开光标
	 lcd_wrcmd(0xc7);
	 while(1)
	 {
	     ii=getkey();
	     if(ii==10)
		 {
		     if(t==4)
			 {
			     if(dac_convert(amp))
				 {
				     warning();
				     break;
				  }
			 }
		     lcd_wrcmd(0x0c);
			 state=1;
			 lcd_wrcmd(1);
			 break;
		 }
		 if(ii<10)
		 {	 
		     t++;
			 if(t==1)
			 {
				lcd_wrcmd(0xc9);
			 }
			 if(t==2)t++;
			 if(t==1)amp[2]=ii;
			 else if(t==3)amp[1]=ii;
			 else if(t==4)amp[0]=ii;	     

			 if(t==5)
			 {
			      t=0;
				  lcd_wrcmd(0xc7);
				  lcd_wrdata(' '); lcd_wrdata('.');lcd_wrdata(' ');lcd_wrdata(' ');
				  lcd_wrcmd(0xc7);
			 }
			 else
			 {
			      lcd_wrcmd(0xc6+t);
			      lcd_wrdata(0x30+ii);
			 }
			 			 
			 
		 }

	    	     
	 }
    
}
*/
 
///////////////////////////////////输入函数////////////////////////////////////
 /*****************************************/

/*****************************************/

 /* 延时t毫秒 */
void delay2(uint t)
{
	uint i;
	while(t--)
	{
		/* 对于11.0592M时钟,约延时1ms */
		for (i=0;i<125;i++)
		{}
	}
} 

/* 产生复位脉冲初始化DS18B20 */
void TxReset(void)
{
	uint i;
	DQ = 0;

	/* 拉低约900us */
	i = 100;
	while (i>0)	i--;	
	
	DQ = 1;				// 产生上升沿

⌨️ 快捷键说明

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