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

📄 clcd.c

📁 AVR单片机完成128×64点阵液晶显示器的驱动控制程序和一些具体显示应用
💻 C
📖 第 1 页 / 共 3 页
字号:
	else if((Step<30)&&(Step>9))
	{
		x=ceil(Step/10-0.5); 
		LCD_WrCHr6x16(4,8,x);
		x=Step-(x*10);
		LCD_WrCHr6x16(4,16,x); 

	}
	else if(Step>=30)
	{
		LCD_WrCHr6x16(4,8,0);
		LCD_WrCHr6x16(4,16,0); 
	}
}	
	


//------------    进制转换    ------------//
unsigned int D2H(unsigned int x)
{
	unsigned char y;
	unsigned int z;
	z=x&0x0F00;
	z>>=8;
	z*=100;
	y=x&0x00F0;
	y>>=4;
	z=(y*10)+z+(x&0x000F);
	return z;
}  


//------------    键盘扫描    ------------//
unsigned int keyscan(void)
{   
	unsigned int ke=0;
//	SO=1;
//	SOC=0;
//	KO=0;
//	KOC=1;
//	delay_ms(2);
 	if (Key_In != old_Key)
	{
		delay_ms(20);
		if (Key_In != old_Key)
		{
			ke=Key_In^old_Key; 
            ke<<=8;
			old_Key=Key_In;   				           
	 	}
	}
            ke=ke+(255-Key_In);       
	return ke;
}   

/*
//------------    状态扫描    ------------//
unsigned char st_scan(void)
{   
	unsigned char St;
//	KO=1;
//	KOC=0;
//	delay_us(200);
//	SO=0;
//	SOC=1;
//	delay_ms(5);

	St=255-PIND; 
	KO=0;
	SO=1;
    return St;
}


void MotoKey(void)
{
    unsigned char SC;
    Time[8]= 0x0096 ;    //about 15S
 
    #asm("sei")		//开总中断
   
    while((Time[8])&&(SC&0x03))
    {
 //	    SC=st_scan();
	    Err_Msg=Step; 
	    
	    if(SC&0x01)
 		{
 			RD8=0;
 			RD9=1;
  	 		Step=0x9D;
 		}
 		else if(SC&0x02)
 		{
 			RD9=0;
 			RD8=1;
 			Step=0x9C;
 		}
	}
    #asm("cli")		//关总中断
    R_OFF();
}  


*/

//------    Turn Off all relay    -----//
void R_OFF(void)
{
 	RD0=1;
 	RD1=1;
 	RD2=1;
 	RD3=1;
 	RD4=1;
 	RD5=1;
 	RD6=1;
 	RD7=1;
 	RD8=1;
 	RD9=1;
}

//------------    电机位置状态初始化    ------------//
void MotoIni(void)
{
    Time[8]= 0x0096 ;    //about 10S
    Step=0xFF;    
    while(!sdown&&(Time[8])) //回到低位置
    {
	    RD9=0;
	    if(Key0==0)
	    {
	    	Time[8]=0;
	    }
	}  
    RD9=1;
    Time[8]= 0x0096 ;    //about 30S
    
 	if (!sdown)
 	{
	    Err_Msg=0xFB; 
 	}
 	else 
 	{
	    while(!ssp&&(Time[8]))//回到停止位置
    	{
		    RD7=0;
		    if(Key0==0)
		    {
	    		Time[8]=0;
	   		}
		} 
	    RD7=1;
  	 	if (!ssp)
 		{
	    	Err_Msg=0xFE; 
 		}
 	}
}

void Rolling(void)
{
	if(roll==0)
	{	
		RD9=s_down;
		roll=1;
		Time[8]=0x0096;  //about 10S
	}
	else if((s_down)&&(roll==1))
	{
		RD9=1;
		RD7=0;
		roll=2;
	}
	else if ((!s_sp)&&(roll==2))
	{
		roll=3;
		delay_ms(10);
	}
	else if ((roll==3)&&(s_sp))
	{
		RD7=1;
		roll=4;
		Time[8]=0x0096;  //about 10S
		RD8=0;
	}
	else if((s_up)&&(roll==4))
    {
    	RD8=1;
    	roll=5;
	}
	else if((roll<5)&&(Time[8]==0))
	{
		roll=8;
	}
}   

/*----------                 执行程序:                   ----------*/
/*-- RD0..RD6 ==KA..KG 共7个,其余3个:旋转、升高、降低 RD 7、8、9 --*/
/*------- 转盘位置:低、高、A、B、C、D点分别对应触点开关0..5 -------*/
void execute(void)
{	
	if (!test)
	{
		 s_up=sup;
		 s_down=sdown;
		 s_sp=ssp;
	}

    if(Step==0xFF)    	//开始
    {
    	Step=0;
    }
    
    if(Step==0) 		//1            	//处理溶液A
    {
 		RD0=0;
 		RD5=0;
 		RD8=0;
 		Time[0] = D2H(Timeset[0]);
		Time[8]=0x0096;  //about 15S
		roll=10;
 		Step=1;
	}

    if(Step==1)
    {
    	if(((s_up)||(roll==11))&&(Time[0]==0))
    	{	Step=2;
    		R_OFF();    		
    	}
    	else if(s_up)
    	{ 	
 			RD8=1;
 			roll=11;
		}
		else if( Time[0]==0)
		{
	  		RD0=1;
 			RD5=1;
 		}
 		if(Time[8]==0)
 		{
 			roll=8;
 		}
	}
 	
 	if (Step==2) //2
 	{
 		RD4=0;
 		RD6=0;
 		Time[1]=D2H(Timeset[1]);
 		Step=3;
 	}
 	
 	if((Step==3)&&(Time[1]==0)) //3
 	{
 		RD4=1;
 		RD6=1;
  		RD1=0;
 		RD5=0;
  		Time[2]=D2H(Timeset[2]);
 		Step=4;
 		roll=0;
 	} 
 	
 	if(Step==4) //处理溶液B
 	{
 		Rolling();
 		if(Time[2]==0)
 		{
 	 		RD1=1;
 			RD5=1;
 		}
 		if((roll==5)&&(Time[2]==0))
 		{
	 		RD4=0;
	 		RD6=0;
 	  		Time[3]=D2H(Timeset[3]);
  			Step=5;
 		}
 	}  
 	
 	if((Step==5)&&(Time[3]==0))
 	{ 	
 		RD4=1;
 		RD6=1;
 		RD2=0;
 		RD5=0;
  		Time[4]=D2H(Timeset[4]);
  		Step=6;
  		roll=0;
 	}
 	
 	if(Step==6)  //5	//处理溶液C
 	{
 		Rolling();
 		if(Time[4]==0)
 		{
 	 		RD2=1;
 			RD5=1;
 		}
 		if((roll==5)&&(Time[4]==0))
 		{
  			RD4=0;
   			RD6=0;
   			Time[5]=D2H(Timeset[5]);
			Step=7;
 		}
 	}
 	

  	if((Step==7)&&(Time[5]==0))//9
 	{
 		RD4=1;
 		RD6=1;
  //		RD9=0;
 		
 		RD3=0;
 		RD5=0;
  		Time[6]=D2H(Timeset[6]);
 		Step=8;
 		roll=0;
 	} 

 	if(Step==8)  //5	//处理溶液D
 	{
 		Rolling();
 		if(Time[6]==0)
 		{
 	 		RD3=1;
 			RD5=1;
 		}
 		if((roll==5)&&(Time[6]==0))
 		{
 			RD4=0;
  			RD6=0;
 			Time[7]=D2H(Timeset[7]);
 			Step=9;
 		}
 	}
  
 	if(Step==9&&(Time[7]==0)) 
 	{
 		R_OFF();
 		Step=10; 		
 	}
  	
 	if(Step==10) 
 	{
 		MotoIni();
 		roll=9;
 		test=0;
 	}
 	 	
 	s_up=0;
	s_down=0;
	s_sp=0;
	
}	



