⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 原创ateml avr 单片机遥控器解码程序
💻 C
字号:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//#define IR_VERSION_C
#define	REMOTE_ADDR		0x10
#define	IR_KEY_POWER	0xD0		
#define	IR_KEY_EJ		0x30	

#define BYTE unsigned char
#define uchar unsigned char
#define UIN16 unsigned int
#define TRUE	1
#define BV(bit)				(1<<bit)
#define sbi(sfr,bit)		(sfr |= BV(bit))
#define cbi(sfr,bit)		(sfr &=~BV(bit))
BYTE board_key;
BYTE board_key_f;
BYTE irKeyRpt_f;
BYTE load_sw_f;
BYTE key_in_press_f;
BYTE boardKeyEvent;
BYTE dvdpower_f;
BYTE key_in_press_f;
BYTE ir_ack_f;
#define BOARD_KEY_POWER 1
#define BOARD_KEY_EJ	2
#define BOARD_KEY_DOWN	1
#define BOARD_KEY_UP	2


#define TIME120MS		120
#define	TIME300MS		300
#define TIME1S			1000

#define PORT_A			PORTA
#define PORT_D			PORTD

#define DVD_POWER_ON	0x20
#define DVD_POWER_OFF	0

#define DVDPowOn()				sbi(PORT_A,PA5);dvdpower_f=DVD_POWER_ON
#define DVDPowOff()				cbi(PORT_A,PA5);dvdpower_f=DVD_POWER_OFF

#define KEY_POW_H		0x02
#define KEY_EJ_H		0x04
#define EJ_SW_M_H		0x40
#define LOAD_SW_M_H		0x80
#define IR_ACK_H		0x40
//#define key_pow			PINA&(PA1<<1)//PORT_A&KEY_POW_H

#define key_pow			(bit_is_set(PINA,PA1))//PINA&(1<<PA1)//PORT_A&KEY_POW_H
#define key_ej			(bit_is_set(PINA,PA2))//PINA&(1<<PA2)//PORT_A&KEY_EJ_H
#define ej_sw_m			(bit_is_set(PINA,PA6))//PINA&(1<<PA6)//PORT_A&EJ_SW_M_H
#define load_sw_m		(bit_is_set(PINA,PA7))//PINA&(1<<PA7)//PORT_A&LOAD_SW_M_H
#define ir_ack			(bit_is_set(PIND,PD6))//PIND&(1<<PD6)//PORT_D&IR_ACK_H

#define key_pow_l		(bit_is_clear(PINA,PA1))//PINA&(1<<PA1)//PORT_A&KEY_POW_H
#define key_ej_l		(bit_is_clear(PINA,PA2))//PINA&(1<<PA2)//PORT_A&KEY_EJ_H
#define ej_sw_m_l		(bit_is_clear(PINA,PA6))//PINA&(1<<PA6)//PORT_A&EJ_SW_M_H
#define load_sw_m_l		(bit_is_clear(PINA,PA7))//PINA&(1<<PA7)//PORT_A&LOAD_SW_M_H
#define ir_ack_l		(bit_is_clear(PIND,PD6))//PIND&(1<<PD6)//PORT_D&IR_ACK_H

#define DISC_IN			EJ_SW_M_H
#define DISC_OUT		0
#define	KEY_POW_DOWN	0
#define	KEY_POW_UP		KEY_POW_H
#define	KEY_EJ_DOWN		0
#define	KEY_EJ_UP		KEY_EJ_H

#define SetKeyPowInPut()		cbi(DDRA,DDA1)			//电源按键所使用的IO口设为输入
#define SetKeyEJInPut()			cbi(DDRA,DDA2)			//出入碟按键所使用的IO口设为输入
#define SetDVDPowOutPut()		sbi(DDRA,DDA4)			//伺服电源控制所使用的IO口设为输出
#define Set_EJ_SW_M_InPut()		cbi(DDRA,DDA6)			//出入开关所使用的IO口设为输入
#define Set_LOAD_SW_M_InPut()	cbi(DDRA,DDA7)			//		所使用的IO口设为输入
#define SetIRInPut()			cbi(DDRD,DDD4)			//IR接收所使用的IO口设为输入
#define SetIRAckInPut()			cbi(DDRD,DDD6)			//IR接收检测口所使用的IO口设为输入
#define SetIRAckInPut1()			cbi(DDRD,DDD5)			//IR接收检测口所使用的IO口设为输入



void test();

#include <SendIRCode.C>
#include <remote.c>

void BoardKeyDetect(void);
void delay_ms(unsigned int t)
{
	while (t)
	{
		_delay_ms(1);
		t--;
	}
}

void test(void)
{
//	while(1)
	{
		DVDPowOn();
		delay_ms(1);
		DVDPowOff();
		delay_ms(1);
	}
}
void SendIRCode(BYTE irCode)
{
	ir_ack_f=ir_ack;
//	while(ir_ack_f==ir_ack)
	{					
		SendIRCodeStart(irCode);
		delay_ms(TIME300MS);
	}
}
void RemoteInit(void)
{
	SetKeyPowInPut();
	SetKeyEJInPut();
	SetDVDPowOutPut();
	Set_EJ_SW_M_InPut();
	Set_LOAD_SW_M_InPut();
	SetIRInPut();
	SetIRAckInPut();
	SetIRAckInPut1();
	TCCR1A=0x00;
//	TCCR1B=0x05;
	TCNT1=TCNT1_VAL;
	sbi(TIMSK,TICIE1);
//	sbi(TIMSK,OCIE1A);
//	sbi(TIMSK,OCIE1B);
	sbi(TIMSK,TOIE1);
//		TCCR1B = 0;						//stop/............................................................
//	TCNT1  = TCNT1_VAL;				//初始化计数器值
	TCCR1B = (1<<ICNC1)|(1<<CS12)|(1<<CS10);	//输入捕捉噪声抑制,下降沿触发,1024分频,普通模式(WGM=0)
//	sbi(TIFR,ICF1);
//	sbi(TIFR,OCF1A);
//	sbi(TIFR,OCF1B);
//	sbi(TIFR,TOV1);


	DVDPowOff();
	irKeyRptTimes=0;
	irKeyRpt_f=0;
	irKeyEvent=0;
	irState=0;
	icrPrevious=TCNT1_VAL;
	boardKeyEvent=0;
}

int main(void)
{
	cli();
	TIMER0Init();
	RemoteInit();	
	sei();
	for (;;)
	{
		BoardKeyDetect();
		if(boardKeyEvent==BOARD_KEY_UP)
		{			
			//test();
			boardKeyEvent=0;
			if(board_key==BOARD_KEY_POWER)
			{
				if(dvdpower_f==DVD_POWER_OFF)
				{
					DVDPowOn();
				}
				else
				{
					SendIRCode(IR_KEY_POWER);
					SendIRCodeStop();
					delay_ms(TIME300MS);
					DVDPowOff();
				}
			}
			else// if(board_key==BOARD_KEY_EJ)
			{
				if(ej_sw_m!=DISC_OUT)
				{
					if(dvdpower_f==DVD_POWER_OFF)
					{
						DVDPowOn();
						delay_ms(TIME300MS);
						SendIRCode(IR_KEY_EJ);
						SendIRCodeStop();
						delay_ms(TIME300MS);
						DVDPowOff();
					}
					else
					{
						SendIRCode(IR_KEY_EJ);
						SendIRCodeStop();
					}
				}
			}
		}
		ir_thread();
	}
}
void ir_key_up(void)
{	
	if(irKeyRpt_f)
	{	
		if(irCode!=IR_KEY_POWER&&irCode!=IR_KEY_EJ)
		{
			SendIRCodeStop();
		}
	}
	else 
	{
		if(irCode==IR_KEY_POWER)
		{
			if(dvdpower_f==DVD_POWER_OFF)
			{
				DVDPowOn();
			}
			else
			{
				SendIRCode(IR_KEY_POWER);
				SendIRCodeStop();
				delay_ms(TIME120MS);
				DVDPowOff();
			}
		}
		else //if(irCode==IR_KEY_EJ)
		{
			if(ej_sw_m!=DISC_OUT)
			{			
				if(dvdpower_f==DVD_POWER_OFF)
				{
					DVDPowOn();
					delay_ms(TIME300MS);
					SendIRCode(IR_KEY_EJ);
					SendIRCodeStop();
					delay_ms(TIME300MS);
					DVDPowOff();
				}
				else
				{
					SendIRCodeStop();
				}
			}
		}		
		if(dvdpower_f==DVD_POWER_OFF)				
		{
			if(load_sw_f!=load_sw_m)
			{
				if(load_sw_f==0)
				{
					DVDPowOn();
				}
				load_sw_f=load_sw_m;
			}	
			
		}
	}
}
void ir_key_down(void)
{
	if(irCode!=IR_KEY_POWER&&irCode!=IR_KEY_EJ)
		SendIRCodeStart(irCode);
	else if(irCode==IR_KEY_EJ&&dvdpower_f==DVD_POWER_ON)
	{
		if(ej_sw_m!=DISC_OUT)
			SendIRCodeStart(irCode);
	}			
}
//ir消息线程,判断当前ir状态
void ir_thread(void)
{
	switch(irKeyEvent)
	{
		case _IR_KEY_UP:
			ir_key_up();
			break;
		case _IR_KEY_DOWN:
			ir_key_down();
			break;
	}
	irKeyEvent=0;
}
//检测面板按键按下
void BoardKeyDetect(void) 
{
	UIN16 counttemp;
	if(key_pow_l)
	{
		delay_ms(1);
		if(key_pow_l)
		{
			boardKeyEvent=BOARD_KEY_DOWN;
			SendIRCodeStop();					//有按键时停止发送遥控码
			counttemp=TIME1S;
			while(key_pow_l&&counttemp--)
			{
					delay_ms(1);
			}
			if(key_pow_l)
				while(key_pow_l);
			else
			{
				board_key=BOARD_KEY_POWER;
				boardKeyEvent=BOARD_KEY_UP;
			}
		}
	}
	else if(key_ej_l)
	{
		delay_ms(1);
		if(key_ej_l)
		{
			boardKeyEvent=BOARD_KEY_DOWN;
			SendIRCodeStop();					//有按键时停止发送遥控码
			counttemp=TIME1S;
			while(key_ej_l)
			{
				delay_ms(counttemp--);
			}
			if(key_ej_l)
				while(key_ej_l);
			else
			{
				board_key=BOARD_KEY_EJ;
				boardKeyEvent=BOARD_KEY_UP;
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -