?? remote.c
字號:
#include "remote.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供學習使用,未經(jīng)作者許可,不得用于其它任何用途
//Mini STM32開發(fā)板
//紅外遙控接收 驅(qū)動代碼
//正點原子@ALIENTEK
//技術(shù)論壇:www.openedv.com
//修改日期:2010/6/17
//版本:V1.0
//版權(quán)所有,盜版必究。
//Copyright(C) 正點原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
u32 Remote_Odr=0; //命令暫存處
u8 Remote_Cnt=0; //按鍵次數(shù),此次按下鍵的次數(shù)
u8 Remote_Rdy=0; //紅外接收到數(shù)據(jù)
//初始化紅外接收引腳的設(shè)置
//開啟中斷,并映射
void Remote_Init(void)
{
RCC->APB2ENR|=1<<2; //PA時鐘使能
GPIOA->CRL&=0XFFFFFF0F;
GPIOA->CRL|=0X00000080; //PA1輸入
GPIOA->ODR|=1<<1; //PA.1上拉
Ex_NVIC_Config(GPIO_A,1,FTIR);//將line1映射到PA.1,下降沿觸發(fā).
MY_NVIC_Init(2,1,EXTI1_IRQChannel,2);
}
//檢測脈沖寬度
//最長脈寬為5ms
//返回值:x,代表脈寬為x*20us(x=1~250);
u8 Pulse_Width_Check(void)
{
u8 t=0;
while(RDATA)
{
t++;delay_us(20);
if(t==250)return t; //超時溢出
}
return t;
}
//處理紅外接收
/*-------------------------協(xié)議--------------------------
開始拉低9ms,接著是一個4.5ms的高脈沖,通知器件開始傳送數(shù)據(jù)了
接著是發(fā)送4個8位二進制碼,第一二個是遙控識別碼(REMOTE_ID),第一個為
正碼(0),第二個為反碼(255),接著兩個數(shù)據(jù)是鍵值,第一個為正碼
第二個為反碼.發(fā)送完后40ms,遙控再發(fā)送一個9ms低,2ms高的脈沖,
表示按鍵的次數(shù),出現(xiàn)一次則證明只按下了一次,如果出現(xiàn)多次,則可
以認為是持續(xù)按下該鍵.
---------------------------------------------------------*/
//外部中斷服務(wù)程序
void EXTI1_IRQHandler(void)
{
u8 res=0;
u8 OK=0;
u8 RODATA=0;
while(1)
{
if(RDATA)//有高脈沖出現(xiàn)
{
res=Pulse_Width_Check();//獲得此次高脈沖寬度
if(res==250)break;//非有用信號
if(res>=200&&res<250)OK=1; //獲得前導(dǎo)位(4.5ms)
else if(res>=85&&res<200) //按鍵次數(shù)加一(2ms)
{
Remote_Rdy=1;//接受到數(shù)據(jù)
Remote_Cnt++;//按鍵次數(shù)增加
break;
}
else if(res>=50&&res<85)RODATA=1;//1.5ms
else if(res>=10&&res<50)RODATA=0;//500us
if(OK)
{
Remote_Odr<<=1;
Remote_Odr+=RODATA;
Remote_Cnt=0; //按鍵次數(shù)清零
}
}
}
EXTI->PR=1<<1; //清除中斷標志位
}
//處理紅外鍵盤
//返回相應(yīng)的鍵值
u8 Remote_Process(void)
{
u8 t1,t2;
t1=Remote_Odr>>24; //得到地址碼
t2=(Remote_Odr>>16)&0xff;//得到地址反碼
Remote_Rdy=0;//清除標記
if(t1==(u8)~t2&&t1==REMOTE_ID)//檢驗遙控識別碼(ID)及地址
{
t1=Remote_Odr>>8;
t2=Remote_Odr;
if(t1==(u8)~t2)return t1; //處理鍵值
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -