📄 decode.c
字号:
//====================================================================================
//文 件 名: Decode.c
//功能描述: 红外接收头的遥控器接收译码程序
//维护记录: 2006年6月16 by hongyan.Feng
//====================================================================================
#include "SPCE061A.h"
unsigned int STime=0x0100; //定义起始位的低电平持续时间//0x00f5
unsigned int HLTime=0x0028; //定义高电平(其实是逻辑1)的持续时间//0x0020
unsigned int iData=0x0080; //锁存I/O口读到的数据
unsigned int iCounter=0; //用来计数
//====================================================================================
//语法格式: void RN_Initial(void)
//功能描述: 红外接收头的端口初始化函数
//入口参数: 无
//出口参数: 无
//维护记录: 2006年6月26 by hongyan.Feng
//====================================================================================
void RN_Initial(void)
{
*P_IOA_Dir = 0xff00; //初始化IOA7为带上拉电阻的输入口(红外接收头的数据输入口)
*P_IOA_Attrib = 0xff00;
*P_IOA_Data = 0x0080;
}
//====================================================================================
//语法格式: unsigned int Decode(void)
//功能描述: 红外接收头的遥控器译码函数
//入口参数: 无
//出口参数: 译码后数据
//维护记录: 2006年6月26 by hongyan.Feng
//====================================================================================
unsigned int Decode(void)
{
unsigned int iCode=0; //用来存储译码
unsigned int Flag,i,SFlag=0;
unsigned int j;
unsigned int iTest[8]; //存储各个码读到的高电平持续时间,以便译码
Flag = 0;
i = 0;
iCode = 0;
*P_TimerA_Ctrl = 0x0000; //TimerA的频率设置为fosc/2
*P_TimerA_Data = 0xFEB4; //设置38KHz的计数频率
*P_INT_Ctrl = 0x1000; //允许IRQ1中断
__asm("INT IRQ"); //开IRQ中断
while(iData==0x0080) //如果读到IOA8口的值为1,循环读IOA8口的值,等待起始标志到来。----没有信号时HS0038输出高电平
{
*P_Watchdog_Clear = 0x0001;
}
iCounter = 0;
while(iData==0) //读低电平
{
*P_Watchdog_Clear = 0x0001;
}
if(iCounter>STime) //判断读到的低电平是否为起始标志----根据观察波形,这个起始位的持续时间是15ms(38*15/2)
{
SFlag = 1; //如果是,起始标志置1
iCounter = 0;
}
while(SFlag == 1) //读数据----主要是读8位码高电平的持续时间
{
while(iData==0x0000) //如果读到是低电平,等待高电平到来
*P_Watchdog_Clear = 0x0001;
iCounter = 0;
while(iData==0x0080) //读到高电平,循环等待下跳沿的到来
{
*P_Watchdog_Clear = 0x0001;
}
iTest[i] = iCounter; //下跳沿到来,保存高电平持续时间
i++;
if(i>7) //判断8位是否已经读完
{
SFlag = 0; //已经读完,清起始标志,以便下一次读取
i = 0;
}
}
if(iTest[0]>HLTime) //先译第一位码
iCode |= 1;
for(j=1;j<8;j++) //译剩余7位码
{
if(iTest[j]>HLTime) //1的译码,这个HLTime可以通过示波器观察得到,需要一定的余量
{
iCode = iCode<<1;
iCode |= 1;
}
else //0的译码
{
iCode = iCode<<1;
iCode |= 0;
}
*P_Watchdog_Clear = 0x0001;
}
iCode &= 0x00ff; //取得最终的译码值
*P_Watchdog_Clear = 0x0001;
return iCode;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -