金牌会员
- 积分
- 1824
- 金钱
- 1824
- 注册时间
- 2013-4-13
- 在线时间
- 63 小时
|
发表于 2013-5-4 10:58:42
|
显示全部楼层
红外遥控器发出的就是38k的载波,
红外遥控器4个键值以十进制全部显示在lcd1602上,并附加遥控数码管显示0-9值功能源码:
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
uint8 code word1[]={"IR NUMBER:"};
uint8 word2[]={" "};
uint8 ir_buf[4];//用以缓存ir码值
sbit RS = 1^0 ;
sbit RW = 1^1 ;
sbit EN = 1^5 ;
sbit BUSY = 0^7;
sbit ir_pin=P3^3;
sbit ENLED=P1^4;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
void wait()
{ 0=0XFF;
do{EN=0;RW=1;RS=0;EN=1;}while(BUSY);
EN=0;
}
void w_cmd(uint8 cmd)
{ wait();
EN=0;
RW=0;
RS=0;
 0=cmd;
EN=1;
EN=0;
}
void w_dat(uint8 dat)
{ wait();
EN=0;
RS=1;
RW=0;
 0=dat;
EN=1;
EN=0;
}
void w_string(uint8 add,uint8 *p)
{ w_cmd(add);
while(*p!='\0')
w_dat(*p++);
}
Init_LCD1602()
{
w_cmd(0x38); // 16*2显示,5*7点阵,8位数据接口
w_cmd(0x0C); // 显示器开、光标开、光标允许闪烁
w_cmd(0x06); // 文字不动,光标自动右移。此处只能是0x06!
w_cmd(0x01); // 清屏
}
void EX1_ir() //注意!数字和大写字母不能做函数名
{ IT1=1;//下降沿为触发条件
EX1=1; //中断名称:外部中断
EA=1; //中断总开关
}
uint16 get_low()
{ TH0=0;
TL0=0;
TR0=1;
while(!ir_pin&&(TH0&0X80)==0);
TR0=0;
return(256*TH0+TL0);
}
uint16 get_high()
{ TH0=0;
TL0=0;
TR0=1;
while(ir_pin&&(TH0&0X80)==0);
TR0=0;
return(256*TH0+TL0);
}
void convert_num(uint8 add,uint8 num)
{ w_cmd(add);
w_dat(num/100%10+'0');//将16进制转换成十进制百位
w_dat(num/10%10+'0');//将16进制转换成十进制十位
w_dat(num%10+'0');//将16进制转换成十进制个位,记住转换方法和函数公式
}
/*void convert_bcd(uint8 add,uint8 num)//转换bcd码,仅供参考研究!
{
w_cmd(add);
w_dat(num/16 + '0');
w_dat(num%16 + '0');
} */
void main()
{ Init_LCD1602();
TMOD=0X01;//脉宽计时,必须对相应的定时器定义
EX1_ir();
w_string(0x80,word1);
while(1);
}
ir_interrupt() interrupt 2
{
uint16 temp;
uint8 i,j;
temp = get_low();
if ((temp < 7833) || (temp > 8755)) //引导脉冲低电平8500~9500us
return;
temp = get_high();
if ((temp < 3686) || (temp > 4608)) //引导脉冲高电平4000~5000us
return;
for (i=0; i<4; i++) //4个字节
{
for (j=0; j<8; j++) //每个字节8位
{
temp = get_low();
if ((temp < 184) || (temp > 737)) //200~800us
return;
temp = get_high();
if ((temp < 184) || (temp > 1843)) //200~2000us
return;
ir_buf >>= 1;
if (temp > 1032) //1120us
ir_buf |= 0x80;
}
}
convert_num(0xc0,ir_buf[0]);
convert_num(0xc4,ir_buf[1]);
convert_num(0xc8,ir_buf[2]);
convert_num(0xc8+0x04,ir_buf[3]);
// convert_bcd(0xc8,ir_buf[2]);
ENLED=0;ADDR3=1;ADDR0=1;ADDR1=0;ADDR2=0;
if(ir_buf[2]==22)
 0=0xc0;
if(ir_buf[2]==12)
 0=0Xf9;
if(ir_buf[2]==24)
 0=0xa4;
if(ir_buf[2]==94)
P0=0xb0;
if(ir_buf[2]==8)
P0=0x99;
if(ir_buf[2]==28)
P0=0x92;
if(ir_buf[2]==90)
P0=0x82;
if(ir_buf[2]==66)
P0=0xf8;
if(ir_buf[2]==82)
P0=0x80;
if(ir_buf[2]==74)
P0=0x90;
} |
|