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

📄 main.c

📁 无线射频程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************/
/*                                                         */
/*                                                         */
/*                                                         */
/*                                                         */
/*                                                         */
/*                                                         */
/***********************************************************/
#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 + -