/**************************************************************
File Name: 红外按键
Editor: Electricity Institute Of Hunan City University 朱家林
Edite Time: 2013-07-15
Modifier: 朱家林
Modication Time:
Compiler : AVR Studio4.17
Hardware Platform: Atmega128MCU,8MHZ crystals
Hardware Conection:
Description :
Attention:
**************************************************************/
#include "comm.h"
//***********************************************************************
// 定义变量区
//***********************************************************************
#define delay_us(x) _delay_us(x) //AVR GCC延时函数 x(us)
#define delay_ms(x) _delay_ms(x) //AVR GCC延时函数 x(ms)
#define RED_IN DDRE &= ~(1 << PE1) //设置输入,红外接收头接单片机PE3口
#define RED_OUT DDRE |= (1 << PE1) //设置输出
#define RED_CLR PORTE &= ~(1 << PE1) //置低电平
#define RED_SET PORTE |= (1 << PE1) //置高电平
#define RED_R (PINE & (1 << PE1)) //读电平
#define FMQ_0 PORTD &= ~(1 << PD6) //蜂鸣器所在IO口PD6
#define FMQ_1 PORTD |= (1 << PD6)
uchar IRKEY;
uint temp_value;
uchar code_value=0;
uchar key_code[4];
uchar key_value;
/*****************************************************/
void beep() //产生1KHZ频率声音的函数
{
DDRD=0xff;//设置为输出
FMQ_0;
_delay_us(500);
FMQ_1;
_delay_us(500);
}
void beep1()
{
uint k;
for(k=0;k<20;k++)
{
beep();
}
FMQ_1;
_delay_ms(25);
}
//***********************************************************************
// IO端口初始化
//***********************************************************************
void IRIO_init()
{
DDRE |= 0x02;
RED_SET;
RED_IN;
}
//*************************************************************************
// 遥控器键值赋功能值子程序
//*************************************************************************
void Key_Icode(void)
{
switch(key_code[2])
{
case 0x0C: IRKEY = 1; break;
case 0x18: IRKEY = 2; break;
case 0x5E: IRKEY = 3; break;
case 0x08: IRKEY = 4; break;
case 0x1C: IRKEY = 5; break;
case 0x5A: IRKEY = 6; break;
case 0x42: IRKEY = 7; break;
case 0x52: IRKEY = 8; break;
case 0x4A: IRKEY = 9; break;
case 0x16: IRKEY = '0'; break;
case 0x45: IRKEY = POWER;break;
case 0x47: IRKEY = MENU;break;
case 0x44: IRKEY = TEST;break;
case 0x40: IRKEY = ADD;break;
case 0x43: IRKEY = HOME;break;
case 0x07: IRKEY = BACK;break;
case 0x15: IRKEY = PLAY;break;
case 0x09: IRKEY = FORWARD;break;
case 0x19: IRKEY = DECREASE;break;
case 0x0d: IRKEY = CLEAR;break;
default: IRKEY = 0xFF; break;
}
}
//*************************************************************************
// 遥控器解码子程序
//*************************************************************************
uchar Red_Code()
{
uchar i,j,k = 0;
for(i = 0;i < 19;i++)
{
delay_us(400); //延时400us
if(RED_R) //9ms内有高电平,则判断为干扰,退出处理程序
{
return;
}
}
while(!RED_R); //等待9ms低电平过去
for(i=0;i<5;i++) //是否连发码
{
delay_us(500);
if(!RED_R)
{
return;
}
}
while(RED_R); //等待4.5ms高电平过去
for(i = 0;i < 4;i++) //接收4个字节的数据
{
for(j = 0;j < 8;j++) //每个字节的数据8位
{
while(!RED_R); //等待变高电平
while(RED_R) //计算高电平时间
{
delay_us(100);
k++;
if(k >= 22) //高电平时间过长,则退出处理程序
{
return; //
}
}
code_value>>=1; //接受一位数据
if(k >= 8)
{
code_value|=0x80; //高电平时间大于0.56,则为数据1
}
k = 0; //计时清零
}
key_code[i]=code_value; //四个字节的数据
}
Key_Icode(); //调用赋值函数
//Display_Key(key); //显示按键值
beep1(); //按键声音指示
return IRKEY;
}
/*****************等待按键*****************************/
void waitkey()//waiting for the button press
{
key_value = 0x00;
while(key_value==0x00)
{key_value = Red_Code();}//IRKEY
}
/**************************************************************
File Name: 红外按键
Editor: Electricity Institute Of Hunan City University 朱家林
Edite Time: 2013-07-15
Modifier: 朱家林
Modication Time:
Compiler : AVR Studio4.17
Hardware Platform: Atmega128MCU,8MHZ crystals
Hardware Conection:
Description :
Attention:
**************************************************************/
#include "comm.h"
//***********************************************************************
// 定义变量区
//***********************************************************************
#define delay_us(x) _delay_us(x) //AVR GCC延时函数 x(us)
#define delay_ms(x) _delay_ms(x) //AVR GCC延时函数 x(ms)
#define RED_IN DDRE &= ~(1 << PE1) //设置输入,红外接收头接单片机PE3口
#define RED_OUT DDRE |= (1 << PE1) //设置输出
#define RED_CLR PORTE &= ~(1 << PE1) //置低电平
#define RED_SET PORTE |= (1 << PE1) //置高电平
#define RED_R (PINE & (1 << PE1)) //读电平
#define FMQ_0 PORTD &= ~(1 << PD6) //蜂鸣器所在IO口PD6
#define FMQ_1 PORTD |= (1 << PD6)
uchar IRKEY;
uint temp_value;
uchar code_value=0;
uchar key_code[4];
uchar key_value;
/*****************************************************/
void beep() //产生1KHZ频率声音的函数
{
DDRD=0xff;//设置为输出
FMQ_0;
_delay_us(500);
FMQ_1;
_delay_us(500);
}
void beep1()
{
uint k;
for(k=0;k<20;k++)
{
beep();
}
FMQ_1;
_delay_ms(25);
}
//***********************************************************************
// IO端口初始化
//***********************************************************************
void IRIO_init()
{
DDRE |= 0x02;
RED_SET;
RED_IN;
}
//*************************************************************************
// 遥控器键值赋功能值子程序
//*************************************************************************
void Key_Icode(void)
{
switch(key_code[2])
{
case 0x0C: IRKEY = 1; break;
case 0x18: IRKEY = 2; break;
case 0x5E: IRKEY = 3; break;
case 0x08: IRKEY = 4; break;
case 0x1C: IRKEY = 5; break;
case 0x5A: IRKEY = 6; break;
case 0x42: IRKEY = 7; break;
case 0x52: IRKEY = 8; break;
case 0x4A: IRKEY = 9; break;
case 0x16: IRKEY = '0'; break;
case 0x45: IRKEY = POWER;break;
case 0x47: IRKEY = MENU;break;
case 0x44: IRKEY = TEST;break;
case 0x40: IRKEY = ADD;break;
case 0x43: IRKEY = HOME;break;
case 0x07: IRKEY = BACK;break;
case 0x15: IRKEY = PLAY;break;
case 0x09: IRKEY = FORWARD;break;
case 0x19: IRKEY = DECREASE;break;
case 0x0d: IRKEY = CLEAR;break;
default: IRKEY = 0xFF; break;
}
}
//*************************************************************************
// 遥控器解码子程序
//*************************************************************************
uchar Red_Code()
{
uchar i,j,k = 0;
for(i = 0;i < 19;i++)
{
delay_us(400); //延时400us
if(RED_R) //9ms内有高电平,则判断为干扰,退出处理程序
{
return;
}
}
while(!RED_R); //等待9ms低电平过去
for(i=0;i<5;i++) //是否连发码
{
delay_us(500);
if(!RED_R)
{
return;
}
}
while(RED_R); //等待4.5ms高电平过去
for(i = 0;i < 4;i++) //接收4个字节的数据
{
for(j = 0;j < 8;j++) //每个字节的数据8位
{
while(!RED_R); //等待变高电平
while(RED_R) //计算高电平时间
{
delay_us(100);
k++;
if(k >= 22) //高电平时间过长,则退出处理程序
{
return; //
}
}
code_value>>=1; //接受一位数据
if(k >= 8)
{
code_value|=0x80; //高电平时间大于0.56,则为数据1
}
k = 0; //计时清零
}
key_code[i]=code_value; //四个字节的数据
}
Key_Icode(); //调用赋值函数
//Display_Key(key); //显示按键值
beep1(); //按键声音指示
return IRKEY;
}
/*****************等待按键*****************************/
void waitkey()//waiting for the button press
{
key_value = 0x00;
while(key_value==0x00)
{key_value = Red_Code();}//IRKEY
}
举报