?? hongwai.c
字號:
//此程序用來顯示紅外遙控的鍵碼值 包括8位系統識別碼及其反碼 8位數據碼及其反碼
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar TH0_BUF=0; //定義定時器時間緩沖
uchar TL0_BUF=0;
uchar INT0_TIMES=0; //定義中斷次數
uchar RCV_NUM=0; //接收的數據是第幾位
uint RH_CODE=0; //定義接收碼高位
uint RL_CODE=0; //定義接收碼低位
bit START_FLAG=0; //定義接收數據開始標志位
bit RCV_BIT_FLAG=0; //定義位接收標志位 1 表示接收成功
bit RCV_SUS_FLAG=0; //定義字接收標志位 1 表示接收成功
char code disp[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0x30,0x25,0x67,0x23,0x64,0x74};
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
//char code disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x8e,0xff,0x00};
// 0 1 2 3 4 5 6 7 8 9 - f 空 顯
char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0; //顯示緩沖 其中i0為虛擬位
delay(uint t)
{ char a;
while(t--)
for(a=100;a>0;a--); }
void initial(void)
{ TMOD=0x01;
IT0=1; //外部中斷0采用高到低的跳變有效
IE=0x81; //開外部中斷0
TH0=0;
TL0=0;
TR0=0;
START_FLAG=0;
TH0_BUF=0; //定義定時器時間緩沖
TL0_BUF=0;
INT0_TIMES=0; //定義中斷次數
RCV_NUM=0; //接收的數據是第幾位
RH_CODE=0; //定義接收碼高位
RL_CODE=0; //定義接收碼低位
START_FLAG=0; //定義接收數據開始標志位
RCV_BIT_FLAG=0; //定義位接收標志位 1 表示接收成功
RCV_SUS_FLAG=0; //定義字接收標志位 1 表示接收成功
}
display(t)
{while(t--)
{P0=disp[i8];
P2=0x7f;
delay(1);
P2=0xff;
P0=disp[i7];
P2=0xbf;
delay(1);
P2=0xff;
P0=disp[i6];
P2=0xdf;
delay(1);
P2=0xff;
P0=disp[i5];
P2=0xef;
delay(1);
P2=0xff;
P0=disp[i4];
P2=0xf7;
delay(1);
P2=0xff;
P0=disp[i3];
P2=0xfb;
delay(1);
P2=0xff;
P0=disp[i2];
P2=0xfd;
delay(1);
P2=0xff;
P0=disp[i1];
P2=0xfe;
delay(1);
P2=0xff;} }
void RCV_SUS(void)
{
i8=RH_CODE/4096%16;i7=RH_CODE/256%16;i6=RH_CODE/16%16;i5=RH_CODE%16;
i4=RL_CODE/4096%16;i3=RL_CODE/256%16;i2=RL_CODE/16%16;i1=RL_CODE%16;
initial();
}
void RCV_BIT(void)
{ uint time0=TH0_BUF*256+TL0_BUF;
uint KEY_BIT; //當前的鍵值 為0或1
if(START_FLAG==0)
{ if( time0>12000 && time0<15000 )
{ START_FLAG=1; } //開始
}
else if(START_FLAG==1)
{
if( time0> 2000 && time0<2400 ) KEY_BIT=0x8000;
else if( time0> 900 && time0<1300 ) KEY_BIT=0;
else KEY_BIT=0;
if(RCV_NUM<16)
{ RH_CODE=RH_CODE>>1;
RH_CODE^=KEY_BIT; }
else
{ RL_CODE=RL_CODE>>1;
RL_CODE^=KEY_BIT; }
RCV_NUM++;
if(RCV_NUM==32)
{ RCV_NUM=0; RCV_SUS(); }
}
RCV_BIT_FLAG=0; }
main()
{ display(60);
delay(400);
initial();
while(1)
{
display(1); }
}
void ex_input(void) interrupt 0 //外部中斷
{
INT0_TIMES++;
if(TR0==0) TR0=1;
else if(TR0==1)
{ TH0_BUF=TH0;
TL0_BUF=TL0;
TH0=0;
TL0=0;
//RCV_BIT_FLAG=1; //置標志位
TR0=1; //開始下一個脈沖的檢測
RCV_BIT();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -