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

📄 power_supply.c

📁 基于51单片机和LCD1602编写的一个人机界面程序
💻 C
📖 第 1 页 / 共 3 页
字号:
			    t--;
				if(t==0) t=99;
				temp_h=t/10;
	            temp_l=t%10;
			    lcd_wrcmd(0x87);
	            lcd_wrdata(0x30+temp_h);
	            lcd_wrdata(0x30+temp_l);
				lcd_wrcmd(0x87);
				if((sw4==0)||(sw3==0))    //还有按键,延时一段时间
				{
				    for(n=0;n<1000;n++)delay(200);
					while((sw4==0)||(sw3==0))    //有按键,处理连击键
					{
					   //beep=beep_f;
					   t--;
				       if(t==0) t=99;
					   temp_h=t/10;
	                   temp_l=t%10;
			           lcd_wrcmd(0x87);
	                   lcd_wrdata(0x30+temp_h);
	                   lcd_wrdata(0x30+temp_l);
				       lcd_wrcmd(0x87);
					   for(n=0;n<200;n++)delay(250);
					   beep=beep_f;
					   for(n=0;n<100;n++)delay(250);
					   beep=1;
					   for(n=0;n<100;n++)delay(250);
					 }     
				 }
				 beep=1;    //关闭蜂鸣器    
		    }
		}
        //**********************END************************



		else if(((sw1==0)||(sw0==0)))
		{
		     ii=key();
			 if(ii==5)
		     {
		            set_t=t;
			        IICWrite(1004,set_t);
			        lcd_wrcmd(0x0c);
			        lcd_wrcmd(1);
			        display(0xc3,str_su);
			        for(n=0;n<1500;n++)delay(250);
			        lcd_wrcmd(1);
			        state=2;
			        break; 
		     
		      }
		      else if(ii==6)
		      {
		            lcd_wrcmd(1);
			        lcd_wrcmd(0x0c);
			        state=2;
			        break; 
		    
		       }

		}

       

		/*
	    ii=key();
	    if((ii==1)||(ii==4))        //加1操作
		{
		    
			    t++;
				if(t>99)
				{
				    t=0;
				}
				temp_h=t/10;
	            temp_l=t%10;
			    lcd_wrcmd(0x87);
	            lcd_wrdata(0x30+temp_h);
	            lcd_wrdata(0x30+temp_l);
				lcd_wrcmd(0x88);			
		  }
		  else if((ii==2)||(ii==3))//减1操作
		  {
		        t--;
				if(t==0)
				{
				    t=99;
				}
				temp_h=t/10;
	            temp_l=t%10;
			    lcd_wrcmd(0x87);
	            lcd_wrdata(0x30+temp_h);
	            lcd_wrdata(0x30+temp_l);
			    lcd_wrcmd(0x88);		
			
		  }
		  else if(ii==5)
		  {
		    set_t=t;
			IICWrite(1004,set_t);
			lcd_wrcmd(0x0c);
			lcd_wrcmd(1);
			display(0xc3,str_su);
			for(n=0;n<1500;n++)delay(250);
			lcd_wrcmd(1);
			state=2;
			break; 
		     
		}
		else if(ii==6)
		{
		     lcd_wrcmd(1);
			 lcd_wrcmd(0x0c);
			 state=2;
			 break; 
		    
		 }
	     */
	}
}
   



lcd_h()
{
    uchar i;
    lcd_wrcmd(0x40);
	for(i=0;i<40;i++) lcd_wrdata(hanzi[i]);
}


menu()
{
    uchar ii,ss=1;          //ss=1 极为重要,当ss=0时按键会出现失控现象
	lcd_wrcmd(1);
	lcd_wrcmd(0x80);
	lcd_wrdata('-');
	lcd_wrdata('>');
    display(0x83,str_menu1);
	display(0xc3,str_menu2);
	while(1)
	{
	    ii=key();
		///////////////////////////////////////////////
		if(ii==1)  //UP
		{
		        ss--;
			    if(ss==0)ss=3;
			    if(ss==1)
				{
				     lcd_wrcmd(1);lcd_wrcmd(0x80);
				     lcd_wrdata('-');
	                 lcd_wrdata('>');
                     display(0x83,str_menu1);
         	         display(0xc3,str_menu2); 
				}
				else if(ss==2)
				{
				     lcd_wrcmd(1);
					 lcd_wrcmd(0xc0);
				     lcd_wrdata('-');
	                 lcd_wrdata('>');
                     display(0x83,str_menu1);
         	         display(0xc3,str_menu2); 
				}
				else if(ss==3)
				{
				     lcd_wrcmd(1);
					 lcd_wrcmd(0xc0);
				     lcd_wrdata('-');
	                 lcd_wrdata('>');
                     display(0x83,str_menu2);
         	         display(0xc3,str_menu3);
				}


		}
		else if(ii==2)  //Down
		{
		        ss++;
			    if(ss==4)ss=1;
			    if(ss==1)
				{
				     lcd_wrcmd(1);lcd_wrcmd(0x80);
				     lcd_wrdata('-');
	                 lcd_wrdata('>');
                     display(0x83,str_menu1);
         	         display(0xc3,str_menu2); 
				}
				else if(ss==2)
				{
				     lcd_wrcmd(1);
					 lcd_wrcmd(0xc0);
				     lcd_wrdata('-');
	                 lcd_wrdata('>');
                     display(0x83,str_menu1);
         	         display(0xc3,str_menu2); 
				}
				else if(ss==3)
				{
				     lcd_wrcmd(1);
					 lcd_wrcmd(0xc0);
				     lcd_wrdata('-');
	                 lcd_wrdata('>');
                     display(0x83,str_menu2);
         	         display(0xc3,str_menu3);
				}
	        
		}
	   else if(ii==5) //确定键
	   {
	            if(ss==1)
				{
				    lcd_wrcmd(1);
		            state=5;             //voltage()
		            break;

				}
	            else if(ss==2)
				{
				      
				    lcd_wrcmd(1);
		            state=2;		     //clock()
		            break;
				 }
				 else if(ss==3)
				 {
				     lcd_wrcmd(1);
					 state=9;
					 break;
				 }
//	       
	   }
	   else if(ii==6)
	   {
		   lcd_wrcmd(1);
		   state=0;
		   break;
		}    
	}
    
}


rollscreen_l(uchar *str,uchar l)
{
    uchar i,temp;
	temp=str[0]; 
	for(i=0;i<l;i++)
	    str[i]=str[i+1];

	str[l-1]=temp;
}



rollscreen_r(uchar *str,uchar l)
{
    uchar i,temp; 
	temp=str[l-1];
	for(i=l-1;i>0;i--)
	    str[i]=str[i-1];
	str[0]=temp;
	
}
	    
     
    

about()
{
    uchar ii,i;
	uint j;
	bit flag=1;
	uchar str[23]="  BY H.C.H VERSION1.0  ";
    lcd_wrcmd(1);
	display(0xc0,str_test);
	while(1)
	{
	    
	    ii=key();
		if(ii==6)
		{
		    lcd_wrcmd(1);
			state=1;
			break;
		}
		else if(ii==3) flag=0;
		else if(ii==4) flag=1;

		if(flag==0) rollscreen_l(str,23);
		else  rollscreen_r(str,23);
		lcd_wrcmd(0xc0);
		for(i=0;i<16;i++)
		    lcd_wrdata(str[i]);
		for(j=0;j<600;j++)
		    delay(250);
	}
}


time_up()
{
    uchar cnt=0,i,ii=0;
	uchar hour_h,hour_l,minute_h,minute_l;
	lcd_wrcmd(1);
	display(0xc3,str_timeup);
	hour_h=hour/16;
   	hour_l=hour%16;

    minute_h=minute/16;
    minute_l=minute%16;
        
	lcd_wrcmd(0x85);
    lcd_wrdata(0x30+hour_h);
	lcd_wrdata(0x30+hour_l);
	lcd_wrdata(':');
	lcd_wrdata(0x30+minute_h);
	lcd_wrdata(0x30+minute_l);

	while(1)
	{
	    cnt++;
		beep=0;
		for(i=0;i<250;i++)delay(200);
		beep=1;
		for(i=0;i<250;i++)delay(200);
		ii=key();
		if((ii!=0)||(cnt==100))
		{
		    lcd_wrcmd(1);
			if(f==1)f=0;
			else if(f_p==1)f_p=0;
			state=0;
			break;		    
		}

	}
}



time()
{
	uchar ii,hour_h,hour_l,minute_h,minute_l,second_h,second_l;
	uint j;

    uchar year_h,year_l,month_h,month_l,date_h,date_l,t_h,t_l;
	uchar h,m; 
	uchar lock,lock_time=0;
	t_h=read_temperature()/10;
	t_l=read_temperature()%10;
	lock=second;
	read_time();
	year_h=year/16;
	year_l=year%16;

	date_h=date/16;
	date_l=date%16;

	month_h=month/16;
	month_l=month%16;

	hour_h=hour/16;
	hour_l=hour%16;


	minute_h=minute/16;
    minute_l=minute%16;

	second_h=second/16;
	second_l=second%16;

	lcd_wrcmd(1);
	lcd_wrcmd(0x80);
	if(alarm_f==1)lcd_wrdata(0);
	else lcd_wrdata(' ');

	lcd_wrcmd(0xc0);
	if(beep_f==0)lcd_wrdata(3);
	else lcd_wrdata(' ');
	lcd_wrcmd(0xc2);
	if(key_lock)lcd_wrdata(4);
	else lcd_wrdata(' ');
	//显示第一行
    lcd_wrcmd(0x83);
	lcd_wrdata('2');
	lcd_wrdata('0');
	lcd_wrdata(0x30+year_h);lcd_wrdata(0x30+year_l);lcd_wrdata('/');
	lcd_wrdata(0x30+month_h);lcd_wrdata(0x30+month_l);lcd_wrdata('/');
    lcd_wrdata(0x30+date_h);lcd_wrdata(0x30+date_l);
	lcd_wrcmd(0x8e);
	lcd_wrdata(str_week[2*(week-1)]);
	lcd_wrdata(str_week[2*week-1]);	
	//显示第二行
	lcd_wrcmd(0xc4);
	lcd_wrdata(0x30+hour_h);
	lcd_wrdata(0x30+hour_l);
	lcd_wrdata(':');
	lcd_wrdata(0x30+minute_h);
	lcd_wrdata(0x30+minute_l);
	lcd_wrdata(':');
	lcd_wrdata(0x30+second_h);
	lcd_wrdata(0x30+second_l);
	
	while(1)
	{
	   
	   	   
       
	    t_h=read_temperature()/10;
	    t_l=read_temperature()%10;

		if(read_temperature()>set_t) fan=1;
		else if(read_temperature()<(set_t-1))fan=0;

		read_time();
	    year_h=year/16;
     	year_l=year%16;
	    date_h=date/16;
	    date_l=date%16;
	    month_h=month/16;
	    month_l=month%16;
	    hour_h=hour/16;
	    hour_l=hour%16;

	    minute_h=minute/16;
        minute_l=minute%16;

	    second_h=second/16;
	    second_l=second%16;
		h=hour_h*10+hour_l;
		m=minute_h*10+minute_l;
//*********************************************************
//利用实时时钟DS1302完成计时的功能
//思路:定义变量lock=second;然后读实时时钟
//当读出的second不等于lock时,表示时间过了一秒
//变量lock_time++,同时lock=second,等待下一秒的
//变化,当lock_time>40时,键盘上锁
//*********************************************************

        if((second!=lock)&&(key_lock==0))
		{
		    lock_time++;
			lock=second;
		 }
		if(lock_time>40)key_lock=1;

		lcd_wrcmd(0xc2);
	    if(key_lock)lcd_wrdata(4);
	    else lcd_wrdata(' ');					  

		if(f==1)
		{
		    if((h==alarm_hour[0])&&(m==alarm_minute[0])&&(alarm_f==1))
		    {
		        lcd_wrcmd(1);
			    state=10;
			    break;
	     	}
		}
		if(f_p==1)
		{
		    if((h==alarm_hour[1])&&(m==alarm_minute[1])&&(alarm_f==1))
		    {
		        lcd_wrcmd(1);
			    state=10;
			    break;
		    }

		}

		if((h!=alarm_hour[0])||(m!=alarm_minute[0]))
		{
		    f=1;    
		}
		if((h!=alarm_hour[1])||(m!=alarm_minute[1]))
		{
		    f_p=1;    
		}
	    lcd_wrcmd(0x80);
	    //显示第一行
        lcd_wrcmd(0x83);
	    lcd_wrdata('2');
	    lcd_wrdata('0');
	    lcd_wrdata(0x30+year_h);lcd_wrdata(0x30+year_l);lcd_wrdata('/');
	    lcd_wrdata(0x30+month_h);lcd_wrdata(0x30+month_l);lcd_wrdata('/');
        lcd_wrdata(0x30+date_h);lcd_wrdata(0x30+date_l);
	    lcd_wrcmd(0x8e);
	    lcd_wrdata(str_week[2*(week-1)]);
	    lcd_wrdata(str_week[2*week-1]);	
	    //显示第二行
	    lcd_wrcmd(0xc4);
	    lcd_wrdata(0x30+hour_h);
	    lcd_wrdata(0x30+hour_l);
	    lcd_wrdata(':');
    	lcd_wrdata(0x30+minute_h);
    	lcd_wrdata(0x30+minute_l);
    	lcd_wrdata(':');
    	lcd_wrdata(0x30+second_h);
	    lcd_wrdata(0x30+second_l);
     	lcd_wrcmd(0xcd);
    	lcd_wrdata(0x30+t_h);
    	lcd_wrdata(0x30+t_l);
    	lcd_wrdata(2);


	    if(key_lock==1)    //键盘上锁时,只有确定键有效
        {
            if(sw1==0)
	        {
	             for(j=0;j<4000;j++)  delay(250);
		         while(sw1==0)
			     {
			        lock_time=0;    //时间计数器清零
			        key_lock=0;
				    lcd_wrcmd(0xc2);
				    lcd_wrdata(' ');
		          }
		     }
	     }
	     else    //键盘解锁时
	     {
	          ii=key();
	          if(ii!=0)
		      {
		          lcd_wrcmd(1);
			      state=1;
			      break;
		       }
	      }

	}    
    
    
         
}

uchar key()
{
      uchar keycode=0,temp;
	  //键盘口,先置1
	  sw0=1; sw1=1;sw2=1;sw3=1;
	  sw4=1;sw4=1;
	  temp=P2&0x3f;
	  if(temp!=0x3f)
	  {
	          beep=beep_f;
	          delay(250);
			  //键盘口,先置1
			  sw0=1; sw1=1;sw2=1;sw3=1;
	          sw4=1;sw4=1;
	          temp=P2&0x3f;
			  if(temp!=0x3f)
			  {
			      if(temp==0x3e)         keycode=6;	    //P20
				  else if(temp==0x3d)    keycode=5;		//P21
				  else if(temp==0x3b)	 keycode=4;
				  else if(temp==0x37)	 keycode=3;
				  else if(temp==0x2f)    keycode=2;
				  else if(temp==0x1f)	 keycode=1;
			  }
			 while(temp!=0x3f)
			 {
			      temp=P2&0x3f;
			 }
			 beep=1;
	  }
	  return keycode;

	     
}

void display(uchar cmd,uchar code *str)
{
        uchar i=0;
		lcd_wrcmd(cmd);
		while(str[i]!='\0')
		{
		    lcd_wrdata(str[i]);
			i++;		    		    
		}
}

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);
}


⌨️ 快捷键说明

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