#include "stm32f10x.h" // Device header
#define REMOTE_ID 0
void Remote_Init(void);
u8 Remote_Scan(void);
void Remote_Init(void)
{
RCC->APB2ENR |= 0x00000010; //PORTC clock
GPIOC->CRH &= 0x00000000;
GPIOC->CRH |= 0x00330000;
GPIOC->ODR &= ~(1 << 13);
RCC->APB1ENR |= 1 << 2; //TIM4 clock
RCC->APB2ENR |= 1 << 3; //PORTB clock
GPIOB->CRH &= 0XFFFFFF0F;
GPIOB->CRH |= 0X00000080; // PB9 ir led giriş
GPIOB->ODR |= 1 << 9; //PB9
TIM4->ARR = 10000; //10ms
TIM4->PSC = 71; //1us
TIM4->CCMR2 |= 1 << 8; //CC4S=01
TIM4->CCMR2 |= 3 << 12; //IC4F=0011
TIM4->CCMR2 |= 0 << 10; //IC4PS=00
TIM4->CCR4 = 0;
TIM4->CCER |= 0 << 13; //CC4P=0
TIM4->CCER |= 1 << 12; //CC4E=1
TIM4->DIER |= 1 << 4; //CC4IE
TIM4->DIER |= 1 << 0;
NVIC->ISER[0] |= 1 << 30;
TIM4->CR1 |= 0x01;
}
u8 RmtSta = 0;
u16 Dval;
u32 RmtRec = 0;
u8 RmtCnt = 0;
void TIM4_IRQHandler(void)
{
u16 tsr;
tsr = TIM4->SR;
if (tsr & 0X01)
{
if (RmtSta & 0x80)
{
RmtSta &= ~0X10;
if ((RmtSta & 0X0F) == 0X00)RmtSta |= 1 << 6;
if ((RmtSta & 0X0F) < 14)RmtSta++;
else
{
RmtSta &= ~(1 << 7);
RmtSta &= 0XF0;
}
}
}
if (tsr & 0x10)
{
if (GPIOB->IDR & 0x200)
{
TIM4->CCER |= 1 << 13;
TIM4->CNT = 0;
RmtSta |= 0X10;
} else
{
Dval = TIM4->CCR4;
TIM4->CCER &= ~(1 << 13);
if (RmtSta & 0X10)
{
if (RmtSta & 0X80)
{
if (Dval > 300 && Dval < 800)
{
RmtRec <<= 1;
RmtRec |= 0;
} else if (Dval > 1400 && Dval < 1800)
{
RmtRec <<= 1;
RmtRec |= 1;
} else if (Dval > 2200 && Dval < 2600)
{
RmtCnt++;
RmtSta &= 0XF0;
}
} else if (Dval > 4200 && Dval < 4700)
{
RmtSta |= 1 << 7;
RmtCnt = 0;
}
}
RmtSta &= ~(1 << 4);
}
}
TIM4->SR = 0;
}
u8 Remote_Scan(void)
{
static u8 sta = 0;
static u8 t1, t2;
if (RmtSta & (1 << 6))
{
t1 = RmtRec >> 24;
t2 = (RmtRec >> 16) & 0xff;
// if ((t1 == (u8)~t2) || t1 == REMOTE_ID)
if(1)
{
t1 = RmtRec >> 8;
t2 = RmtRec;
if (t1 == (u8)~t2)
sta = t1;
}
if ((sta == 0) || ((RmtSta & 0X80) == 0))
{
RmtSta &= ~(1 << 6);
RmtCnt = 0;
}
}
return sta;
}
u8 key;
char *str;
int main()
{
Remote_Init();
while (1)
{
key = Remote_Scan();
if (key)
{
switch (key)
{
case 88:
{
GPIOC->ODR &= ~(1 << 13);
str = "Led Yandi";
}
break;
case 18:
{
GPIOC->ODR |= (1 << 13);
str = " Led Sondu";
}
break;
case 224:
{
str = "RIGHT";
}
break;
case 226:
{
str = "LEFT";
}
break;
case 42:
{
str = "PLAY";
}
break;
case 19:
{
str = "RIGHT";
}
break;
case 168:
{
str = "LEFT";
}
break;
case 10:
{
str = "DOWN";
}
break;
case 72:
{
str = "VOL-";
}
break;
case 136:
{
str = "VOL+";
}
break;
case 50:
{
str = "1";
}
break;
case 112:
{
str = "2";
}
break;
case 176:
{
str = "3";
}
break;
case 210:
{
str = "4";
}
break;
case 242:
{
str = "5";
}
break;
case 144:
{
str = "6";
}
break;
case 60:
{
str = "7";
}
break;
default:
str = "0";
break;
}
}
}
}