控制工程师论坛

教程与手册

红外线遥控读码机

xilinxue
xilinxue

2008-09-17

/*;红外线遥控读码机,用本实例配合本站套件可读出任何6121或6122(CD6121/CD6122/SC6121/SC6122)及其兼容芯片的红外线遥控器的用户码、键码。
;本例是一个红外线遥控接收解码程序,程序中数码管显示用的是定时器中断法的动态扫描
;动态显示二位数码管的方法,中断法,我们以3MS中断一次从而交换两位数码管轮流点亮。
;对准实验板红外线接收头轻按要测定的遥控器的待测按键一次,此时实验板的中间两位数码管将显示该键的键码,
;(显示为16进制的),轻触实验板的S10此时显示器切换为显示当前遥控器用户码的低8位, 轻触实验板的S11此时显示器切换为显示当前遥控器用户码的高8位,
;轻触实验板的S9此时显示再一次回到显示当前键的键码.
;注意:所有的显示均为16进制,'A'显示为'A','B'显示为'b','C'显示为'c','D'显示为'd','E'显示为'E','F'显示为'F'.
;注意6121的遥控器发射码依次为:同步头(引导码)+32位数据码(用户码低8位+用户码高8位+键码+键码的反码)
;引导码是由9MS的高电平加4.5MS的低电平构成,我们接收到的刚好反相为9MS的低电平加4.5MS的高电平.
;数据码'0'是由560US的高电平加560US的低电平构成,接收时反相为560US的低电平加560US的高电平构成.
;数据码'1'是由560US的高电平加1.69MS的高电平构成,接收时反相为560US的低电平加1.69MS的高电平构成.
*/#include<pic.h>
 
#define uchar  unsigned char
#define uint   unsigned int
//#define ulong unsigned long

//__CONFIG(XT&UNPROTECT&PWRTEN&BORDIS&WDTEN);

#define bitset(var,bitno)((var)|=1<<(bitno))
#define bitclr(var,bitno)((var)&=~(1<<(bitno)))
union {
      struct {
         unsigned b0:1;
         unsigned b1:1;
         unsigned b2:1;
         unsigned b3:1;
         unsigned b4:1;
         unsigned b5:1;
         unsigned b6:1;
         unsigned b7:1;
         }oneBit;
        unsigned char allBits;
       } myFlag;
#define CNT2_1  myFlag.oneBit.b1
#define CNT2_2  myFlag.oneBit.b2 
#define CNT2_3  myFlag.oneBit.b3 
#define CNT2   myFlag .allBits
 
static bit FLAGS ;
static bit Bitin;
 
//  bit FLAGS3 ; 
       
union  Csr
     { unsigned  long i;
         unsigned  char  Csra[4];
     }myCsra;

#define  RMT   RA1       // ;遥控接收输入脚位地址(RA。1)
#define  BITIN  7        //遥控接收数据位位标志
uchar  CNT0, CNT3,CNT4; //用户临时寄存器1--4
uint   CNT1;
uchar  TABADD;         //数码管显示码取码用寄存器
//uchar  FLAGS;       //显示位选标志位
uchar  DISPBUF_H;     //显示器高位
uchar  DISPBUF_L;     //显示器低位
uchar  CSR0;          //;遥控键码反码寄存器
uchar  CSR1;          //;遥控器键码寄存器
uchar  CSR2;          //;遥控器用户码高8位寄存器
uchar  CSR3;          //;遥控器用户码低8位寄存器
uchar  FLAGS2;        //;临时寄存器
//uchar  CSR0A ;      //;遥控接收32位数据暂存寄存器
//uchar  CSR1A ;      //;遥控接收32位数据暂存寄存器
uchar  CSR2A ;        //遥控接收32位数据暂存寄存器
//uchar  CSR3A ;      //遥控接收32位数据暂存寄存器
 
const uchar table[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0a7,0x0a1,0x86,0x8e,};//0x00
                    // 0,     1,    2,   3,    4,   5,    6,   7,   8,   9,   a,   b,    c,   d,    e,    f,

//------------------中断-------------------------
void  interrupt TMR0SERV()
 {
   PORTC =0x0ff;//  先熄灭所有数码管以免闪烁
   RA4=1;
   RA5=1;
   RA0=1;
   RA2=1;
   RA3=1;
  if( FLAGS)
       {PORTC=table[ DISPBUF_L];RA2=0;} //;送RC口显示,位选通
  else {PORTC=table[ DISPBUF_H];RA3=0;}
    FLAGS= !FLAGS;
     TMR0=155;  //送定时器初值
     T0IF =0;   //清定时器0溢出中断标志位
}

回帖

评论3

总共 , 当前 /
首页 | 登录 | 注册 | 返回顶部↑
手机版 | 电脑版
版权所有 Copyright(C) 2016 CE China