?? main.c
字號:
#include "ir_type.h"
#include "24C02.h"
static unsigned char flag=0; //定義38K載波使能位
static unsigned char data DT,DC=0x00; //定義接收紅外數(shù)據(jù)計數(shù)器
static unsigned char rdarray[80];
//延時函數(shù)
void Delay9ms();
void Delay4_5ms();
void Delay560us();
//void Delay3(unsigned char a);
void Delay400us();
//***定義遙控輸出控制函數(shù)×××//
void SEND_IR_GUIDE();
void SEND_IR_1();
void SEND_IR_0();
void SEND_One_Byte(char thedata);
//主函數(shù)
void main()
{
unsigned char h=0,l,k,y;
//unsigned char uk;
//unsigned char rdarray[80];
//extern void Read_N_Bytes(char *buffer,char n,char addr);
IP= 0x01;
TMOD = 0x02;
TH0=0xF3;
ET0=1;
//TR0=1;//定時器0方式2,產(chǎn)生38KHz調(diào)制信號
EA = 1; //允許CPU中斷
IT0 = 1; //INT0下降沿有效
EX0 = 1; //開INT0中斷
// P1=0xff;
//printf("\nDC=%d",DC);
Dout = 0;
LED=DC;
Led=0;
while(1)
{
if(K4 == 0)//判斷K5是否被按下
{
Delay2(500);//延時消抖
if(K4 == 0)
{
EX0=0;
//Write_One_Byte(DC,0x0A);//往2402的0X04地址寫如數(shù)值0X07
}
}
if(K5 == 0)
{
Delay2(500);
if(K5 == 0)
{
EX0=1;
flag = Read_One_Byte(DC);//將讀出來的數(shù)值給tmp
//P0 = seg_tab[tmp];
LED=flag;
//Delay2(50000);
}
}
if(K3 == 0)//判斷K3是否被按下
{Delay9ms();//延時10MS
if(K3 == 0)//再次確定K3是否被按下
{
if(DC>0)
{
DC++;
Write_One_Byte(0xF2,DC);
for(y=0;y<DC;y++)Write_One_Byte(y,rdarray[y]);
}
else
{
DC=Read_One_Byte(0xF2);
for(y=0;y<DC;y++)rdarray[y] = Read_One_Byte(y);
}
LED=DC;
for(l=500;l>0;l--)Delay9ms();
LED=rdarray[2];
}
}
//發(fā)送數(shù)據(jù)
if(K2 == 0)//判斷K2是否被按下
{
Delay9ms();//延時10MS
if(K2 == 0)//再次確定K2是否被按下
{
for(k=2;k<DC;k++)
{
SEND_IR_GUIDE();
SEND_One_Byte(rdarray[0]);
SEND_One_Byte(rdarray[1]);
SEND_One_Byte(rdarray[k]);
DT=~rdarray[k];
SEND_One_Byte(DT);
SEND_IR_1(); //Stop Bit
Led=~Led;
for(l=40;l>0;l--)Delay9ms();
}
}
}
}
}
/*******************數(shù)據(jù)位定義*************************/
void SEND_IR_GUIDE()
{
unsigned char i,j;
TR0=1;
for (j=25;j>0;j--)
for (i=83;i>0;i--);
TR0=0;
Dout = 0;
for (j=25;j>0;j--)
for (i=90;i>0;i--);
}
void SEND_IR_1()
{unsigned char i,j; //總的延時時間=[(2*i)+1]*j+1+1
TR0=1;
for (j=1;j>0;j--)
for (i=119;i>0;i--);
TR0=0;
Dout = 0;
for (j=6;j>0;j--)
for (i=138;i>0;i--);
}
void SEND_IR_0()
{
unsigned char i,j; //總的延時時間=[(2*i)+1]*j+1+1
TR0=1;
for (j=1;j>0;j--)
for (i=119;i>0;i--);
TR0=0;
Dout = 0;
for (j=2;j>0;j--)
for (i=138;i>0;i--);
}
void SEND_One_Byte(char thedata)
{
unsigned char i;
for(i=0;i<8;i++)
{if((thedata>>i)&0x01)
SEND_IR_1();
else
SEND_IR_0();
}
}
/*********************延時函數(shù)******************
void Delay560us() //晶振=12MHz 延時時間=560us-4us
{
unsigned char i,j; //總的延時時間=[(2*i)+1]*j+1+1
for (j=2;j>0;j--)
for (i=123;i>0;i--);
}
void Delay4_5ms() //晶振=12MHz 延時時間4.5ms
{
unsigned char i,j ;
for (j=25;j>0;j--)
for (i=90;i>0;i--);
} *************/
void Delay9ms() //晶振=12MHz 延時時間9ms
{
unsigned char i,j;
for (j=50;j>0;j--)
for (i=90;i>0;i--);
}
/***************延時時間=404us*************************/
void Delay400us() //晶振=12MHz
{ //晶振=11.0592MHz 延時時間≈438us
unsigned char i,j; //總的延時時間=[(2*i)+1]*j+1+1
for (j=2;j>0;j--)
for (i=100;i>0;i--);
}
/*********38KHz載波***********/
void timeint( ) interrupt 1 using 2
{Dout=~Dout;}
/**********************************************************
*外中斷0 遙控解碼函數(shù)(子程序)
**********************************************************/
void IR() interrupt 0 using 3 //選擇工作寄存器組
{
//DC++;
if(RD==1)
{
unsigned char i,k,l;
unsigned char KeyCoding[4]; //定義數(shù)組,存放接收到的數(shù)據(jù)
EA = 0; //關(guān)外中斷0
if (P3_2==0) //P3.2低電平繼續(xù)
{
for (i=20;i>0;i--) //循環(huán)檢測20次,低電平引導信號干擾檢測(9ms)
{
Delay400us(); //延時438us
if (P3_2==1) //低電平引導信號出現(xiàn)高電平就跳出
{
EA = 1; //開外中斷
return;
}
}
while(P3_2==0); //等待高電平引導信號到了.
for (i=10;i>0;i--) //循環(huán)檢測10次,高電平引導信號干擾檢測(4.5ms)
{
Delay400us();
if (P3_2==0) //高電平引導信號出現(xiàn)低電平就跳出
{
EA = 1; //開外中斷
return;
}
}
while(P3_2==1); //等待高電平引導信號結(jié)束.
//接收4個字節(jié)的數(shù)據(jù)
for (k=0;k<4;k++)
{
for (i=8;i>0;i--) //8位數(shù)據(jù)
{
while(P3_2==0); //等待第一個地址碼的高電平到了.(保證判斷每位數(shù)據(jù)的起點一致)
Delay400us();
Delay400us(); //延時0.876ms去判斷P3.2的狀態(tài)(0.56ms<延時時間<1.125ms)
KeyCoding[k]>>= 1; //右移1位
if(P3_2==1) //仍是1,最高位寫入1,0跳過
KeyCoding[k]|= 0x80;
while(P3_2==1); //等待高電平結(jié)束
}
}
//比較地址碼和地址反碼,不同解碼錯誤退出
if (KeyCoding[0]!=~KeyCoding[1]||KeyCoding[2]!=~KeyCoding[3])
{
EA = 1; //開外中斷
return;
}
DC++;
if(DC==1)
{
rdarray[0]= KeyCoding[0];
rdarray[1]= KeyCoding[1];
rdarray[2]= KeyCoding[2];
DC++;
}
else rdarray[DC]= KeyCoding[2];
Led=~Led;
for(l=150;l>0;l--)Delay9ms();
LED=KeyCoding[2];
for(l=150;l>0;l--)Delay9ms();
/*
switch (KeyCoding[2])
{//按鍵判斷
case 0x14:
LED=0xfe;
DT = 1;//確定鍵
//這里添加代碼
break;
case 0x11: //向上鍵
LED=0xfb;
DT = 1;
//這里添加代碼
break;
case 0x09: //向下鍵
LED=0xef;
DT = 1;
//這里添加代碼
break;
case 0x1b: //向左鍵
LED=0xdf;
DT = 1;
//這里添加代碼
break;
case 0x12: //向右鍵
LED=0xfa;
DT = 1;
//這里添加代碼
break;
case 0x07: //系統(tǒng)設(shè)定鍵
LED=0x00;
DT = 1;
//這里添加代碼
break;
case 0x18:
LED=0xff;
DT=1;
break;
}*/
}
}
else
{
EA = 1; //開外中斷
return;
}
EA = 1;
}
/***************************
void Delay3(unsigned char a)//按鍵延時函數(shù)
{
unsigned char k;
for(k=0;k<125;k++)
while(a) a--;
}
******************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -