📄 main.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 + -