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

📄 ir1210.c

📁 红外遥控接收程序
💻 C
字号:
/*\\file: ir1210.c
	Date.	2005.12.14	Ipman Robbin
	Desp.	红外解码,支持PT2221/HT6221。
			接收码MSB在前,LSB在后。共4个字节,前2个为用户码,后2个字节是按键码
			红外连接到PD3(INT1)上,如需修改,在ir1210.h头文件中定义
	资源占用: RAM 4byte , INT 1
  */
#include "global.h"
#include <avr/io.h>
#include <avr/signal.h>	
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <stdio.h>
#include "ir1210.h"

#if USE_IR1210
static u08 remoteId[4];					//保存解码后的数据
//初始化红外端口
void initIr1210(void)
{
	cbi(DDR_IR,IR);
	sbi(PORT_IR,IR);					//设置为带上拉输入
	MCUCR = (1<<ISC11);					//下降沿触发
	enable_external_int(_BV(INT1));		//使能外部中断
}

//_dealy_ms()函数在8M下最大约35ms,加这个函数补充延时
void delay_ms(u16 n)
{
	while(n--)
		_delay_ms(1);
}

//解码遥控器 送入接收缓冲区的指针
//返回:0=正常 1=重复
u08 decodeIR(u08 * data)
{
	u08 i,j; //i是字节,j是位
	_delay_ms(IR_DLY_REP); //延时IR_DLY_REP(11.53ms),落点在第一个可能发生脉冲的中点
	if(bit_is_set(PIN_IR,IR)) //如果为高=首次按键
	{ 
		_delay_ms(IR_FST_CENTER-IR_DLY_REP); //落点在第一个会发生脉冲前的中点(9+4.5+0.28)
		for(i=0;i<4;i++) //共4个字节
		{
			*data=0;//clear data first
			for(j=0;j<8;j++)
			{
				loop_until_bit_is_set(PIN_IR,IR);
				(*data)<<=1;
				//此处上升沿已经来到
				_delay_ms(IR_DLY_TMR); //等待1.5个周期 0.56*1.5 = 0.84
				if(bit_is_set(PIN_IR,IR))//如果为高说明当前位为1
				{
					*data |=1;
					_delay_ms(IR_DLY_TMR2);//延时到下一个低电平的中点
				}
			}
			data++;
		}
		_delay_ms(IR_DLY_END1);
	}else{//重复按键
		delay_ms(IR_DLY_END2);
		return 1;
	}
	return 0;
}

//处理遥控器
SIGNAL(SIG_INTERRUPT1) //SIGNAL关闭全局中断,处理遥控器,此处不建议用INTERRUPT
{
	u08 ret;
	ret=decodeIR(remoteId);
	if(ret)
	{
		;//执行相应遥控动作
	}else{
		;//重复动作或不处理
	}
	sbi(GIFR,INTF1);//important! clear INTF1 just forbbiden int again
}

#ifdef IR_DEBUG
//仅供调试用
void printIrCode(void)
{
	//发送到串口
	u08 i;
	printf("remote id=");
	for(i=0;i<4;i++)
		printf("%X ",remoteId[i]);
	printf("\n");
}
#endif

#endif

⌨️ 快捷键说明

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