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

📄 red.h

📁 基于stm32的MP3播放器
💻 H
字号:
#ifndef __RED_H
#define __RED_H 
//红外接收相关定义
//使用外部delay_us()函数		    
//正点原子@SCUT
//2008/12/14 
//V1.0 

//注意有些地方还是需要手工修改GPIO的配置!
#define RED_PIN  13     //红外输入引脚
#define RED_PORT GPIOC	//输入GPIOx

//红外数据输入脚 
#define RDATA RED_PORT->IDR&(1<<RED_PIN) 
 							  
u32 order=0;   //命令暂存处
u8 times=0;    //按键次数,此次按下键的次数
u8 READY=0;    //红外接收到数据    

//红外中断优先级管理/开启
//当输入的IO口改变时,这个里面的值也要响应改变	   
void NVIC_REDConfiguration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	//存储器映射,不用理    
#ifdef  VECT_TAB_RAM  									   
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else   							 
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif  				  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//优先级分到第0组 总共5组
  	/* Enable the EXTI15_10 Interrupt */
  	NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQChannel; //使用外部中断10-15
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//阶级1
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		 //阶层0
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  	NVIC_Init(&NVIC_InitStructure); 								 
}   
//初始化红外接收引脚的设置
//开启中断,并映射 
void red_init(void)
{
	NVIC_REDConfiguration();  //中断配置
	//注意,时钟使能之后,对GPIO的操作才有效
	//所以上拉之前,必须使能时钟.才能实现真正的上拉输出

	//此部分需手动修改IO口设置
	RCC->APB2ENR|=1<<4;       //PC时钟使能
  	
	RED_PORT->CRH&=0XFF0FFFFF;
	RED_PORT->CRH|=0X00800000;//PC.13输入	 
	RED_PORT->ODR|=1<<RED_PIN;//PC.13上拉   
	RCC->APB2ENR|=0x01;       //使能io复用时钟
	AFIO->EXTICR[3]|=0X20;    //EXTI8映射到PC.13
	
	//自动设置
	EXTI->IMR =1<<RED_PIN;//开启line RED_PIN上的中断
	EXTI->EMR =1<<RED_PIN;//不屏蔽line RED_PIN上的事件
	EXTI->FTSR=1<<RED_PIN;//line RED_PIN上事件下降沿触发
}   

//检测脉冲长短
u8 check(void)
{
    u8 t=0;	 
    while(RDATA)
    {	 
		t++;delay_us(20);					 
        if(t==250)return t; //超时溢出
    }
    return t;
}
//处理红外接收  
/*-------------------------协议--------------------------
开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
接着是发送4个8位二进制码,第一二个是遥控识别码(16),第一个为
正码(16),第二个为反码(239),接着两个数据是键值,第一个为正码
第二个为反码.发送完后40ms,遥控再发送一个9ms低,2ms高的脉冲,
表示按键的次数,出现一次则证明只按下了一次,如果出现多次,则可
以认为是持续按下该键.
---------------------------------------------------------*/		 
//外部中断服务程序	   
void EXTI15_10_IRQHandler(void)
{       
	u8 res=0;
    u8 OK=0; 
    u8 RODATA=0;   		 
	while(1)
    {        
        if(RDATA)//有高脉冲出现
        {
            res=check();//获得此次高脉冲宽度       
            if(res==250)break;//非有用信号
            if(res>=200&&res<250)OK=1; //获得前导位(4.5ms)
            else if(res>=85&&res<200)  //按键次数加一(2ms)
            {  							    		 
                READY=1;//接受到数据
                times++;//按键次数增加
                break;
            }
            else if(res>=50&&res<85)RODATA=1;//1.5ms
            else if(res>=10&&res<50)RODATA=0;//500us
            if(OK)
            {
                order<<=1;
                order+=RODATA; 
                times=0; //按键次数清零
            }   
        }			 						 
    } 						 
		    
	EXTI->PR=1<<13;      //清除中断标志位        
}  

//处理红外键盘
//返回相应的键值
u8 key_process(void)
{               
    u8 t1,t2;   
    t1=order>>24; //红外解码
    t2=(order>>16)&0xff; 
    READY=0;//清除标记 		      
    if(t1==(u8)~t2&&t1==16)//遥控识别码16(00010000)  
    { 
        t1=order>>8;
        t2=order; 				  				   
        if(t1==(u8)~t2)return t1; //处理键值  
    }     
    return 0;
}   	
#endif







	

⌨️ 快捷键说明

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