本帖最后由 HC6800-ES-V2.0 于 2017-12-29 10:55 编辑
我很久以前才学习红外遥控时,编的程序,可能不是最好的,不过,正好对上你要的功能。
此程序对应硬件如图所示:
/***************************************************************************
程序功能:
1、运行程序,按遥控器按键,在数码管上显示相应的控制码(以16进制显示);
2、对特别的几个键,有相应的现象出现:
(1)电源键,使继电器工作或断开;
(2)静音键,使蜂鸣器响或不响;
(3)快进键让LED灯向右出现一次走马灯现象;
(4)快退键让LED灯向左出现一次走马灯现象;
(5)按0~9,数码管显示所按的键号;
(6)按其它键,不会改变已经按的数字键的显示,表示看电视台开关电源或静音、快进快退,都不会改变台号。
(7)其它键没想好怎么以现有板产生相应功能,所以按下后,没有特别现象,只有显示其控制码。
******************************************************************************/
#include "reg51.h"
#define LED8 P2//LED灯
sbit hwx=P3^3;//红外接收数据引脚
sbit SMG_q = P1^0; //数码管千位
sbit SMG_b = P1^1; //数码管百位
sbit SMG_s = P1^2; //数码管十位
sbit SMG_g = P1^3; //数码管个位
sbit JDQ=P1^4;//继电器
sbit Beep = P1^5 ;//蜂鸣器
code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x8c,0xc6,0xa1,0x86,0x8e}; //共阳数码管段值表
unsigned char ly_disdate[4]={0,0,0,0};
unsigned char ly_lhj[4],i;
bit ly_flag=1;
void display();
void delay(void);
void Delay10ms(unsigned int c)
{
unsigned char a,b;
for(c;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void main(void)
{
EA=1;
EX1=1;
IT1=1;
TMOD=0X10;
JDQ=1;
ly_flag=0;
while(1)
{
if(ly_flag)
{ ly_flag=0;
if ((ly_lhj[2]==0x45))
{
JDQ=~JDQ;
}
if ((ly_lhj[2]==0x47))
{
Beep=~Beep;
}
if ((ly_lhj[2]==0x40))
{
LED8=0xfe;
for(i=0;i<8;i++)
{
Delay10ms(10);
LED8=LED8<<1;
}
LED8=0xff;
}
if ((ly_lhj[2]==0x43))
{
LED8=0x7f;
for(i=0;i<8;i++)
{
Delay10ms(10);
LED8=LED8>>1;
}
LED8=0xff;
}
if ((ly_lhj[2]==0x16))
{
ly_disdate[0]=0;
}
if ((ly_lhj[2]==0x0c))
{
ly_disdate[0]=1;
}
if ((ly_lhj[2]==0x18))
{
ly_disdate[0]=2;
}
if ((ly_lhj[2]==0x5e))
{
ly_disdate[0]=3;
}
if ((ly_lhj[2]==0x08))
{
ly_disdate[0]=4;
}
if ((ly_lhj[2]==0x1c))
{
ly_disdate[0]=5;
}
if ((ly_lhj[2]==0x5a))
{
ly_disdate[0]=6;
}
if ((ly_lhj[2]==0x42))
{
ly_disdate[0]=7;
}
if ((ly_lhj[2]==0x52))
{
ly_disdate[0]=8;
}
if ((ly_lhj[2]==0x4a))
{
ly_disdate[0]=9;
}
ly_disdate[2]=ly_lhj[2]/16;
ly_disdate[3]=ly_lhj[2]%16;
}
display();
}
}
void hongwai(void) interrupt 2
{
unsigned char i,ia;
TL1=0;
TH1=0;
TR1=1;
while(!hwx);
TR1=0;
if(TH1<30||TH1>40)
return;
TH1=0;
TR1=1;
while(hwx)
{
delay();
if(TH1>22)
return;
}
TR1=0;
if(TH1<12)
return;
for(i=0;i<4;i++)
{
for(ia=0;ia<8;ia++)
{
while(!hwx);
TH1=0;
TR1=1;
while(hwx)
{
delay();
if(TH1>15)
return;
}
TR1=0;
ly_lhj>>=1;
if(TH1>4)
ly_lhj|=0x80;
}
}
ly_flag=1;
TF1=0;
}
void display()
{
SMG_q=0;
P0=table[ly_disdate[0]];
delay();
P0=0XFF;
SMG_q=1;
SMG_s=0;
P0=table[ly_disdate[2]];
delay();
P0=0XFF;
SMG_s=1;
SMG_g=0;
P0=table[ly_disdate[3]];
delay();
P0=0XFF;
SMG_g=1;
}
void delay(void)
{
unsigned char i=10;
while(i--);
}
因为当时还没有学习1602,所以是用数码管显示的,你把数码管显示的程序,换上1602的显示程序就可以了。
|