中级会员
 
- 积分
- 467
- 金钱
- 467
- 注册时间
- 2013-7-12
- 在线时间
- 86 小时
|
发表于 2013-7-23 20:13:11
|
显示全部楼层
/*******************************************************************************
function:NCE解码
date :2013.3.9
by :SR_li
********************************************************************************/
#include <reg52.h>
#include"intrins.h"
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/*******************************************************************************
function:端口定义
date :2013.3.9
by :SR_li
********************************************************************************/
sbit signal=P3^2; //红外接收器数据线
sbit indict=P1^0; //调试指示灯
sbit RCK=P1^2; //595数据开关
/*******************************************************************************
function:变量定义
date :2013.3.9
by :SR_li
********************************************************************************/
uchar R_data[7];
/*******************************************************************************
function:子函数
date :2013.3.9
by :SR_li
********************************************************************************/
void delay_ms(uchar x); //x*0.14MS
void waitHL(bit HL); //等待高低电平
uchar getkey(uchar R_data); //识别按键
/*******************************************************************************
function:调用函数
date :2013.3.9
by :SR_li
********************************************************************************/
#include "LCD1602.C"
/*******************************************************************************
function:main函数
date :2013.3.9
by :SR_li
********************************************************************************/
main()
{
TCON=0X03; //外部中断0,低电平触发
IE =0X81; //开中断EA,ET0
IP =0X01; //优先级最高
lcd_intialize();
lcd_disp_num(1,1,1);
while(1);
}
/*******************************************************************************
function:外部中断服务程序
date :2013.3.9
by :SR_li
********************************************************************************/
void exit0() interrupt 0
{
uchar j,k,N=0,q=0;
EX0 = 0; //关中断
delay_ms(15); //15*0.14=2.1ms
if (signal==1)
{ EX0 =1;return;} //确认signal信号出现
waitHL(1); //等signal变为高电平,跳过9ms的前导低电平信号。
waitHL(0); //等 signal 变为低电平,跳过4.5ms的前导高电平信号。
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
waitHL(1); //等 signal 变为高电平
while (signal) //计算signal高电平时长
{
delay_ms(1);
N++;
if (N>=30)
{
EX0=1;
return;
} //0.14ms计数过长自动离开。
} //高电平计数完毕
R_data[j]=R_data[j] >> 1; //数据最高位补“0”
if(N>=8)
R_data[j] = R_data[j] | 0x80; //数据最高位补“1”
N=0;
}
}
if(R_data[2]!=~R_data[3])
{
EX0=1;
return;
}
q=getkey(R_data[3]);
lcd_disp_num(q,4,1);
EX0 = 1;
}
/*******************************************************************************
function:稳定等待
date :2013.3.9
by :SR_li
********************************************************************************/
void delay_ms(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i = 0; i<13; i++);
}
}
/*******************************************************************************
function:等待高低电平
date :2013.3.9
by :SR_li
********************************************************************************/
void waitHL(bit HL)
{
if(HL==1)
{
while (!signal) //等signal变为高电平,跳过9ms的前导低电平信号。
delay_ms(1);
delay_ms(1); //确定信号稳定
}
else
{
while (!signal) //等signal变为高电平,跳过9ms的前导低电平信号。
delay_ms(1);
delay_ms(1); //确定信号稳定
}
}
/*******************************************************************************
function:识别按键
date :2013.3.9
by :SR_li
********************************************************************************/
uchar getkey(uchar R_data)
{
switch(R_data)
{
case 139:return 1;break;
case 141:return 2;break;
case 143:return 3;break;
case 137:return 4;break;
case 129:return 5;break;
case 135:return 6;break;
case 15:return 7;break;
case 43:return 8;break;
case 19:return 9;break;
case 45:return 10;break;
case 51:return 11;break;
case 27:return 12;break;
case 25:return 13;break;
case 49:return 14;break;
case 189:return 15;break;
case 17:return 16;break;
case 57:return 17;break;
case 181:return 18;break;
case 133:return 19;break;
case 165:return 20;break;
case 149:return 21;break;
default:return 20;break;
}
}
/*******************************************************************************
function:end
date :2013.3.9
by :SR_li
********************************************************************************/ |
|