📄 ir1210.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 + -