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

📄 yaokong.c

📁 用PIC16F716开发的一遥控程序源码
💻 C
字号:
 
/*------------------------------------------------
     遥控器程序

 ;CLK---4M 
 ;RB3为红外发射口,  RB0,RB1,RB2,RA2为KEY输出
 ;P6.4-7为KEY输入(上拉),允许电平变化中断,
 ;红外发射采用TC 38K==T(26,3US)的定时中断,每个BIT发422USx4
 ;
 ;    |--------|422 |      |----|422X3   |
 ;1== | 422x3  |----| ; 0==|422 |--------|
 ;
 ;KEY==01----C1H;  02----C2H; ------- 13----CdH
 
 ;发射时KEY前面加00000;
 ;每个数据发2次,间隔38MS
 
; 红外发射采用CPP1(RB3),
; 睡眠唤醒用RB4-RB7中断,
;---------------------------------------------------------- */ 
 #include <pic16f716.h>
 
// #include <pic16f62xa.h>
#include <stdio.h>
#include <pic.h>
 
#include "yaokong.h"

typedef unsigned char uchar;
typedef unsigned int uint;
//****************************************************
 
uchar key_temp;
uchar key_vol[16]={0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCa,0xCb,0xCc,0xCd,0xce,0xcf,0xd0};
unsigned char  j;//通用寄存器 
 
#define Nop()		asm("nop")

void band_Init(void);
void Delayus(uint us);
void Delayus_422(void);
void key_test(void); 
void rd_tx_L (void); 
void rd_tx_H (void); 
 
void rd_tx(void);
//-------------------------------------------------------------
 void main()
 {
  
   Nop();
   Nop(); 
 
 for(FSR=0x20;FSR<0x7F;FSR++)
    {                        //clear ram 0X20-FF
      asm("clrf indf"); 
    } 
  
   // CMCON=0x07;       //i/o
   ADCON1=0x0f;    // 数字I/O口  
   ADCON0=0x00;    // 数字I/O口 
   INTCON=0;        //CLOSE ALL INTERRUPT   

   band_Init();
 
   LED=0;
   Delayus(10); 
   LED=1;
   Delayus(10);  //test
 
   LED=1;
   RBIE=1;     //ALLOW RB INTERRPUT
//-------------------------------------
 while(1)
  {    
      key_test();        //按键检测
     // CMCON=0x07;       // 数字I/O口   PIC16F628a   
      ADCON1=0x0f;    // 数字I/O口  
      ADCON0=0x00;    // 数字I/O口 
      INTCON=0;        //CLOSE ALL INTERRUPT      
      RBIE=1;     //ALLOW RB INTERRPUT

   //  睡眠设置;
    
      band_Init(); 
      SLEEP();
      NOP();
      NOP();
      band_Init();
    
   }
 }
 
//-------------------------------------------------------------- 
void key_test(void)
 { 
  
   Nop();
   KEY5=KEY6=KEY7=KEY8=0;
 
  if((KEY1==0)|(KEY2==0)|(KEY3==0)|(KEY4==0))
   {
   Delayus(1);
   if((KEY1==0)|(KEY2==0)|(KEY3==0)|(KEY4==0))
    { 
     
     KEY6=KEY5=KEY8=1;
     KEY7=0;    
    if((KEY1==0)|(KEY2==0)|(KEY3==0)|(KEY4==0))
     {
      if(KEY1==0)
      {key_temp=key_vol[3];}
      else if(KEY2==0)
      {key_temp=key_vol[2];}
      else if(KEY3==0)
      {key_temp=key_vol[1];}
      else if(KEY4==0)
      {key_temp=key_vol[0];}  
      goto key_over; 
    }
    
     KEY5=KEY7=KEY8=1;
     KEY6=0;
   if((KEY1==0)|(KEY2==0)|(KEY3==0)|(KEY4==0))
     {
      if(KEY1==0)
      {key_temp=key_vol[7];}
      else if(KEY2==0)
      {key_temp=key_vol[6];}
      else if(KEY3==0)
      {key_temp=key_vol[5];}
      else if(KEY4==0)
      {key_temp=key_vol[4];}  
      goto key_over; 
     }
     KEY7=KEY6=KEY8=1;
     KEY5=0;
    if((KEY1==0)|(KEY2==0)|(KEY3==0)|(KEY4==0))
     {
      if(KEY1==0)
      {key_temp=key_vol[11];}
      else if(KEY2==0)
      {key_temp=key_vol[10];}
      else if(KEY3==0)
      {key_temp=key_vol[9];}
      else if(KEY4==0)
      {key_temp=key_vol[8];}  
       goto key_over; 
     }
     KEY5=KEY6=KEY7=1;
     KEY8=0;
   if((KEY1==0)|(KEY2==0)|(KEY3==0)|(KEY4==0))
     {
      if(KEY1==0)
      {key_temp=key_vol[15];}
      else if(KEY2==0)
      {key_temp=key_vol[14];}
      else if(KEY3==0)
      {key_temp=key_vol[13];}
      else if(KEY4==0)
      {key_temp=key_vol[12];}  
       goto key_over; 
     }
   
 
key_over: 
  
    rd_tx();
    Delayus(3);       //14x3MS
    rd_tx();

    KEY5=KEY6=KEY7=KEY8=0;
    while(!(KEY1&KEY2&KEY3&KEY4))
    { REMOTE=0;  }
     Delayus(1);
    while(!(KEY1&KEY2&KEY3&KEY4))
    { REMOTE=0;  }
    }
   }
 
 }
//--------------------------------------------------------------
void band_Init(void)
   {
    
     KEY1_IN();     
     KEY2_IN();      
     KEY3_IN();   
     KEY4_IN();  
     KEY5_OUT();     
     KEY6_OUT();      
     KEY7_OUT();   
     KEY8_OUT();  
     REMOTE_OUT();
     LED_OUT();     
   
     LED=1;
     KEY5=0;
     KEY6=0;
     KEY7=0;
     KEY8=0;
     REMOTE=0; 

   }
/*---------------------------------------------------------------------
 红外发射

---------------------------------------------------------------------*/
void rd_tx(void)
 {
  unsigned char n;
  unsigned char key_bak;
   LED=0; 
 
  TMR2=0;
  T2CON=0;               // 
  TMR2IE=0;    //NOT ALLOW TMR2 INTERRPUT
  REMOTE_OUT(); 
  REMOTE=0;
  PR2=0X19;              //38K
  CCPR1L=0X0c;           //1/2
  CCP1CON=0X30;          //CLOSE CCP1
 
   rd_tx_L(); 
   rd_tx_L(); 
   rd_tx_L(); 
   rd_tx_L();   
   rd_tx_L();   //TX 00000H
   key_bak= key_temp;
 for(n=0;n<8;n++)
    {
     if((key_bak&0x80)==0x80) 
       {rd_tx_H();} 
     else
       {rd_tx_L();}
     key_bak= key_bak<<1; 
            
     }
    LED=1;
  }

//------------------------------------------
void rd_tx_L (void) 
 {
   
   CCP1CON=0x3c;         //ccp1==pwm ,open ccp1
   TMR2ON=1;           //TRM1 START 
   Delayus_422();  
   TMR2ON=0;    //TRM1 stop
   CCP1CON=0X30;          //CLOSE CCP1
   REMOTE=0; 
   
   Delayus_422(); 
   Delayus_422(); 
   Delayus_422(); 
  // REMOTE=0; 
 }
//-------------------------------------------------------
void rd_tx_H (void) 
 {
   CCP1CON=0x3c;         //ccp1==pwm ,open
   TMR2ON=1;   //TRM1 START 
   Delayus_422();
   Delayus_422();
   Delayus_422(); 
   TMR2ON=0;
   CCP1CON=0X30;          //CLOSE CCP1
   REMOTE=0;   
   Delayus_422();  
 //  REMOTE=0;
 } 
//-------------------------------------------------------- 
void Delayus(uint us)  //14MS
 {
    uint us_reg;
    while(us--)
    {
     us_reg=1000;

      while(us_reg--)
      {Nop();}
    }
  }
 //--------------------------------------------------------

void Delayus_422(void)  //422us
  {   
     uint us_422;
     Nop();
     Nop(); 
     Nop();
     Nop(); 
     Nop(); 
     Nop(); 
     Nop();  
      us_422=33;
      while(us_422--)
      {Nop();}
    
  }


⌨️ 快捷键说明

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