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

📄 main_c.c

📁 pt2248芯片解码,picc8.05,pic16c57
💻 C
字号:
/*********************************************************************************************************
**				                   
**                                   
**
**                                  (c) Copyright 2005-2007, gl
**                                           All Rights Reserved
**
**                                                  V1.00.2
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: rfcode_pic.c(picc)
**创   建   人: gl
**最后修改日期: 2006年12月20日
**描        述: picc 8.05---16f57,4.0M,pt2248解码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: gl
** 版  本: V1.00.1
** 日 期: 2006年12月17日
** 描 述: 
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: gl
** 日 期: 2006年12月20日
** 描 述: 更改一些bug,在硬件验证ok.
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include	<pic.h>
#include	<pic16f5x.h>
#include	"define.h"
#define	 	NULL 0  
__CONFIG(WDTDIS & XT & UNPROTECT);
__IDLOC(dddd);

/*********************************************************************************************************
** 函数名称: init
** 功能描述: 初始化
** 输 入: 无
** 输 出: ircode:12位的码值
** 全局变量: 
** 调用模块: 
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void 	init() //端口初始化
{ 
	asm("clrwdt");
	OPTION = 0x00;              //Set WDT=1:2
	TMR0 = 0;
	TRISA = 0x02; 				//ir input
	TRISB = 0x00;
	TRISC = 0x00;
	PORTA = 0;
	PORTB = 0;
	PORTC = 0;
	flag0 = 0x00;
	millisecond = 0;
	second = 0;
	timeminute = 0;
	
}
/*********************************************************************************************************
** 函数名称: RfKeyScan
** 功能描述: 红外按键解码(pt2248),
** 输 入: 无
** 输 出: 
** 全局变量: 
** 调用模块: 
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人: gl
** 日 期: 2006年12月20日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
unsigned char IRKeyScan()
{
	unsigned char i = 0;
	if(!IR_PIN)
	{
		irsignalstartcount = 0;							//起始低电平计时,没有信号时为高电平
		irbitcount = 0;									//计接收数据的位数
//		while(!IR_PIN)									//检测起始低电平
//		{
//			irsignalstartcount++;						//起如低电平计时
//		}	
//		if(irsignalstartcount >= (_60A-3) && irsignalstartcount < (_60A+3))	//是否为起始位
				
		{												//是起始位下面开始检测数据位
			ircode = 0;
			while(++irbitcount <= 12)					//共有12位数据
			{
				asm("clrwdt");
				hightcount = 0;	
				lowcount = 0;
				while(!IR_PIN)
				{
					if(++lowcount > _3A)				//低电平计时
					{
						break;
					}
					asm("nop");

				}
				
				while(IR_PIN)
				{
					if(++hightcount > _3A)				//高电平计时
					{
						break;
					}
					asm("nop");

				}

				if(lowcount > _2A && lowcount < _4A && hightcount < _2A)
				{
					//valebit = 1;						//数据位为1
					ircode |= 0x0001;
				}
				else if(lowcount < _2A && hightcount > _2A && hightcount < _4A)
				{
					//valebit = 0;						//数据位为0
					ircode &= 0x1ffe;
				}
				ircode <<= 1;							//16位左移,低12位有效
								
				
			}

			ircode >>= 1; 								//因为上面的程序左移进多移了一位
			i = 0;
			while(ircode != ircodetable[i])
			{
				//asm("clrwdt");
				if(i >= 18)
				{
					break;
														//出错处理
					return 44;
				}
				i++;
			}

			have_count++;

			return (i);									//返回按键值
			
		}
//		else
//		{
//			return 45;									//没有检测到起始位,ir信号无效(不读)
//		}
	}
	return 44;											//是干扰	

}

/*********************************************************************************************************
** 函数名称: disp
** 功能描述: 两位数码管动态扫描显示函数,显示内容为按键值(数组下标)
** 输 入: 无
** 输 出: 无
** 全局变量: 
** 调用模块: 
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void disp()                  
{ 
	ledsec++;
	if(ledsec > 1)
	{
		ledsec = 0;	
	}	
	switch(ledsec)
	{
		case 0:
		{
			LEDIO = ledcodetable[key_word%10];//个位//
			LEDSEC1 = 1;
			LEDSEC2 = 0;
			break;
		}
		case 1:
		{
			LEDIO = ledcodetable[key_word/10];//十位//
			LEDSEC1 = 0;
			LEDSEC2 = 1;
			break;
		}
	}
}

/*********************************************************************************************************
** 函数名称: beep_cl
** 功能描述: 蜂鸣器驱动
** 输 入: 无
** 输 出: 无
** 全局变量: 
** 调用模块: 
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void	beep_cl()
{
	static volatile unsigned char	beep_delay;
	if(BEEPFLAG)
	{
		beep = 1;
		beep_delay++;
		if(beep_delay > 20)
		{
			BEEPFLAG = 0;
			beep = 0;	
			beep_delay = 0;
		}	
	}         	
}

/*********************************************************************************************************
** 函数名称: function1
** 功能描述: 功能处理,
** 输 入: 无
** 输 出: 无
** 全局变量: 
** 调用模块: 
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

void	function1() 
{
	
	
} 

/*********************************************************************************************************
** 函数名称: time
** 功能描述: 定时处理,定时时间为minute变量值
** 输 入: 无
** 输 出: 无
** 全局变量: 
** 调用模块: 
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void	time()		//定时
{
	if(++millisecond >= 500)	
	{
		millisecond = 0;
		//PORTB ^= 0X3E;				//用于测程序的运行
		if(++second >= 60)
		{
			second=0;
			if(++timeminute >= TIMEDEFINE)
			{
				POWERFLAG = 0;
				timecount = 0;
				timeminute = 0;
			}
		}
	}
}
/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主程序
** 输 入: 无
** 输 出: 无
** 全局变量: 
** 调用模块: 
**
** 作 者: gl
** 日 期: 2006年12月17日
**-------------------------------------------------------------------------------------------------------
** 修改人: gl
** 日 期: 2006年12月20日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
main()
{	
	init();
	BEEPFLAG=1;								//上电蜂鸣器鸣叫一次
    while(1)
	{
	   	asm("clrwdt");
		while(TMR0 < 250)					//500US
		{
			if(!IR_PIN)
			{

				key_word = IRKeyScan();			//得到外红键值
;
				if(ircode & 0x0100)
				{
					DATACOUNT = 6;				//continuous signal
				}
				else
				{
					DATACOUNT = 2;				//single-shot signal
				}
				if(have_count >= DATACOUNT)
				{
					have_count = 0;
					switch(key_word)
					{
						case 0:
						{
							PORTB ^= 0X02;		//第1路继电器
							break;
						}
						case 1:
						{
							PORTB ^= 0X04;		//第2路继电器
							break;
						}
						case 2:
						{
							PORTB ^= 0X08;		//第3路继电器
							break;
						}
						case 3:
						{
							PORTB ^= 0X10;		//第4路继电器
							break;
						}
						case 4:
						{
							PORTB ^= 0X20;		//第5路继电器
							break;
						}
						case 6:
						{
							PORTB = 0X00;		//关掉所有继电器
							break;
						}
						case 44:
						{
							break;				//出错处理
						}
						default:
						{
							break;
						}

					}

				}

			}

		}

		TMR0 = TMR0-250;						//可减少累计误差
//-------------------------------------------------------------------------------
		if(++programtimecount > 3)
		{
			programtimecount = 0;
		}
		switch(programtimecount)
		{
			case 0:
			{
		  	   	disp();
				break;
			}
			case 1:
			{
				beep_cl();
				break;
			}
			case 2:
			{
 	   			function1();
				break;
			}
			case 3:
			{
  	   			time();
				break;
			}
		}

	}
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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