main :p@H
_?<Y>B, E
#include "led.h" vE/g{~[5
#include "delay.h" #b\&Md|;
#include "key.h" ;y<)RM
#include "sys.h" Hb'fEo r
#include "lcd.h" o_/C9[:
#include "usart.h"
Y<TlvB)w
#include "remote.h" heoOOP(#
}<7Dyn,
ac>}$Uw)
int main(void) I9*o[Jp5
{ Fp4?/-]
u8 key; Q_QmyD~m
u8 t=0; @iB**zR/
u8 *str=0; Na: M1Uhb
]_I<-}?;
delay_init(); //延时函数初始化 /b6Y~YbgU
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 S<Q8kW:
uart_init(9600); //串口初始化为9600 j>gO]*BX~
LED_Init(); //LED端口初始化 (ii 5p nq
LCD_Init(); dgd&ymRm
:
KEY_Init(); v}A] R9TY
Remote_Init(); //红外接收初始化 Noz+\O\
2#_9x7g+
POINT_COLOR=RED;//设置字体为红色 ~6U@*Svk
LCD_ShowString(60,50,200,16,16,"WarShip STM32"); S1uW`zQ!+_
LCD_ShowString(60,70,200,16,16,"REMOTE TEST"); E#Ynn6
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK"); 0K>rc1dy
LCD_ShowString(60,110,200,16,16,"2012/9/12"); QNFA#`H
G39H@@ *O0
LCD_ShowString(60,130,200,16,16,"KEYVAL:"); WzgzI/
LCD_ShowString(60,150,200,16,16,"KEYCNT:"); ^i&Qr+v
LCD_ShowString(60,170,200,16,16,"SYMBOL:"); .6!]RA5!=
q9pBS1Ej
while(1) ;w4rwL
{ rsBF\(3b~
key=Remote_Scan(); ]@l~z0^|[_
if(key) SZg+5MD;X
{ iJ42` 51
LCD_ShowNum(116,130,key,3,16); //显示键值 N\H{p%8
LCD_ShowNum(116,150,RmtCnt,3,16); //显示按键次数 \s&w0V`Y
switch(key) h 7kyz
{ Bx
E1Ky8@A
case 0:str="ERROR";break; lO%Z4V_Mj
case 162:str="POWER";break; pX6T7
case 98:str="UP";break; IaE};8a8
case 2:str="PLAY";break; b9EJLD
case 226:str="ALIENTEK";break; `h$6MFC/g
case 194:str="RIGHT";break; i3: sV 5
case 34:str="LEFT";break; }n=Tw92g
case 224:str="VOL-";break; \ :})R{
case 168:str="DOWN";break; Y~=5umNSX
case 144:str="VOL+";break; [KWF7GQi
case 104:str="1";break; fouy??
case 152:str="2";break; S7aS Ut!
case 176:str="3";break; wX#\\Jgi
case 48:str="4";break; ] 5P{*
case 24:str="5";break; Ze WHSU
case 122:str="6";break; 8i-?\VZD
case 16:str="7";break; QI=SR
case 56:str="8";break; 'P@a_*I
case 90:str="9";break; t8GJ;
case 66:str="0";break; `<HY$PAe
case 82:str="DELETE";break; .%->
} U@& <5'
LCD_Fill(116,170,116+8*8,170+16,WHITE); //清楚之前的显示 HxZ4t
LCD_ShowString(116,170,200,16,16,str); //显示SYMBOL _I{&5V~z
}else delay_ms(10); xO1d^{~^^
t++; e-qr d
if(t==20) pe,c
{ DX$`\PA
t=0; 6ap,XFRMh
LED0=!LED0; Z|8f7@k{|+
} \vQ_:-A
} JB%6G|Z
} _nx|ZJ
9%zR?u
hardware P]y2W#Rs
D>G&aQ
#include "remote.h"#include "delay.h" ^~BJu#uVyy
#include "usart.h"////////////////////////////////////////////////////////////////////////////////// M?nnpO
////////////////////////////////////////////////////////////////////////////////// t"0~2R6i
vZ]gb$
B]*&lRR
//红外遥控初始化//设置IO以及定时器4的输入捕获 2"__jp:(
void Remote_Init(void) { ,nHz~Xi1t
GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; WM@uxe,
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; `=-}S+
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能PORTB时钟 ;F5B)&/B
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //TIM4 时钟使能 *D<sk7
0-|1}/{4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PB9 输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入 ppV\FQ{K
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); HNh=igu
GPIO_SetBits(GPIOB,GPIO_Pin_9); //初始化GPIOB.9 ;V@}
oD+
TIM_TimeBaseStructure.TIM_Period = 10000; //设定计数器自动重装值 最大10ms溢出 l}O`cC
TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //预分频器,1M的计数频率,1us加1. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim i"e)LJz
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 `J-"S<c?_
[dzb{M6_
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx 'HqAm$V+
1H[lf
B
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; // 选择输入端 IC4映射到TI4上 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获 J25>t^
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 *=2jteG=3.
TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011 配置输入滤波器 8个定时器时钟周期滤波 TIM_ICInit(TIM4, &TIM_ICInitStructure);//初始化定时器输入捕获通道 ;<&s_C3
v>nJy~O]
TIM_Cmd(TIM4,ENABLE ); //使能定时器4 o9~qJnB/O
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级0级 ?QuFRl,ZJ
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 1:>RQPXcWv
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 *Lh0E/5
e<C5}#wt
TIM_ITConfig( TIM4,TIM_IT_Update|TIM_IT_CC4,ENABLE);//允许更新中断 ,允许CC4IE捕获中断 } qp{NRNkQ
cnIy*!cJs
//遥控器接收状态//[7]:收到了引导码标志 5#d(_
//[6]:得到了一个按键的所有信息//[5]:保留 9CN /v
//[4]:标记上升沿是否已经被捕获 //[3:0]:溢出计时器 v5 9>
u8 RmtSta=0; u16 Dval; //下降沿时计数器的值 ]&r/H17
u32 RmtRec=0; //红外接收到的数据 u8 RmtCnt=0; //按键按下的次数 ($cu!$lY~
//定时器2中断服务程序 void TIM4_IRQHandler(void) yNDyh
{ if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET) ,LMme}FFeb
{ if(RmtSta&0x80)//上次有数据被接收到了 3p^WTQ>(
{ RmtSta&=~0X10; //取消上升沿已经被捕获标记 K^w9@&