📄 红外遥控编码数管显示.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 + -