/*----------                 执行程序:                   ----------*/
/*-- RD0..RD6 ==KA..KG 共7个,其余3个:旋转、升高、降低 RD 7、8、9 --*/
/*------- 转盘位置:低、高、A、B、C、D点分别对应触点开关0..5 -------*/
/*
void execute(void)
{   
	
	if (!test)
	{
		 s_up=sup;
		 s_down=sdown;
		 s_sp=ssp;
	}

    if(Step==0xFF)    	//开始
    {
    	Step=0;
    }
    
    if(Step==0) 		//1            	//处理溶液A
    {
 		RD0=0;
 		RD5=0;
 		RD8=0;
 		Step=1;
	}

 	if((s_up)&&(Step==1))
 	{ 	
 		Time[0] = D2H(Timeset[0]);
 		Step=2;
 		RD8=1;
 	}
 	
 	if ((Step==2)&&(Time[0]==0)) //2
 	{
 		RD0=1;
 		RD5=1;
 		RD4=0;
 		RD6=0;
 		Time[1]=D2H(Timeset[1]);
 		Step=3;
 	}
 	
 	if((Step==3)&&(Time[1]==0)) //3
 	{
 		RD4=1;
 		RD6=1;
 		RD9=0;
 		Step=4;
 	} 
 	
 	if((Step==4)&&(s_down)) 
 	{
 		RD9=1;
		RD7=0;
		delay_ms(800);
  		Step=5;		
 	}  
 	
 	if((Step==5)&&(s_sp)) 	//处理溶液B
 	{
 		RD7=1;
 		Step=6;
// 		RD9=1;
// 		RD7=1;
 	  //	delay_ms(10);
 		RD1=0;
 		RD5=0;
 		RD8=0;
 	 //	Step=7;
 	}
 	
 	if((s_up)&&(Step==6))
 	{ 	
  		Time[2]=D2H(Timeset[2]);
  		Step=7;
 		RD8=1;
 	}
 	
 	if((Time[2]==0)&&(Step==7))  //5
 	{
 		RD1=1;
 		RD5=1;
 		RD4=0;
 		RD6=0;
 		Time[3]=D2H(Timeset[3]);
 		Step=8;
 	}
 	
 	if((Step==8)&&(Time[3]==0))	//6
 	{
 		RD4=1;
 		RD6=1;
 		RD9=0;
 		Step=9;
 	} 
 	
 	if((Step==9)&&(s_down)) 
 	{
 		RD9=1;
 		RD7=0;
		delay_ms(800);
 		Step=10;
 	}
 	if((Step==10)&&(s_sp)) 	//处理溶液C
 	{
 		RD7=1;
 		Step=11;
// 		RD9=1;
// 		RD7=1;
 	  //	delay_ms(10);
 		RD2=0;
 		RD5=0;
 		RD8=0;
 	 //	Step=13;
 	}
 		
  	if((s_up)&&(Step==11))
 	{ 	
  		Time[4]=D2H(Timeset[4]);
  		Step=12;
 		RD8=1;
 	}
 	
 	if((Time[4]==0)&&(Step==12))  //8
 	{
 		RD2=1;
 		RD5=1;
 		RD4=0;
 		RD6=0;
 		Time[5]=D2H(Timeset[5]);
 		Step=13;
 	}
 
  	if((Step==13)&&(Time[5]==0))//9
 	{
 		RD4=1;
 		RD6=1;
 		RD9=0;
 		Step=14;
 	} 
 	
 	if((Step==14)&&(s_down)) 
 	{
 		RD9=1;
 		RD7=0;
		delay_ms(800);
 		Step=15;
 	}
 	if((Step==15)&&(s_sp)) //10 	//处理溶液D
 	{
 		RD7=1;
 		Step=16;
   //		RD9=1;
 //		RD7=1;
 	  //	delay_ms(10);
 		RD3=0;
 		RD5=0;
 		RD8=0;
 	   //	Step=19;
 	}
 		
  	if((s_up)&&(Step==16))
 	{ 	
  		Time[6]=D2H(Timeset[6]);
  		Step=17;
 		RD8=1;
 	}
 	
 	if((Time[6]==0)&&(Step==17))  //11
 	{
 		RD3=1;
 		RD5=1;
 		RD4=0;
 		RD6=0;
 		Time[7]=D2H(Timeset[7]);
 		Step=18;
 	}	

  	if((Step==18)&&(Time[7]==0))//12
 	{
 		RD4=1;
 		RD6=1;
 		RD9=0;
 		Step=19;
 	} 
 	    
 	
 	if((Step==19)&&(s_down)) 
 	{
 		RD9=1;
 		RD7=0;
		delay_ms(800);
 		Step=20;
 	}
 	if((Step==20)&&(s_sp)) 
 	{
 		RD7=1;
 		Step=21;
 	}
 	if((Step==21)&&(s_down)&&(s_sp)) //回到初始位置
 	{
 		R_OFF();
 		Step=22;
 	}
 	
 	s_up=0;
	s_down=0;
	s_sp=0;

}	
*/


//------------    设 置 时 间  参  数    ------------//
void F_TimeSet(unsigned char mark, unsigned char ud)
{
	unsigned char ii,jj,kk;

	jj=ceil(mark/3-0.5); 
	ii=mark-jj*3;
	if (ii==0)
	{   
		kk = tset[jj]>>8;
		kk = kk&0x0F;
		if (ud==1)
	    {
	    	if(kk<9)
	    	{	tset[jj]+=0x0100;}
	    }
	    else if(ud==0)
	    {
	    	if(kk>0)
	    	{	tset[jj]-=0x0100;}
	    }
	 }

	if (ii==1)
	{   
		kk= tset[jj]>>4;
		kk&=0x0F;
		if (ud==1)
	    {
	    	if(kk<9)
	    	{	tset[jj]+=0x0010;}
	    }
	    else if(ud==0)
	    {
	    	if(kk>0)
	    	{	tset[jj]-=0x0010;}
	    }
	 }
	 
	if (ii==2)
	{   
		kk= tset[jj]&0x0F;
		if (ud==1)
	    {
	    	if(kk<9)
	    	{	tset[jj]+=0x0001;}
	    }
	    else if(ud==0)
	    {
	    	if(kk>0)
	    	{	tset[jj]-=0x0001;}
	    }
 	 }            
 } 
 


//---- Timer 0 overflow interrupt service routine ----// 
//--------      定时溢出中断  4ms      ---------------//
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
	unsigned char i;
	TCNT0=0x05;
	if (!(T25--))
	{
		T25=24;
		for(i=0;i<9;i++)
		{
			if (Time[i]!=0)
			{
				Time[i]--;
			}
		}
	}
}

⌨️ 快捷键说明

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