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