?? 紅外遙控編碼數管顯示.c
字號:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define DATA P0 //數據端口定
sbit d0=P2^0;
sbit d1=P2^1;
//sbit d2=P2^2;
sbit d17=P1^7;
sbit IR_RE=P3^2;
void display();
//two_2_bcd(uchar date);
int a=0;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,
0x83,0xc6,0xa1,0x86,0x8e};
/*----------------------------------------------------------*/
bit k=0; //紅外解碼判斷標志位,為0則為有效信號,為1則為無效
uchar n=0; //用來控制外部中斷
uchar data date[4]; //date數組為存放地址原碼,反碼,數據原碼,反碼
delay(int z)
{
int s,t;
for(s=z;s>0;s--)
for(t=10;t>0;t--);
}
/*--------------------------延時1ms程子程序-----------------------*/
delay1000()
{
uint i,j;
for(i=0;i<1;i++)
for(j=0;j<124;j++)
;
}
/*---------------------------延時882us子程序-----------------------*/
delay882()
{
uint i,j;
for(i=0;i<1;i++)
for(j=0;j<109;j++)
;
}
/*--------------------------延時2400us程子程序-----------------------*/
delay2400()
{
uint i,j;
for(i=0;i<3;i++)
for(j=0;j<99;j++)
;
}
/*----------------------------------------------------------*/
/*-----------------------紅外解碼程序(核心)-----------------*/
/*----------------------------------------------------------*/
void IR_decode()
{
uchar i,j;
while(IR_RE==0);
delay2400();
if(IR_RE==1) //延時2.4ms后如果是高電平則是新碼
{
delay2400(); //延時4.8ms避開4.5ms的高電平
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR_RE==0); //等待地址碼第1位高電平到來
delay882(); //延時882Us判斷此時引腳電平
///CY=IR_RE;
if(IR_RE==0)
{
date[i]>>=1;
date[i]=date[i]&0x7f;
}
else if(IR_RE==1)
{
delay1000();
date[i]>>=1;
date[i]=date[i]|0x80;
}
} //1位數據接收結束
} //32位二進制碼接收結束
}
}
//////////////////////////////轉換程序結束///////////////////////////
/*------------------------外部中斷0程序-------------------------*/
/*------------------主要用于處理紅外遙控鍵值--------------------*/
void int0() interrupt 0
{
uint i;
for(i=0;i<4;i++)
{
delay1000();
if(IR_RE==1){k=~k;} //剛開始為4.5ms的引導碼,如果4ms內出現高電平則退出解碼程序
}
if(k==0)
{
EX0=0; //檢測到有效信號關中斷,防止干擾
IR_decode();
// d17=0;
//P0=date[2];
delay(4);
}
}
/*---------------------------------------------------------------*/
/* 以下為主程序,主要對LCD初始化,開始界面設置 */
/*---------------------------------------------------------------*/
void main(void)
{
d0=0;
d1=0;
// P0=table[0];
EA=1; //允許外部中斷0,用于檢測紅外遙控器按鍵
EX0=1;
//總中斷開
while(1)
display();
}
////////////數碼管顯示/////////////////
void display()
{
switch(date[3])
{
case 0xe9:a=0;
break;
case 0xf2:a=1;
break;
case 0xe6:a=2;
break;
case 0xe4:a=3;
break;
case 0xfe:a=4;
break;
case 0xee:a=5;
break;
case 0xea:a=6;
break;
case 0xe8:a=7;
break;
case 0xf9:a=8;
break;
case 0xed:a=9;
break;
}
P0=table[a];
EX0=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -