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

📄 xiyiji.c

📁 使用KEIL PROTEUS等软件,实现键盘扫描和LED灯的显示
💻 C
📖 第 1 页 / 共 2 页
字号:
 /*P1.0~~~p1.5  键盘扫描口
P3.5  测温器
P3.6  加热器
P0   显示数据口
P2.0~~~P2.2 显示口控制线
P2.3  检测水满
P2.4  检测水排光
P2.5  加水闸;
P2.6  排水闸;
P2.7  喇叭
3.0   洗衣服电机
P3.1  洗衣服电机
P3.2  P3.3 P3.4  状态灯口
剩下没用到的口有
P3.7 P1.6 P1.7
*/
//*******************************************************
#include <at89x51.h>     
unsigned char minite=24; //分钟全局变量在定时器0中用到
unsigned char second=8; //秒钟全局变量在定时器0中用到
unsigned char  wdz=37;   //全局变量可调节的临界温度值变量
bit flag=0;
bit sflag=0;   //设置慢洗中的变量 在定时器0中用到
bit sflagg=0;  //设置报警中的变量 在定时器1中用到
unsigned char san=0; //设置三分钟排水 报警中的变量 在定时器1中用到
unsigned char ba=0;  //设置八分钟排水 报警中的变量 在定时器1中用到
unsigned char biao=0; //设置标号选择 识别按键值
unsigned char su=0;   //确定键的标识号
unsigned char jc1,jc2;//暂停时 寄存 p2 p3 口
//******************************************************
void jia();
void jian();
void getkey(void);
void jiashui(void);
void paishui(void);
void jiawen(void);
void threetime(void );
void twotime(void);
void manxi(void);
void sure(void);
void baojing(void);
//*************************************************
void daojishi(void) ;//定时器0
void dingshi(void) ;//定时器1
//************************************************
void disauto3();//以下是六个操作按键的显示函数
void disauto2(void);
void diskxi(void);
void dismxi(void);
void distuoshui(void);
void disjiare(void);
//*************************************************
void delay(unsigned int i);//延时
void Delay1ms(unsigned int count);//延时
//LCD灯显示的初始化******************************************
sbit LcdRs		= P2^0;
sbit LcdRw		= P2^1;
sbit LcdEn  	= P2^2;
#define  DBPort   P0
#define LCD_COMMAND			0      // Command
#define LCD_DATA			1      // Data
unsigned char LCD_Wait(void);
void LCD_Write(bit style, unsigned char input);
void LCD_Initial();
void GotoXY(unsigned char x, unsigned char y);
void Print(unsigned char *str);
void IntToStr( unsigned char *str) ;
void charToStr( unsigned char *str) ;
void display(void);//显示当前温度和设置要到的温度
void disp(void);//
void wdszStr( unsigned char *str) ;
void wdszdis(void);
//**************************************
sbit DQ=P3^5;//读温度是用到的函数
ReadOneChar(void);//读一个字节
WriteOneChar(unsigned char dat);
unsigned int ReadTemperature(void);//读取温度
//***************************************************
void main(void)
{	
   unsigned char n;
   for(n=0;n<2;n++)
	{
        P2=0;P3=0;
		LCD_Initial();
        Delay1ms(10);
		GotoXY(0,0);
		Print("Hello Welcome to");
        GotoXY(0,1);
		Print("Washing System !");
     }
	while(1)
	  {
	    getkey();
		if((biao==3)||(biao==4)||(biao==5))disp();
		if(biao==6)display();
	   }
}
//************************************************************************
void Delay1ms(unsigned int count)
{
	unsigned int i,j;
	for(i=0;i<count;i++)
	for(j=0;j<120;j++);
}
void delay(unsigned int i)//延时函数
{
    while(i--);	
}
//*************************************************************************
bit pkey(void)//判断键的否被按下,通过返回值确定
{
   P1=0x38;      //p.0~p1.2接行,p1.3~~~p1.5接列。。给行输入低电平,给列输入高电平,整体扫描
   if(P1!=0x38)
     {
       Delay1ms(50);
       if(P1!=0x38)
       return 1;//如果有按键按下返回1
       else 
       return 0;
      }
    else return 0;//没有按键按下返回0
}
void getkey(void)
{  
 unsigned char key=0x09,s,k,c;
 while(1)
  { 
   if(pkey()==1)
   {
    P1=0x3e;
    k=0x3e;
	for(c=0;c<3;c++)
	  { 
  		s=P1&0x38;
		switch(s)
		 {
		  case 0x30: key=3*c+0; break; 
		  case 0x28: key=3*c+1; break;
 		  case 0x18: key=3*c+2; break;
		  default: break; 
		}
 		k=(k<<1)|0x01;
 		P1=k;  
	  }
     while(pkey());
     switch(key)
       {
	    case 0x00 :if(su==0)disauto3(); break;//自动洗3次加脱水
        case 0x01 :if(su==0)disauto2(); break;//自动洗2次加脱水
        case 0x02 :if(su==0)diskxi();break;//快速洗一次
        case 0x03 :if(su==0)dismxi() ;break;//慢速洗一次
        case 0x04 :if(su==0)distuoshui();break;//脱水
        case 0x05 :if(su==0)disjiare();break; //加温
        case 0x06 :jia(); break;//加
        case 0x07 :jian();break;//减
		case 0x08 :su++;if(su>=4)su=2;sure();break;//确定键和暂停
        default   :break;   
 	   }
		
    }
   else	
  break;
 }
}
//****************************************************
void disauto3(void)
{ 
    P3_2=0;P3_3=1;P3_4=1;TR1=0;
    GotoXY(0,0);
	Print("system will auto");
	GotoXY(0,1);
	Print("wash three times");
	biao=1;
}
void disauto2(void)
{ 
    P3_2=1;P3_3=0;P3_4=1;TR1=0;
    GotoXY(0,0);
	Print("system will auto");
	GotoXY(0,1);
	Print(" wash two times ");
	biao=2;
 }
void diskxi(void)
{
	P3_2=0;P3_3=0;P3_4=1;TR1=0;
	minite=8;
	GotoXY(0,0);
	Print(" kuai xi yi ci  ");
	GotoXY(0,1);
	Print("time:           ");
	biao=3;
}
void dismxi(void)
{
	P3_2=1;P3_3=1;P3_4=0;TR1=0;
	minite=8;
	GotoXY(0,0);
	Print(" man xi yi ci   ");
	GotoXY(0,1);
	Print("time:           ");
	biao=4;
}
void distuoshui(void)
{
	P3_2=0;P3_3=1;P3_4=0;TR1=0;
    minite=7;P2_6=1;
	GotoXY(0,0);
	Print("tuo shui shijian");
	GotoXY(0,1);
	Print("time:           ");
	biao=5;
}
void disjiare(void)
{ 
	P3_2=1;P3_3=0;P3_4=0;TR1=0;
	GotoXY(0,0);
	Print("from:           ");
	GotoXY(0,1);
	Print("to:             ");
	biao=6;
}
//************************************************************
void jia(void)
{
  minite++; wdz++;
  if(minite==60) minite=0; 
}
void jian(void)
{
  minite--; wdz--;
  if(minite<=0) minite=0; 
}
//*************************************************************************
void sure(void)
{
    while(su==1)
      {   
        if(biao==0){su=0;TR1=0;}
        while((biao==1)||(biao==2))
	      {  
              jiawen();
              if(biao==1)  
		      threetime();
              else
              twotime();
		   }
	    while((biao==3)||(biao==4)||(biao==5))
	       {   
	          if((biao==3)||(biao==4))
			  jiashui();
              daojishi();
		      P3_1=0;P3_0=1;
		      GotoXY(0,0);
			  if(biao==3)Print(" kuai xi yi ci  ");
			  if(biao==4)Print(" man xi yi ci   ");
			  GotoXY(0,1);
			  Print("time:           ");
		      while(1)
			   {
				  disp();if(biao==4)manxi();
			      getkey();
				  while((second<=5)&&(minite==0))
				   {
                    P2_6=1;P3_0=0;su=0;GotoXY(0,1);
			        Print("wan cheng le ");baojing();
                   }
			    }    
		    }
         while(biao==6)
        	{       
	          jiawen();
              P3_6=0;
			  GotoXY(0,0);
			  Print("jia wen jie su");
			  GotoXY(0,1);
			  Print("keyi xiyi  le ");
			  su=0;baojing();
			 }
       }
    while(su==2)
      { 
		P3_2=1;P3_3=1;P3_4=1;
		jc1=P2;
		jc2=P3;  
		TR0=0;
		P3=0;
		P2=0;
		while(1)
		{getkey();}
	   }
    while(su==3)
      {
		P3_2=0;P3_3=0;P3_4=0;TR0=1;
		P2=jc1;
		P3=jc2;
		while(1)
		{getkey();if(biao==6)display();else disp();}
      }
}
//*****************************************************************************
void jiashui(void)// P2.3检测水满//P2.4检测水排光//P2.5加水闸;//P2.6排水闸;
{      
	P3=0;
	GotoXY(0,0);
	Print("xi tong zheng   ");
	GotoXY(0,1);
	Print("zai jia shui    ");
	dingshi();
	while(P2_3!=1||P2_4!=1)
	 { su=0;
	  P2_5=1; if(san)baojing();   
	 }
	P2_5=0;TR1=0;
}
//***********************************************************************************
void paishui(void)//排水 縋2.3检测水满;  P2.4检测水排光;  P2.5加水闸;  P2.6排水闸;
{     
	P3=0;
	GotoXY(0,0);
	Print("xi tong zheng   ");
	GotoXY(0,1);
	Print("zai pai shui    ");
	dingshi();
	while(P2_4==1||P2_3==1)
	 { su=0;
	  P2_6=1;if(san)baojing();	
	 }
	P2_6=0;TR1=0;
} 
//******************************************************
 void jiawen(void)//P3.7  测温器   P3.6 加热器
{          
	ReadTemperature() ;
	jiashui();
	GotoXY(0,0);
	Print("from:           ");
	GotoXY(0,1);
	Print("to:             ");
	//  Delay1ms(800);
	dingshi();
	while(ReadTemperature()<=wdz)
	  {  
		P3_6=1;
		display();
		getkey();su=0; 
		if(ba)baojing();
	  }
	P3_6=0; 
	TR1=0;
}
//************************************
void manxi(void)
{
 daojishi();
 if(sflag)P3_0=1;
 else P3_0=0;
}
//自动洗3次**********************************************************

⌨️ 快捷键说明

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