📄 main.c
字号:
/***********************************************************/
/* */
/* */
/* */
/* */
/* */
/* */
/***********************************************************/
#include "common.h"
void PortInit(void)
{
#ifdef SCAN_WIRE_KEYBOARD
DDRB = 0x3F; /* Input(I)/Output(O) status: 0/1*/
/* PB7:OSC2(I), PB6:OSC1(I), PB5:TOUCH_CLK(O), */
/* PB4:TOUCH_DO(O), PB3:TOUCH_DI(O), PB2:TOUCH_nCS(O), */
/* PB1:NC(O), PB0:RTC_nINTB(I) */
PORTB = 0x1F; /* */
PORTC = 0x30; /* Input(I)/Output(O) status: 0/1*/
/* PC7:NC, PC6: reset pin, PC5:SCL(O), */
/* PC4:SDA(O), PC3: SURE(I), PC2:DOWN(I), */
/* PC1:UP(I), PC0: MENU(I) */
DDRC = 0x30; /* */
PORTD = 0x0F; /* Input(I)/Output(O) status: 0/1*/
/* PD7:INT_PIN(O), PD6:POWER_SWITCH(O), PD5:POWRE(I), */
/* PD4:REC(I), PD3:RTC_nINTA(I), PD2:PEN_IRQ(I), */
/* PD1:TXD(O), PD0:RXD(I) */
DDRD = 0xC2; /* */
#else
DDRB = 0x3F; /* Input(I)/Output(O) status: 0/1*/
/* PB7:OSC2(I), PB6:OSC1(I), PB5:TOUCH_CLK(O), */
/* PB4:TOUCH_DO(O), PB3:TOUCH_DI(O), PB2:TOUCH_nCS(O), */
/* PB1:NC(O), PB0:RTC_nINTB(I) */
PORTB = 0x1F; /* */
PORTC = 0x31; /* Input(I)/Output(O) status: 0/1*/
/* PC7:NC, PC6: reset pin, PC5:SCL(O), */
/* PC4:SDA(O), PC3:KEY_X1(I), PC2:KEY_X2(I), */
/* PC1:KEY_X3(I), PC0:KEY_Y1(O) */
DDRC = 0x31; /* */
PORTD = 0x3F; /* Input(I)/Output(O) status: 0/1*/
/* PD7:INT_PIN(O), PD6:POWER_SWITCH(O), PD5:KEY_Y2(O), */
/* PD4:KEY_Y3(O), PD3:RTC_nINTA(I), PD2:PEN_IRQ(I), */
/* PD1:TXD(O), PD0:RXD(I) */
DDRD = 0xF2; /* */
Disable_Key_Y1();
Disable_Key_Y2();
Disable_Key_Y3();
ClosePowerSupply();
#endif
}
void Timer0Init(void) /* 0.8ms modify */
{
TCCR0 = 0x00;
TCNT0 = TIMER0_RELOAD_VALUE;
TCCR0 = 0x03; /* prescale 1/64 */
}
void Timer1Init(void)
{
TCCR1B = 0x00; /* stop */
TCNT1 = TIMER1_RELOAD_VALUE; /* setup */
TCCR1A = 0x00;
TCCR1B = 0x02; /* prescale 1/64 */
}
void TwiInit(void)
{
TWCR = 0x00; //disable twi
TWBR = 0x00; //set bit rate
TWSR = 0x00; //set prescale
TWAR = M8_TWI_ADDRESS;
TWCR = _BV(TWEA) | _BV(TWEN) | _BV(TWIE);
}
void InitKeyValueQueueBuff(void)
{
unsigned char i;
for (i=0; i<MAX_KEYVALUE_BUFF_SIZE; i++)
{
g_ucKeyValueQueueBuff[i] = NO_BUTTON_PUSH_VALUE;
}
}
void InitInternalData(void)
{
g_ucTwi_Tx_Count = 0;
g_ucTwi_Rx_Count = 0;
CLEAR_FLAG(g_ucLockKeyBoard_Byte_Flag);
CLEAR_FLAG(g_ucPowerSwitch_Byte_Flag);
CLEAR_FLAG(g_ucRMTData_Byte_Flag);
CLEAR_FLAG(g_ucISRmtStart_Byte_Flag);
CLEAR_FLAG(g_ucNormal_Byte_Flag);
CLEAR_FLAG(g_ucKeyValueSend_Byte_Flag);
ClearReleaseKeyBoardDelay();
ClearTimer0IRQCount();
ClearKeyValueQueueCount();
ClearKeyValueSendDelay();
ClearRMTDataBuff();
InitKeyValueQueueBuff();
//memset(&g_ucTwi_Rx_Buff, 0xff, MAX_TWI_RX_BUFF_SIZE);
}
void PowerOnInitFunction(void)
{
PortInit();
InitInternalData();
Timer0Init();
Timer1Init();
TwiInit();
InitCheckBuff();
wdt_enable(WDTO_2S);
wdt_reset();
MCUCR = 0x02;
GICR = _BV(INT0); //extended ext ints
TIMSK = (1<<TOIE1);
sei();
}
void delay_800us(uint8_t cnt)
{
Start_800us();
Cnt_t0_800us = 0;
while (Cnt_t0_800us < cnt);
Stop_800us();
}
unsigned char ReadRemoteDataByte(void)
{
unsigned char cnt, rmtcode;
rmtcode = 0;
Start_800us();
Cnt_t0_800us = 0;
while ( (RMT_DATA == _BV(RMT_PING) ) && (Cnt_t0_800us < 6) ) ;
Stop_800us();
if (Cnt_t0_800us == 6)
{
return 0;
}
for (cnt = 0; cnt < 8; cnt++) // RECEIVE 8 BITS
{
rmtcode >>= 1; // ready for LSB mode
Start_800us();
Cnt_t0_800us = 0;
while ((RMT_DATA == 0) && (Cnt_t0_800us < 1));
Stop_800us();
if (Cnt_t0_800us == 1)
{
return 0;
}
delay_800us(1); // DELAY 0.8mS
if (RMT_DATA == _BV(RMT_PING)) // Check '1' time
{
rmtcode |= 0x80;
Start_800us();
Cnt_t0_800us = 0;
while ( (RMT_DATA == _BV(RMT_PING) ) && (Cnt_t0_800us < 3) ) ;
Stop_800us();
if (Cnt_t0_800us == 3)
{
return 0;
}
}
else // Check '0' time
{
rmtcode &= 0x7f;
}
}
return rmtcode;
}
void ReceiveRemoteDataString(void)
{
CLEAR_FLAG(g_ucRMTData_Byte_Flag);
delay_800us(1); // DELAY 0.8mS CHECK SYNCHRONIZATION
if (RMT_DATA == _BV(RMT_PING)) // NOT START FLAGE, maybe disturb
{
return;
}
Start_800us();
Cnt_t0_800us = 0;
while ((RMT_DATA == 0) && (Cnt_t0_800us < 12));
Stop_800us();
if (Cnt_t0_800us == 12)
{
return;
}
delay_800us(3); // DELAY 2.4mS
if (RMT_DATA == 0) // Is stop_bit?
{
Rmt_code[4] += 1; // set flag 0xff for kept depress
}
else // Read remote code
{
Rmt_code[0] = ReadRemoteDataByte(); // READ 'CUSTOM CODE'
Rmt_code[1] = ReadRemoteDataByte(); // READ 'CHECK CUSTOM CODE'
Rmt_code[2] = ReadRemoteDataByte(); // READ 'DATA CODE'
Rmt_code[3] = ReadRemoteDataByte(); // READ 'CHECK DATA CODE'
Rmt_code[4] = 0x00;
SET_FLAG(g_ucRMTData_Byte_Flag);
}
Start_800us();
Cnt_t0_800us = 0;
while ((RMT_DATA == 0) && (Cnt_t0_800us < 1));
Stop_800us();
if (Cnt_t0_800us == 1)
{
return;
}
}
void ClearRMTDataBuff(void)
{
Rmt_code[0] = 0xff;
Rmt_code[1] = 0xff;
Rmt_code[2] = 0xff;
Rmt_code[3] = 0xff;
}
void ProcessRMTData(void)
{
unsigned char tmp_RmtKeyValue;
if (g_ucRMTData_Byte_Flag == BYTE_FLAG_TRUE)
{
if (g_ucLockKeyBoard_Byte_Flag == BYTE_FLAG_FALSE)
{
if ( (Rmt_code[0] == RMT_ID) &&
( (Rmt_code[0] + Rmt_code[1]) == 0xff ) &&
( (Rmt_code[2] + Rmt_code[3]) == 0xff) )
{
tmp_RmtKeyValue = Rmt_code[2];
switch(tmp_RmtKeyValue)
{
case INFRARED_SOUND_ADD_KEYVALUE : AddVaildKeyValueToQueue(IIC_SOUND_ADD_KEYVALUE ); break; //press sound +
case INFRARED_SOUND_DEC_KEYVALUE : AddVaildKeyValueToQueue(IIC_SOUND_DEC_KEYVALUE ); break; //press sound -
case INFRARED_MUTE_KEYVALUE : AddVaildKeyValueToQueue(IIC_MUTE_KEYVALUE ); break; //press no sound
case INFRARED_PLAY_KEYVALUE : AddVaildKeyValueToQueue(IIC_PLAY_KEYVALUE ); break; //press play
case INFRARED_LEFT_ARROW_KEYVALUE : AddVaildKeyValueToQueue(IIC_LEFT_ARROW_KEYVALUE ); break; //press ->
case INFRARED_RIGHT_ARROW_KEYVALUE: AddVaildKeyValueToQueue(IIC_RIGHT_ARROW_KEYVALUE); break; //press <-
case INFRARED_UP_KEYVALUE : AddVaildKeyValueToQueue(IIC_UP_KEYVALUE ); break; //press up
case INFRARED_DOWN_KEYVALUE : AddVaildKeyValueToQueue(IIC_DOWN_KEYVALUE ); break; //press down
case INFRARED_EXIT_KEYVALUE : AddVaildKeyValueToQueue(IIC_EXIT_KEYVALUE ); break; //press exit
case INFRARED_OK_KEYVALUE : AddVaildKeyValueToQueue(IIC_OK_KEYVALUE ); break; //press OK
case INFRARED_BACK_KEYVALUE : AddVaildKeyValueToQueue(IIC_BACK_KEYVALUE ); break; //press 后退
case INFRARED_FRONT_KEYVALUE : AddVaildKeyValueToQueue(IIC_FRONT_KEYVALUE ); break; //press 前进
case INFRARED_MENU_KEYVALUE : AddVaildKeyValueToQueue(IIC_MENU_KEYVALUE ); break; //press MENU
case INFRARED_TV_LCD_KEYVALUE : AddVaildKeyValueToQueue(IIC_TV_LCD_KEYVALUE ); break; //press TV/LCD
case INFRARED_BACKPLAY_KEYVALUE : AddVaildKeyValueToQueue(IIC_BACKPLAY_KEYVALUE ); break; //press 回放键
case INFRARED_ZOOMIN_KEYVALUE : AddVaildKeyValueToQueue(IIC_ZOOMIN_KEYVALUE ); break; //press zoom in 暂时没用
case INFRARED_ZOOMOUT_KEYVALUE : AddVaildKeyValueToQueue(IIC_ZOOMOUT_KEYVALUE ); break; //press zoom out 暂时没用
case INFRARED_POWER_KEYVALUE: //press power switch
{
if (g_ucPowerSwitch_Byte_Flag == BYTE_FLAG_FALSE)
{
SET_FLAG(g_ucLockKeyBoard_Byte_Flag);
OpenPowerSupply();
SET_FLAG(g_ucPowerSwitch_Byte_Flag);
}
else
{
if (g_ucNormal_Byte_Flag == BYTE_FLAG_TRUE)
{
AddVaildKeyValueToQueue(IIC_POWER_KEYVALUE);
}
else
{
SET_FLAG(g_ucLockKeyBoard_Byte_Flag);
ClosePowerSupply();
CLEAR_FLAG(g_ucPowerSwitch_Byte_Flag);
}
}
}
break;
default:
{
CLEAR_FLAG(g_ucLockKeyBoard_Byte_Flag);
}
break;
ClearRMTDataBuff();
/*------------------------------------*/
#ifdef TO_DEBUG
PutChar('9');
PutChar(tmp_RmtKeyValue);
#endif
/*------------------------------------*/
}
}
}
CLEAR_FLAG(g_ucRMTData_Byte_Flag);
}
}
ISR(INT0_vect)
{
GICR &= ~_BV(INT0); /* enable external interrupt 0 */
sei();
SET_FLAG(g_ucISRmtStart_Byte_Flag);
}
ISR(TIMER0_OVF_vect)
{
sei();
TCNT0 = TIMER0_RELOAD_VALUE;
Cnt_t0_800us++;
}
ISR(TIMER1_OVF_vect)
{
sei();
TCNT1 = TIMER1_RELOAD_VALUE;
g_ucTimer0_IRQ_Count++;
if (g_ucLockKeyBoard_Byte_Flag == BYTE_FLAG_TRUE)
{
if (g_ucDelayReleaseKeyBoard++ >= KEYBOARD_INTERVAL_DELAY)
{
ClearReleaseKeyBoardDelay();
CLEAR_FLAG(g_ucLockKeyBoard_Byte_Flag);
}
}
}
ISR(TWI_vect)
{
unsigned char tmp_ucTwi_Status;
tmp_ucTwi_Status = GetTwiStatus();
switch(tmp_ucTwi_Status)
{
case 0x60:
case 0x68:
case 0x70:
case 0x78:
case 0x90:
case 0x98:
SetACK();
break;
case 0xA0:
{
if (g_ucTwi_Rx_Buff[0] == 0x03)
{
if (g_ucTwi_Rx_Buff[1] == 0x00)
{
CLEAR_FLAG(g_ucNormal_Byte_Flag);
CLEAR_FLAG(g_ucPowerSwitch_Byte_Flag);
ClosePowerSupply();
}
else if (g_ucTwi_Rx_Buff[1] == 0x01)
{
SET_FLAG(g_ucNormal_Byte_Flag);
}
}
else if (g_ucTwi_Rx_Buff[0] == 0x00)
{
if (g_ucSpecialCommand_Byte_Flag == BYTE_FLAG_TRUE)
CLEAR_FLAG(g_ucSpecialCommand_Byte_Flag);
}
else if (g_ucTwi_Rx_Buff[0] == 1)
{
if (g_ucTwi_Rx_Buff[1] == 1)
{
PORTB &= ~_BV(RECORD_LED);
}
else
{
PORTB |= _BV(RECORD_LED);
}
}
g_ucTwi_Rx_Count = 0;
}
SetACK();
break;
case 0xA8: /* SLA+R Addressed,write TWDR */
{
if (g_ucTwi_Rx_Buff[0] == 0)
{
if ((g_ucKeyValueQueueCount>0) && (g_ucKeyValueSend_Byte_Flag==BYTE_FLAG_FALSE))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -