国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品
電子工程網
標題:
分享STM32 紅外解碼電視遙控器程序
[打印本頁]
作者:
愛好單片機
時間:
2012-11-20 13:52
標題:
分享STM32 紅外解碼電視遙控器程序
/**********************************************************************************
* STM32F103VET6 紅外驅動【遙控器解碼實驗程序】
*
* 遙控器 :42位編碼
*
***********************************************************************************/
#include "stm32f10x.h"
#include "exti.h"
#include "beep.h"
#include "SysTick.h"
#define LED1_0 GPIOD->BRR = 0x00000100 //LED低電平
#define LED2_0 GPIOD->BRR = 0x00000200
#define LED3_0 GPIOD->BRR = 0x00000400
#define LED4_0 GPIOD->BRR = 0x00000800
#define LED1_1 GPIOD->BSRR = 0x00000100 //LED高電平
#define LED2_1 GPIOD->BSRR = 0x00000200
#define LED3_1 GPIOD->BSRR = 0x00000400
#define LED4_1 GPIOD->BSRR = 0x00000800
#define IR_Hongwai_0 GPIOE->BRR = 0x00000004 //紅外數據低電平
#define IR_Hongwai_1 GPIOE->BSRR = 0x00000004 //紅外數據高電平
#define IR_Hongwai_x GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) //讀取紅外電平狀態
unsigned char TimeByte;
unsigned int IR_Tireafg[4];
unsigned int IR_xidwrit[8] = {0, 0, 0, 0, 0, 0 ,0, 0};
/*
* GPIO端口配置子函數
*/
void GPIO_InitStructReadtempCmd(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; //配置GPIO管腳
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //配置管腳為輸入上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //配置管腳速率50MHZ
GPIO_Init(GPIOE, &GPIO_InitStruct); //初始化指定端口
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //配置管腳陪推挽式輸出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStruct);
}
/*
* 配置外設時鐘子函數
*/
void RCC_APB2PeriphReadtempyCmd(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打開GPIOB外設時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //打開GPIOE外設時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //打開GPIOD外設時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); //打開AFIO復用功能外設時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
}
/*
* 計算低脈寬持續時間Count1 * 10us
*/
unsigned int IR_HongwaiRead_LSB_Cmd()
{
unsigned int Count1 = 0; //定義時間變量
IR_Hongwai_0; //紅外數據低電平
do //進入循環體
{
Count1++; //時間變量加1
Delay_10us(1); //延時10us
} while(IR_Hongwai_x == 0); //判斷條件如果讀出來的紅外數據為高電平跳出循環體
return(Count1); //返回時間變量積數
}
/*
* 計算高脈寬持續時間Count2 * 10us
*/
unsigned int IR_HongwaiRead_MSB_Cmd()
{
unsigned int Count2 = 0; //定義時間變量
IR_Hongwai_1; //紅外數據高電平
do //進入循環體
{
Count2++; //時間變量加1
Delay_10us(1); //延時10us
} while(IR_Hongwai_x == 1); //判斷條件如果讀出來的紅外數據為低電平跳出循環體
return(Count2);
}
/*
* 函數主體
*/
int main(void)
{
SystemInit(); //初始化系統時鐘進入72M主頻
SYSTICK_InitStructReadTCmd(); //初始化SysTick配置器寄存器
RCC_APB2PeriphReadtempyCmd(); //初始化外設時鐘配置寄存器
GPIO_InitStructReadtempCmd(); //初始化GPIO端口配置寄存器
EXTI_InitStructReadtempCmd(); //初始化EXTI外部線路寄存器
NVIC_InitStructReadtempCmd(); //初始化NVIC中斷配置寄存器
while(1)
{
}
}
/*
* EXTI外部中斷線服務程序
*/
void EXTI2_IRQHandler(void)
{
unsigned char i = 0;
unsigned char flag = 1;
// unsigned char flag1 = 1;
unsigned int Countline2 = 0;
IR_Hongwai_1;
Countline2 = IR_HongwaiRead_LSB_Cmd(); //低電平引導碼 9ms判斷
if((Countline2 < 850) || (Countline2 > 950)) //小于8694us 大于9272us 一直循環否則跳出
{
return;
}
Countline2 = IR_HongwaiRead_MSB_Cmd(); //高電平引導碼 4.5ms判斷
if((Countline2 < 400) || (Countline2 > 450)) //小于4195us 大于4712us 一直循環否則跳出
{
return;
}
TimeByte = 0;
for(i = 1; i < 14; i++)
{
TimeByte = TimeByte >> 1;
Countline2 = IR_HongwaiRead_LSB_Cmd(); //低電平延時0.56 判斷
if((Countline2 < 40) || (Countline2 > 85))//小于425us 大于851us 一直循環否則跳出
{
return;
}
Countline2 = IR_HongwaiRead_MSB_Cmd(); //高電平延時0.56判斷
if((Countline2 < 40) || (Countline2 > 200))//小于425us 大于1793us 一直循環否則跳出
{
return;
}
if( Countline2 > 130) //高電平延時大于1300us寫1否則寫0
{
TimeByte |= 0x80; //寫1
}
}
IR_Tireafg[0] = TimeByte;
TimeByte = 0;
for(i = 14; i < 27; i++)
{
TimeByte = TimeByte >> 1;
Countline2 = IR_HongwaiRead_LSB_Cmd();
if((Countline2 < 40) || (Countline2 > 85))
{
return;
}
Countline2 = IR_HongwaiRead_MSB_Cmd();
if((Countline2 < 40) || (Countline2 > 200))
{
return;
}
if( Countline2 > 130)
{
TimeByte |= 0x80;
}
}
IR_Tireafg[1] = TimeByte;
TimeByte = 0;
for(i = 27; i < 35; i++)
{
TimeByte = TimeByte >> 1;
Countline2 = IR_HongwaiRead_LSB_Cmd();
if((Countline2 < 40) || (Countline2 > 85))
{
return;
}
Countline2 = IR_HongwaiRead_MSB_Cmd();
if((Countline2 < 40) && (Countline2 > 200))
{
return;
}
if( Countline2 > 130)
{
TimeByte |= 0x80;
}
}
IR_Tireafg[2] = TimeByte;
TimeByte = 0;
for(i = 35; i < 43; i++)
{
TimeByte = TimeByte >> 1;
Countline2 = IR_HongwaiRead_LSB_Cmd();
while((Countline2 < 40) || (Countline2 > 85))
{
return;
}
Countline2 = IR_HongwaiRead_MSB_Cmd();
while((Countline2 < 40) || (Countline2 > 200))
{
return;
}
if( Countline2 > 130)
{
TimeByte |= 0x80;
}
}
IR_Tireafg[3] = TimeByte;
//************************判斷用戶正碼和反碼***************************************//
do
{
if(IR_Tireafg[0] == 0x08 & IR_Tireafg[1] == 0xF7 )
{
flag = 0;
}
} while(flag == 1);
//************************判斷按鍵正碼和反碼***************************************//
/* do
{
if(IR_Tireafg[2] == ~IR_Tireafg[3])
{
flag1 = 0;
}
} while(flag1 == 0); */
//************************按下鍵碼對應LED點亮**************************************//
switch (IR_Tireafg[2])
{
case 0x00: //按鍵 0
LED1_1; LED2_0; LED3_0; LED4_0;
break;
case 0x01: //按鍵 1
LED1_0; LED2_1; LED3_0; LED4_0;
break;
case 0x02: //按鍵 2
LED1_0; LED2_0; LED3_1; LED4_0;
break;
case 0x03: //按鍵 3
LED1_0; LED2_0; LED3_0; LED4_1;
break;
case 0x04: //按鍵 4
LED1_0; LED2_0; LED3_1; LED4_0;
break;
case 0x05: //按鍵 5
LED1_0; LED2_1; LED3_0; LED4_0;
break;
case 0x06: //按鍵 6
LED1_1; LED2_0; LED3_0; LED4_0;
break;
case 0x07: //按鍵 7
LED1_1; LED2_0; LED3_1; LED4_0;
break;
case 0x08: //按鍵 8
LED1_0; LED2_0; LED3_0; LED4_0;
break;
case 0x09: //按鍵 9
LED1_0; LED2_1; LED3_0; LED4_1;
break;
case 0x15: //靜音鍵
LED1_0; LED2_1; LED3_1; LED4_0;
break;
case 0x1C: //開機鍵
LED1_1; LED2_0; LED3_0; LED4_1;
break;
case 0x14: //OSD鍵
LED1_1; LED2_1; LED3_0; LED4_0;
break;
case 0x0E: //RECALL鍵
LED1_0; LED2_0; LED3_1; LED4_1;
break;
case 0x19: //SLEEP鍵
LED1_1; LED2_1; LED3_1; LED4_0;
break;
case 0x0A: //A/C鍵
LED1_0; LED2_1; LED3_1; LED4_1;
break;
case 0x0F: //TV/AV鍵
LED1_1; LED2_1; LED3_1; LED4_1;
break;
case 0x13: //PP鍵
LED1_1; LED2_0; LED3_1; LED4_0;
break;
case 0x0C: //GAME鍵
LED1_0; LED2_1; LED3_1; LED4_1;
break;
case 0x1E: //V-鍵
LED1_1; LED2_1; LED3_1; LED4_0;
break;
case 0x1F: //V+鍵
LED1_0; LED2_0; LED3_1; LED4_0;
break;
case 0x1B: //P+鍵
LED1_0; LED2_0; LED3_0; LED4_1;
break;
case 0x1A: //P-鍵
LED1_1; LED2_0; LED3_0; LED4_0;
break;
case 0x10: //MENU鍵
LED1_0; LED2_1; LED3_0; LED4_0;
break;
default : break;
}
// Beep_lookCmd(); //蜂鳴器按鍵音
EXTI_ClearITPendingBit(EXTI_Line2); //清除EXTI2外部線路掛起位
}
/*******************************************END****************************************/
本人以前是搞51單片機的剛接手STM32沒有多久,本人喜歡結交單片機愛好者,共同學習有高手的也可以一起加入,QQ群100626882,我們可以在群里面交流和學習STM32
歡迎光臨 電子工程網 (http://m.qingdxww.cn/)
Powered by Discuz! X3.4
主站蜘蛛池模板:
日本特黄的免费大片视频
|
手机成人在线视频
|
久久只有精品
|
一级毛片韩国
|
欧美一区1区三区3区公司
|
永久黄色免费网站
|
欧美成人三级网站在线观看
|
亚洲欧美日韩激情在线观看
|
国产区香蕉精品系列在线观看不卡
|
91av在线网站
|
成人精品一区二区三区中文字幕
|
黄视频福利
|
亚洲一区免费视频
|
日本高清在线视频www色下载
|
国产精品免费福利
|
fc2ppv在线播放
|
青青网在线视频
|
四虎久久
|
五月天免费在线视频
|
午夜影视网
|
精新精新国产自在现拍欣赏网
|
在线观看亚洲一区
|
久久精品区
|
1000部羞羞视频在线看视频
|
日韩欧美国产亚洲
|
欧美精品一区二区三区视频
|
久久国产一区二区
|
天堂动漫
|
狠狠色丁香
|
亚洲一区 欧美
|
在线观看免费小视频
|
蘑菇午夜三级
|
精品福利在线观看
|
一区二区三区视频在线播放
|
国产xxx护士爽免费看
|
国产做a爰片久久毛片a
|
婷婷丁香色综合狠狠色
|
亚洲欧美日韩不卡一区二区三区
|
亚州激情视频在线播放
|
996热在线视频
|
色综合久久88色综合天天提莫
|