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

📄 pcinterrupt.c

📁 本人用AVR mega32写的一个关于输出32路PWM的程序
💻 C
字号:
#define   EXT_PCINT2_GLOBALS
#include "includes.h" 




/************************************************************
 Function Name:  T2Init
 Function:       Timer0 initial
 Paramenter:     None               
 Return value:   None                     
 Author:         Chen yuan zhen May.30.2008 
*************************************************************/
void PCIntClose(void)
{
    EIMSK   = 0x00;
}

/************************************************************
 Function Name:  T2Init
 Function:       Timer0 initial
 Paramenter:     None               
 Return value:   None                     
 Author:         Chen yuan zhen May.30.2008 
*************************************************************/
void PCIntInitial(void)
{
    DDRE   &= ~(1<<PE2);
    EIMSK  |= (1<<PCIE0);
	PCMSK0 |= (1<<PCINT2);
}


/************************************************************
 Function Name:  T2Init
 Function:       Timer0 initial
 Paramenter:     None               
 Return value:   None                     
 Author:         Chen yuan zhen May.30.2008 
*************************************************************/
SIGNAL(PCINT0_vect)
{
	unsigned char static  PCStatus=0;
	unsigned char static  DataBitStatus=0;
	unsigned char static  DataByteStatus=0;
	unsigned char static  data=0;
	if( (PCINT_FLAG)&&(PCTimeCounter<80) )
	{
		switch(PCStatus)
		{
			case 0:
			{
				if( (PCTimeCounter>60)&&(PCTimeCounter<80)&&(IS_INFRARED_INPUT) )             //引导码;
				{
					PCStatus=1;
					PCTimeCounter=0;
				}
				else                                           //还没有开始,不计时。
				{
					if(IS_INFRARED_INPUT) 
					{
						PCTimeCounter=0;
					}
				}
				break;
			}
			case 1:
			{
				if( (!IS_INFRARED_INPUT) )   //第一个数据pulse完成
				{
				    if( (PCTimeCounter>7)&&(PCTimeCounter<11) )
					{
						PCStatus=2;
						PCTimeCounter=0;
					}
				}
				break;
			}
			case 2:
			{
				if(IS_INFRARED_INPUT)
				{
				    
					if( (PCTimeCounter>7)&&(PCTimeCounter<11) )   //第2个数据pulse完成
					{
						data  = data<<1;                           //为0
						PCStatus=1;
						PCTimeCounter=0;
						DataBitStatus++;
					}
					else
					{
						if( (PCTimeCounter>24)&&(PCTimeCounter<30) ) 
						{
							data  = data<<1;                           //为1
							data += 1;	
							PCStatus=1;	
							PCTimeCounter=0;
							DataBitStatus++;	
						}
					}

					if(DataBitStatus==8)
					{
						switch(DataByteStatus)
						{
							case 0:case 1:
							{
								if( data == 0x0f )          //用户码
								{
									DataByteStatus++;
								}
								break;
							}
							case 2:
							{
                            	PCKey=data;
								DataByteStatus++;
								break;							
							}
							case 3:
							{
								if( (PCKey+data==0xFF)&&(PCKey<=0x0a) )
								{
									//按键成功
									OCR1A   = 63;                    //0.5s
								}
								DataByteStatus=0;
								break;	
							}
						}


					}   //end of if(DataBitStatus==8)
					
					
				}    //end of if(IS_INFRARED_INPUT)
				break;
			}      //  case 2:

		}        //end of switch(PCStatus)
	}
	else
	{
	    if(IS_INFRARED_INPUT)
		{
		    data = 0;
			PCTimeCounter=0;
			T1Close( );
			OCR1A   = 7;                    //64us
			T1Start( );
			PCStatus=0;
			PCINT_FLAG=1;

			PCStatus=0;		              //标志位清0				
			DataBitStatus=0;						
			DataByteStatus=0;		
			data=0;
		}
	}
}

⌨️ 快捷键说明

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