?? 紅外遙控.c
字號:
}
}
void ir_exit(void) //紅外接收恢復程序,恢復到紅外接收前的狀態
{
TR2=0; //停止計數以便修改計數器2寄存器
TR0=0;
ET2=0; //禁止計數器2中斷
TL2=0xfb; //重新設置波特率為115.2kbps
TH2=0xff;
RCAP2H=0xff;
RCAP2L=0xfb;
T2CON=0x34;
ES=1; //允許串行中斷
EA=1; //開放全局中斷
}
void ir_jiema(void){ //解碼程序,放在ir_code中,高十六位表示接收頻率
//如果解碼失敗則為,如果是重復碼則為1
//低八位表示載波頻率,以KHz為單位
//低十六位的高八位表示系統碼,低八位為按鍵碼
p.p2[0]=IR;
p.p2[1]=p.p2[0]+1;
i.b[0]=*p.p2[0];
i.b[1]=*p.p2[1];
for(;i.b[1]!=0;){
if(i.b[0]>i.b[1]){
i.b[0]=0xffff-i.b[0];
i.b[0]+=i.b[1];
i.b[0]++;
}
else{
i.b[0]=i.b[1]-i.b[0];
}
*p.p2[0]=i.b[0];
p.p2[0]++;
i.b[0]=*p.p2[0];
p.p2[1]++;
i.b[1]=*p.p2[1];
}
*p.p2[0]=0;
p.p2[0]=IR;
temp.b=*p.p2[0];
ir_code.c=count.b;
ir_code.b[0]=(ir_code.c*1536000)/temp.b;
for(;temp.b!=0;){
*p.p2[0]=temp.b/154;
p.p2[0]++;
temp.b=*p.p2[0];
}
ir_code.b[1]=0;
if(p.p2[0]==IR+132){
p.p2[0]=IR;
p.p2[0]+=3;
i.c=0;
temp.b=*p.p2[0];
for(;temp.b!=0;){
i.c<<=1;
if(temp.b>=11){
i.a[3]++;
}
p.p2[0]+=2;
temp.b=*p.p2[0];
}
if(i.a[0]==(~i.a[1])&&i.a[2]==(~i.a[3])){
ir_code.a[2]=i.a[0];
ir_code.a[3]=i.a[2];
}
else ir_code.b[0]=0;
}
else{
if(p.p2[0]==IR+4){
p.p2[0]=IR;
p.p2[0]++;
temp.b=*p.p2[0];
if(temp.b<=30){
ir_code.b[0]=1;
}
else ir_code.b[0]=0;
}
else ir_code.b[0]=2;
}
//if(ir_flag==2)ir_code.b[0]=3;
}
void read_ir(void){
buf1_flag=0;
REN=1;
buf2_length=4;
while(buf2_flag);
ir_init();
while(!ir_flag);
ir_exit();
ir_jiema();
buf2=SEND;
*buf2++=ir_code.a[0];
*buf2++=ir_code.a[1];
*buf2++=ir_code.a[2];
*buf2=ir_code.a[3];
buf2=SEND;
buf2_flag=1;
SBUF=HEAD;
}
void delay(void){}
void start_iic(void){
SCL=0;
SDA=1;
delay();
delay();
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
delay();
}
void stop_iic(void){
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
SCL=0;
delay();
delay();
SCL=1;
delay();
}
void send_ack_iic(void){
SDA=0;
delay();
SCL=1;
delay();
delay();
SCL=0;
delay();
}
void send_nack_iic(void){
SDA=1;
delay();
SCL=1;
delay();
delay();
SCL=0;
delay();
}
bit receive_ack_iic(void){
bit a;
SDA=1;
delay();
SCL=1;
delay();
if(SDA) a=1;
else a=0;
delay();
SCL=0;
delay();
return a;
}
unsigned char read_byte_ack_iic(void){
unsigned char a;
SDA=1;
for(p.a[0]=0;p.a[0]<8;p.a[0]++){
a<<=1;
delay();
SCL=1;
delay();
if(SDA) a++;
delay();
SCL=0;
delay();
}
send_ack_iic();
return a;
}
unsigned char read_byte_nack_iic(void){
unsigned char a;
SDA=1;
for(p.a[0]=0;p.a[0]<8;p.a[0]++){
a<<=1;
delay();
SCL=1;
delay();
if(SDA) a++;
delay();
SCL=0;
delay();
}
send_nack_iic();
return a;
}
void reset_iic(void){
SDA=1;
for(p.a[0]=0;p.a[0]<10;p.a[0]++){
SCL=0;
delay();
delay();
SCL=1;
delay();
delay();
}
}
bit write_byte_iic(unsigned char a){
for(p.a[0]=0;p.a[0]<8;p.a[0]++){
if(a&0x80){
SDA=1;
}
else{
SDA=0;
}
delay();
SCL=1;
delay();
delay();
SCL=0;
delay();
a<<=1;
}
return receive_ack_iic();
}
unsigned int read_key_data(unsigned char a){
union{
unsigned char a[2];
unsigned int b;
}key_data;
reset_iic();
start_iic();
write_byte_iic(0xa0);
write_byte_iic(a);
start_iic();
write_byte_iic(0xa1);
key_data.a[0]=read_byte_ack_iic();
key_data.a[1]=read_byte_nack_iic();
stop_iic();
return key_data.b;
}
void write_key_data(unsigned char a){
reset_iic();
start_iic();
write_byte_iic(0xa0);
write_byte_iic(a);
write_byte_iic(ir_code.a[2]);
write_byte_iic(ir_code.a[3]);
stop_iic();
}
void store_ir(void){
buf1_flag=0;
REN=1;
buf1=RECEIVE+1;
*buf1=(*buf1)<<1;
write_key_data(*buf1);
}
unsigned char yima(void){
unsigned char a;
for(a=0;a<100;){
if(ir_code.b[1]==read_key_data(a)){
break;
}
a++;
a++;
}
a>>=1;
return a;
}
void read_key(){
unsigned char a;
buf1_flag=0;
REN=1;
ir_init();
while(!ir_flag);
ir_exit();
ir_jiema();
buf2=SEND;
a=yima();
if(a==50){
*buf2=0xff;
}
else *buf2=a;
buf2_length=1;
buf2_flag=1;
SBUF=HEAD;
}
main(){
unsigned char ctr;
delay1s();
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
ctr=0;
buf1=RECEIVE;
buf2=SEND;
buf1_length=0;
buf2_length=0;
buf1_flag=0;
buf2_flag=0;
state1=0;
state2=0;
SP=0xe0; //將堆棧指針指向高端
TL2=0xfb;
TH2=0xff; //溢出值為5,波特率為115.2Kbps;
RCAP2H=0xff;
RCAP2L=0xfb;
SCON=0x50; //方式1,8位方式,SM0=0,SM1=1,SM2=0,REN=1允許接收
IE=0x10; //串行中斷允許,全局中斷不允許
T2CON=0x34; //RCLK=1,TCLK=1,TR2=1 啟動計數器
EA=1; //開放全局中斷
free();
while(1){
//ir_init();
//while(!ir_flag);
//ir_exit();
//ir_jiema();
//if(yima()==0) P1_0=1;
//if(yima()==1) P1_0=0;
if(buf1_flag){
buf1=RECEIVE;
ctr=*buf1;
switch(ctr){
case ACK: ack();
break;
case NACK: nack();
break;
case FREE: free();
break;
case BUSY: busy();
break;
case DOWNLOAD: download();
break;
case UPLOAD: upload();
break;
case RUN: run();
break;
case READ_IR: read_ir();
break;
case READ_KEY: read_key();
break;
case STORE_IR: store_ir();
break;
default: buf1_flag=0;
REN=1;
break;
}
}
}
}
void sub(void){
}
void ie_0(void){
}
void tf_0(void){
}
void ie_1(void){
}
void tf_1(void){
}
void tf_2(void){
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -