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

📄 mtouch722.c

📁 PIC单片机C语言程序设计实例精粹
💻 C
📖 第 1 页 / 共 2 页
字号:
			
			default :break;
			}
		FLAG.Flag_RequestSend = 0;
		}
	}
	//------------------------------------------
	void BackLightCtl(void)
	{
		static unsigned int countms;
		if(FLAG.Flag_BL)
		{
			if(countms<=5000)						//delay 5s
			{
				countms++;
				Delayms(1);
				return;
			}
			else
			{
				countms=0;
				if(BrtRate!=0)
				{
					BrtRate--;
					HighLevel = Brightness[BrtRate];	
	            	LowLevel = 10-Brightness[BrtRate];
				}
		 	} 	
		}
	}
	void SelectIO(unsigned char OutputValue)
	{
		if(IRcodenum == 0) 
		IR_OUT1 = OutputValue;
		else 
		IR_OUT2 = OutputValue;
	}
	void SendIR(unsigned char IRValue)
	{
		    unsigned char i,j;

			GIE = 0;
			BL_IO = 1;
			IR_OUT1 = 1;
			IR_OUT2 = 1;
			if(IRcodenum == 0)
			{
				IRSendCode[0]=0x01;
				IRSendCode[1]=0xFE;
			}
			else
			{
				IRSendCode[0]=0x00;
				IRSendCode[1]=0xFF;
			}
			IRSendCode[2]=IRValue;
			IRSendCode[3]=~IRValue;

			SelectIO(0);
										
			Delay50us(180);							//9ms 0
			
			SelectIO(1);							//4.5ms 1
			Delay50us(89);	
			for(i=0;i<4;i++)
			{
				for(j=0;j<8;j++)
				{
					NOP();
					if((IRSendCode[i]&0x80)==0x80)
					{
						SelectIO(0);		
						Delay50us(11);				//0.558ms	
						SelectIO(1);
						Delay50us(34);				//1.719ms	
						IRSendCode[i]<<=1;
					}
					else if((IRSendCode[i]&0x80)==0)
					{
						SelectIO(0);
						Delay50us(11);				//0.558ms
						
						SelectIO(1);
						Delay50us(11);				//0.558ms
						IRSendCode[i]<<=1;
					}
				}	
			}	
			SelectIO(0);							//stop
			Delay50us(11);
			SelectIO(1);
		/*--------check other status-------*/
		if(FLAG.Flag_StartRec)
		{
			FLAG.Flag_StartRec = 0;							//reset ir receive
			FLAG.Flag_Head = 0;
		}
		if(T0IF&&T0IE)
		RestartTimers();
		BL_IO = 0;
		GIE = 1;
	}
	
	/*-------------Delays--------------------*/
	void Delayms(unsigned char ms_num)
	{
		unsigned char i,j;
		asm("nop");
		for(i = ms_num;i > 0;i--)
		{
			for(j = 20;j > 0 ;j--)					//1ms
			{
			    Delay50us(1);
			}
		}
	}
	
	void Delays(unsigned char s_num)
	{
		unsigned char i,j;
		for(i = s_num;i > 0;i--)
		{
			for(j = 200 ;j > 0;j--)
			{
				Delayms(5);
			}
		}	
	}
	void Delay50us(unsigned char us_num)			//51us
	{
		unsigned char i,j;
		for(i= us_num;i > 0;i--)
		{
			for(j = 33;j > 0;j--)
			{
				NOP();
				CLRWDT();
				NOP();
			}
		}
	}
	/*------------------------------*/
	/*Interrupts                    */
	/*------------------------------*/
	void interrupt isr(void)
	{
		/*100us per interrupt for IR receive and send */		
		if(TMR2IF & TMR2IE)
		{
			TMR2IF = 0;
			ReceiveIR();
			PwmOutput();					// 1k	
			if(T0IF)						// If T0 have flaged , then initial timers
			RestartTimers();		
		}
		/*Button scan*/
		if(T0IF & T0IE)
		{
			T0IF = 0;						// Clear T0IF every time			
			TMR1ON = 0;	
			RawData[Index] = TMR1L + (unsigned int)(TMR1H << 8);
			
			switch (Index)
			{
				case 0:		Threshold[Index]  = Average[Index]>>THRESHOLD_0P78;  break;
				case 1:		Threshold[Index]  = Average[Index]>>THRESHOLD_0P78;  break;
				case 2:		Threshold[Index]  = Average[Index]>>THRESHOLD_0P78;  break;
				case 3:		Threshold[Index]  = Average[Index]>>THRESHOLD_0P78;  break;
				case 4:		Threshold[Index]  = Average[Index]>>THRESHOLD_0P78;  break;
				case 5:		Threshold[Index]  = Average[Index]>>THRESHOLD_0P78;  break;
				case 6:		Threshold[Index]  = Average[Index]>>THRESHOLD_0P78;  break;
				case 7:		Threshold[Index]  = Average[Index]>>THRESHOLD_0P78;  break;
				default:	break;
			}
			
			if (RawData[Index]< (Average[Index]-Threshold[Index]))
			{
				switch(Index)
				{
					case 0:		Buttons.ButtonBit.BTN0 	= 1;  break;					// The current button is pressed    
					case 1:		Buttons.ButtonBit.BTN1 	= 1;  break;					// Relay button pressed information to application
					case 2:		Buttons.ButtonBit.BTN2 	= 1;  break;		
					case 3:		Buttons.ButtonBit.BTN3  = 1;  break;    
					case 4:		Buttons.ButtonBit.BTN4  = 1;  break;		
					case 5:		Buttons.ButtonBit.BTN5  = 1;  break;  
					case 6:		Buttons.ButtonBit.BTN6  = 1;  break; 
					default:	break;
				}
			}
			else
			{
				switch(Index)
				{
					case 0:		Buttons.ButtonBit.BTN0 	= 0;  break;					// The current button is unpressed    
					case 1:		Buttons.ButtonBit.BTN1 	= 0;  break;					// Relay button pressed information to application
					case 2:		Buttons.ButtonBit.BTN2 	= 0;  break;		
					case 3:		Buttons.ButtonBit.BTN3  = 0;  break;    
					case 4:		Buttons.ButtonBit.BTN4  = 0;  break;		
					case 5:		Buttons.ButtonBit.BTN5  = 0;  break;  
					case 6:		Buttons.ButtonBit.BTN6  = 0;  break;  	   
					default:	break;
				}  
			if(RawData[Index]<=0x450)
			Average[Index] = (((Average[Index]<<4)-Average[Index])+RawData[Index])>>4;						// Get the Average 16
			}
			SaveButtonData();
		    SetNextChannel();				// Set up for next channel
		    RestartTimers();				// Restart timer1
			}
	}
	//----------------------------------------------
	void PwmOutput(void)
	{
		static unsigned char HighLevelBuff,LowLevelBuff;
		
		if((HighLevelBuff == 0)&&(LowLevelBuff == 0))
		{
			if(HighLevel == 0xFF)
			{
				PWM = 1;
				return;
			}
			if(HighLevel == 0x0)
			{
				PWM = 0;
				FLAG.Flag_BL = 0;
				return;
			}
			else 
			{
				HighLevelBuff = HighLevel;
				LowLevelBuff = LowLevel;
				PWM = 1;
				return;
			}
		}
		else
		{
			if(HighLevelBuff != 0)
			{
				HighLevelBuff--;
				return;
			}	
			else
				PWM = 0;	
		    if(LowLevelBuff != 0) 
			{
				LowLevelBuff--;
				return;
			}	
			else
				PWM = 1;
		}
	}
	//-------------------------------------------------	
	void ReceiveIR(void)
		{		
		++TimeRec;								//+1,per interrupt
		if(IR_IN==1) 							//check input pin logic level
			{
			FLAG.Flag_LowIn=1;						//pin input low
			return;
			}
	 	else if((FLAG.Flag_LowIn==1)&&(IR_IN==0))
			{									//pin come to low ,and pin input low before
			FLAG.Flag_LowIn=0;						//clr pin low signal
			if(FLAG.Flag_StartRec==0)				//a new frame?
				{								//yes
				FLAG.Flag_StartRec=1;				//indicate start to receive a new frame
				TimeRec=0;						//
				return;
				}
			else if((120<=TimeRec)&&(TimeRec<=150)&&FLAG.Flag_StartRec) 		//13.5/0.1=135 ,this is head  
				{
				asm("nop");
				TimeRec=0;						//
				p=0;							//				
				Cnt8bit=8;
				IRCode[0]=0x0;					//
				IRCode[1]=0x0;					//
				IRCode[2]=0x0;					//
				IRCode[3]=0x0;					//
				FLAG.Flag_Head =1;
				return;
				}
			else if((15<TimeRec)&&(TimeRec<=32)&&FLAG.Flag_Head)			//2.25/0.1=22
				{
                asm("nop");
				TimeRec=0;
				IRCode[p]=(IRCode[p]<<1)|0x01;
            	CheckInram();
				}
			else if((6<=TimeRec)&&(TimeRec<=16)&&FLAG.Flag_Head)			//1.12/0.1=11
				{
                asm("nop");
				TimeRec=0;
				IRCode[p]<<=1;					//shift 0 into IRcode
				CheckInram();
				}
			else
				FLAG.Flag_StartRec=0;				//error bit ,restart
				return;
		 	}
		}
void CheckInram(void)
	{
		if((--Cnt8bit)!=0) 			
			return;								//have not finished a byte ,then return
		
		else if ((++p)<=3) 						//a frame have finished?must be 2;
			{									//no
			Cnt8bit=8;
			return;
			}
		FLAG.Flag_StartRec=0;						//yes
		FLAG.Flag_Head =0;
		if((IRCode[0]==0x00)&&(IRCode[1]==0xFF)&&(IRCode[2]+IRCode[3]==0xFF))
		{			
			FLAG.Flag_RequestSend = 1;
		    IRTemp = IRCode[2];
			if(T0IF)
			{
				RestartTimers();
			}
		}
	}
void SaveButtonData(void)
	{	
		if(ButtonDataBuff1 != Buttons.ButtonByte.ButtonDataBuff)
		{
			ButtonDataBuff1 = Buttons.ButtonByte.ButtonDataBuff;
			ButtonData = ButtonDataBuff1;
		}
	}		
	void RestartTimers(void) 
	{							
		T0IF = 0;
		T0IE = 1;
		TMR0 = TMR0VALUE;
		TMR1ON 	= 0;
		TMR1L	= 0;						// reset Timer1F
		TMR1H	= 0;						//   "     "
		TMR1ON	= 1;	
	}
	
	void SetNextChannel(void) 
	{
		if(++Index>=BTN_NUM) Index=0;
		CPSCON1 = CpsChl[Index];			// Select external pin CPS0..CPS15
	}
	

⌨️ 快捷键说明

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