- 积分
- 1072
- 在线时间
- 2823 小时
- 最后登录
- 2025-7-3
- 阅读权限
- 70
- 精华
- 0
 
- UID
- 6252
- 帖子
- 1057
- 精华
- 0
- 经验
- 1072 点
- 金钱
- 566 ¥
- 注册时间
- 2005-11-9
|
网上找了一些都感觉不怎么好用,写了个比较短小精悍的,测试遥控器就是那些CDM3,4那些转盘用的遥控器:
//rc5.h
#ifndef __RC5_H_
#define __RC5_H_
#ifdef __RC5SRC__
/*
remote control ic:M34280MK-345FP
d d d ddddd dddddd
d=889*2
bit0:1_0
bit1:0_1
X-12.00000M
*/
unsigned int currentRecvkey;
unsigned char ir_int_pos;
bit NextBitVal;
bit IR_NewKey;
unsigned int IR_KeyVal;
unsigned char IR_Temp;
void IrInit();
#else
extern bit IR_NewKey;
extern unsigned int IR_KeyVal;
extern void IrInit();
#endif
#endif
//RC5.c
#include <AT89X52.h>
#include <intrins.h>
#define __RC5SRC__
#include <rc5.h>
//----------------------------------------------------------
void IrInit()
{
TMOD=0x11;//实际只用到timer0(16位定时器由应用程序控制)
TR0=0;ET0=0;TH0=0xfc;TL0=0x91;
//这里产生一个889us的中断,减掉外中断跳转需要的11us[65534-889+11]
EX0=1;
EA=1;
}
//----------------------------------------------------------
void timer0() interrupt 1
{
TL0=0x2e;TH0=0xf9;
//这里产生一个1778us的中断,减掉定时中断跳转需要的33us[65534-1778+33]
currentRecvkey=currentRecvkey<<1;
if(NextBitVal)
currentRecvkey++;
ir_int_pos++;
if(ir_int_pos>13){
currentRecvkey=currentRecvkey&0X1FFF;
if(currentRecvkey>0){
IR_KeyVal=currentRecvkey;
IR_NewKey=1;
}
IrInit();
}
else
NextBitVal=P3_2;
}
//----------------------------------------------------------
void exint0() interrupt 0 //下降边沿触发
{
TR0=1;ET0=1; //启动T0
EX0=0; //关闭EX0
ir_int_pos=0;
NextBitVal=1;
currentRecvkey=0;
IR_Temp=0;
//jitter
while(P3_2==0&&IR_Temp<16){
IR_Temp++;
}
if(IR_Temp<15){
IrInit();
}
}
//--------------------------------------------------------
IR_NewKey=1时候说明有新的按键收到了,数据在IR_KeyVal |
|